如何删除WKWebview中的caching?
任何一个与WKWebview
工作,并试图清除caching? 如果是的话,该怎么办? 任何例子?
PS:正常NSURLCache不能正常工作。
在iOS 9中
//// Optional data NSSet *websiteDataTypes = [NSSet setWithArray:@[ WKWebsiteDataTypeDiskCache, //WKWebsiteDataTypeOfflineWebApplicationCache, WKWebsiteDataTypeMemoryCache, //WKWebsiteDataTypeLocalStorage, //WKWebsiteDataTypeCookies, //WKWebsiteDataTypeSessionStorage, //WKWebsiteDataTypeIndexedDBDatabases, //WKWebsiteDataTypeWebSQLDatabases ]]; //// All kinds of data //NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes]; //// Date from NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; //// Execute [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ // Done }];
Swift版本:
if #available(iOS 9.0, *) { let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]) let date = NSDate(timeIntervalSince1970: 0) WKWebsiteDataStore.defaultDataStore().removeDataOfTypes(websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ }) } else { var libraryPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, false).first! libraryPath += "/Cookies" do { try NSFileManager.defaultManager().removeItemAtPath(libraryPath) } catch { print("error") } NSURLCache.sharedURLCache().removeAllCachedResponses() }
Swift3版本:
if #available(iOS 9.0, *) { let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]) let date = NSDate(timeIntervalSince1970: 0) WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: date as Date, completionHandler:{ }) } else { var libraryPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, false).first! libraryPath += "/Cookies" do { try FileManager.default.removeItem(atPath: libraryPath) } catch { print("error") } URLCache.shared.removeAllCachedResponses() }
只能使用NSURLCache删除caching。 经过多次尝试,我可以通过以下步骤清除caching(从iOS 8.1.1开始):
- 使用NSURLCache删除caching的方式与您在UIWebView上所做的相同。 如果您使用WKProccessPool,重新初始化它。
- 删除
Library
Caches
目录。 - 删除所有的WKWebViews
下次创buildWKWebView时,应该清除caching。
ShingoFukuyama / WKWebViewTips
我能通过让我的WKWebView评估window.location.reload来解决这个问题。 我在networking视图上有一个轻击手势识别器,每当它检测到两次触摸的双击时,我运行以下命令:
webView.evaluateJavaScript("window.location.reload(true)", completionHandler: nil);
希望这可以帮助。
类似于iOS 9.0和更高版本的东西:
let store: WKWebsiteDataStore = WKWebsiteDataStore.default() let dataTypes: Set<String> = WKWebsiteDataStore.allWebsiteDataTypes() store.fetchDataRecords(ofTypes: dataTypes, completionHandler: { (records: [WKWebsiteDataRecord]) in store.removeData(ofTypes: dataTypes, for: records, completionHandler: { // do your thing here }) })
这个对我有用
if #available(iOS 9.0, *) { let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]) let date = NSDate(timeIntervalSince1970: 0) WKWebsiteDataStore.defaultDataStore().removeDataOfTypes(websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ }) } else { NSURLCache.sharedURLCache().removeAllCachedResponses() }
@ Esqarrouth的postSwift 3.x版本
func clearCache() { if #available(iOS 9.0, *) { let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]) let date = NSDate(timeIntervalSince1970: 0) WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: date as Date, completionHandler:{ }) } else { var libraryPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, false).first! libraryPath += "/Cookies" do { try FileManager.default.removeItem(atPath: libraryPath) } catch { print("error") } URLCache.shared.removeAllCachedResponses() } }
工作
Swift 3.版本。
对于旧版本的Swift
import Foundation import WebKit func removeWebData() { if #available(iOS 9.0, *) { let websiteDataTypes = WKWebsiteDataStore.allWebsiteDataTypes() let date = NSDate(timeIntervalSince1970: 0) WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes, modifiedSince: date as Date, completionHandler: { #if DEBUG print("remove all data in iOS9 later") #endif }) }else { // Remove the basic cache. URLCache.shared.removeAllCachedResponses() // Delete system cookie store in the app let storage = HTTPCookieStorage.shared 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(folder: "Caches") // Remove all cookies stored by the site. This includes localStorage, sessionStorage, and WebSQL/IndexedDB. try deleteLibraryFolderContents(folder: "Cookies") // Removes all app cache storage. try deleteLibraryFolder(folder: "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 = FileManager.default let library = manager.urls(for: .libraryDirectory, in: .userDomainMask).first! let dir = library.appendingPathComponent(folder) try manager.removeItem(at: dir) } /** Delete contents in library folder - parameter folder: target folder - throws: throws an error */ private func deleteLibraryFolderContents(folder: String) throws { let manager = FileManager.default let library = manager.urls(for: FileManager.SearchPathDirectory.libraryDirectory, in: .userDomainMask)[0] let dir = library.appendingPathComponent(folder) let contents = try manager.contentsOfDirectory(atPath: dir.path) for content in contents { do { try manager.removeItem(at: dir.appendingPathComponent(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 } } }
这需要我几个小时,但这对我有用! 在loadRequest之后,我做了一个reloadFromOrigin! 所以我强制空的caching! [WKWebView loadRequest:request]; [WKWebView reloadFromOrigin];