Skip to content

Instantly share code, notes, and snippets.

@dakeshi
Created June 10, 2016 06:17
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dakeshi/6915b6681cbc29327dcc9b27cef263b8 to your computer and use it in GitHub Desktop.
Save dakeshi/6915b6681cbc29327dcc9b27cef263b8 to your computer and use it in GitHub Desktop.
Use an default WKWebView save all caches, cookies data in the app. So it make very critical issue such as infinite increase app size.
/// In AppDelegate.swift
/// Execute remove webdata method when the app receives the memory warning.
///
/// We can not avoid the infinitely get increased the app size issue
/// when users keep the web searching using the WKWebView.
/// So, you would get iOS full storage message.
///
/// Set WKWebsiteDataStore.nonPersistentDataStore in the configuration
/// can make lightweight WKWebView. But it can not apply every web site.
/// Imagine the web sites used the localStorage, IndexedDB features.
///
/// - parameter application: application
func applicationDidReceiveMemoryWarning(application: UIApplication) {
#if DEBUG
print("memory warning...execute remove webviewdata")
#endif
removeWebData()
}
/// Remove web data saved in the app, such as caches, cookies.
func removeWebData() {
if #available(iOS 9.0, *) {
let websiteDataTypes = WKWebsiteDataStore.allWebsiteDataTypes()
let date = NSDate(timeIntervalSince1970: 0)
WKWebsiteDataStore.defaultDataStore().removeDataOfTypes(websiteDataTypes, modifiedSince: date, completionHandler: {
#if DEBUG
print("remove all data in iOS9 later")
#endif
})
}else {
// Remove the basic cache.
NSURLCache.sharedURLCache().removeAllCachedResponses()
// Delete system cookie store in the app
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
if let cookies = storage.cookies {
for cookie in cookies {
storage.deleteCookie(cookie)
}
}
do {
// folder 를 삭제하는 대신 contents 를 삭제하는 이유?
// MainVC 가 호출되면 cache, cookie가 발생하므로 로딩시 확인된 cache, cookie 폴더의
// contents 에 대해서만 삭제 진행.
// Clear web cache
try deleteLibraryFolderContents("Caches")
// Remove all cookies stored by the site. This includes localStorage, sessionStorage, and WebSQL/IndexedDB.
try deleteLibraryFolderContents("Cookies")
// Removes all app cache storage.
try deleteLibraryFolder("WebKit")
} catch {
#if DEBUG
print("Delete library folders error in iOS9 below")
#endif
}
}
}
/**
Delete folder in library
- parameter folder: a folder you want to delete
- throws: throws an error
*/
func deleteLibraryFolder(folder: String) throws {
let manager = NSFileManager.defaultManager()
let library = manager.URLsForDirectory(.LibraryDirectory, inDomains: .UserDomainMask).first!
let dir = library.URLByAppendingPathComponent(folder)
try manager.removeItemAtURL(dir)
}
/**
Delete contents in library folder
- parameter folder: target folder
- throws: throws an error
*/
private func deleteLibraryFolderContents(folder: String) throws {
let manager = NSFileManager.defaultManager()
let library = manager.URLsForDirectory(NSSearchPathDirectory.LibraryDirectory, inDomains: .UserDomainMask)[0]
let dir = library.URLByAppendingPathComponent(folder)
let contents = try manager.contentsOfDirectoryAtPath(dir.path!)
for content in contents {
do {
try manager.removeItemAtURL(dir.URLByAppendingPathComponent(content))
} catch where ((error as NSError).userInfo[NSUnderlyingErrorKey] as? NSError)?.code == Int(EPERM) {
// "EPERM: operation is not permitted". We ignore this.
#if DEBUG
print("Couldn't delete some library contents.")
#endif
}
}
}
@zafar007
Copy link

Thanks

@githubuser345
Copy link

Dear dakeshi,
You got some great knowledge on WKWebView! I'm trying to load one single WKWebview on the background in my whole app.
When my iOS app opens the a ViewController with it's own class, with 2 textfields and a login button. When the button is pressed, it will fill in the loginform on WKWebView and login.
Then I need to go to the Second viewcontroller with it's OWN class without loding the WKWebView session.
I want to keep the same WKWebView that is logged in. Is it possible to keep the same WKwebview session in more classes?
I don't know How to implement WKProcessPool, could this be a fix?

Is it possible to load a wkwebview in a Classic that can be accessed from anywhere:
Class webviewclass {
var webView = WKWebView()
...
...
init(websiteurl: String()){

}
}
Could you please help me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment