Created
June 10, 2016 06:17
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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 | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.