ios 如何删除 WKWebview 中的缓存?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27105094/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to remove cache in WKWebview?
提问by Sravan
Any one worked with WKWebview
and tried to clear cache ? If yes, how to do? any example ?
任何人一起工作WKWebview
并试图清除缓存?如果是,怎么办?任何例子?
P.S. :Normal NSURLCache is not working.
PS:正常的 NSURLCache 不起作用。
回答by Shingo Fukuyama
In iOS 9
在 iOS 9 中
// Optional data
NSSet *websiteDataTypes
= [NSSet setWithArray:@[
WKWebsiteDataTypeDiskCache,
//WKWebsiteDataTypeOfflineWebApplicationCache,
WKWebsiteDataTypeMemoryCache,
//WKWebsiteDataTypeLocalStorage,
//WKWebsiteDataTypeCookies,
//WKWebsiteDataTypeSessionStorage,
//WKWebsiteDataTypeIndexedDBDatabases,
//WKWebsiteDataTypeWebSQLDatabases,
//WKWebsiteDataTypeFetchCache, //(iOS 11.3, *)
//WKWebsiteDataTypeServiceWorkerRegistrations, //(iOS 11.3, *)
]];
// All kinds of data
// NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
// Date from
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
// Execute
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
// Done
}];
回答by Esqarrouth
Updated Swift 5 version:
更新的 Swift 5 版本:
let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
let date = Date(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ })
Swift version:
迅捷版:
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()
}
Swift 3 version:
斯威夫特 3 版本:
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()
}
回答by Peter Kreinz
Remove Cache and Cookies
删除缓存和 Cookie
# WKWebView+Clean.swift
import WebKit
extension WKWebView {
class func clean() {
guard #available(iOS 9.0, *) else {return}
HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
records.forEach { record in
WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {})
#if DEBUG
print("WKWebsiteDataStore record deleted:", record)
#endif
}
}
}
}
Example:
例子:
import WebKit
...
WKWebview.clean()
回答by Shingo Fukuyama
You cannot delete caches only with NSURLCache. After much cut-and-try, I could clear caches by the following steps (as of iOS 8.1.1):
您不能仅使用 NSURLCache 删除缓存。经过多次尝试,我可以通过以下步骤清除缓存(从 iOS 8.1.1 开始):
- Use NSURLCache to delete caches in the same way as you used to do on UIWebView. If you use WKProccessPool, re-initialize it.
- Delete
Caches
directory inLibrary
. - Delete all WKWebViews
- 使用 NSURLCache 删除缓存的方式与您在 UIWebView 上所做的相同。如果您使用 WKProccessPool,请重新初始化它。
- 中删除
Caches
目录Library
。 - 删除所有 WKWebViews
Next time you create WKWebView, caches should be cleared.
下次创建 WKWebView 时,应清除缓存。
回答by harrisonlee
I was able to solve this issue by having my WKWebView evaluate window.location.reload. I have a tap gesture recognizer on the web view and whenever it detects a double tap with 2 touches, I run the following:
我能够通过让我的 WKWebView 评估 window.location.reload 来解决这个问题。我在 web 视图上有一个点击手势识别器,每当它检测到双击两次触摸时,我运行以下命令:
webView.evaluateJavaScript("window.location.reload(true)", completionHandler: nil);
Hope this helps.
希望这可以帮助。
回答by nouatzi
Something similar for iOS 9.0 and later:
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
})
})
回答by zingle-dingle
Swift 3.x version of @Esqarrouth's post
@Esqarrouth 帖子的 Swift 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()
}
}
回答by ZAFAR007
Worked
Swift 3. Version.
For Older Version Swift
工作
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
}
}
}
回答by Valentin Thomalla
It takes me a few hours, but this works for me! After the loadRequest, I make a reloadFromOrigin! So I force empty cache! [WKWebView loadRequest:request]; [WKWebView reloadFromOrigin];
我需要几个小时,但这对我有用!在 loadRequest 之后,我做了一个 reloadFromOrigin!所以我强制清空缓存![WKWebView 加载请求:请求];[WKWebView reloadFromOrigin];
回答by Durai Amuthan.H
It works for me
这个对我有用
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()
}