WKWebview
を使用してキャッシュをクリアしようとしましたか?はいの場合、どうすればいいですか?どんな例?
P.S。:通常のNSURLCacheは機能していません。
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
}];
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()
}
キャッシュと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
}
}
}
}
例:
import WebKit
...
WKWebview.clean()
NSURLCacheでのみキャッシュを削除することはできません。かなりの試行錯誤の後、次の手順でキャッシュをクリアできました(iOS 8.1.1以降)。
Caches
のLibrary
ディレクトリを削除します。次回WKWebViewを作成するときに、キャッシュをクリアする必要があります。
WKWebViewにwindow.location.reloadを評価させることで、この問題を解決できました。 Webビューにタップジェスチャレコグナイザーがあり、2回のタッチでダブルタップを検出するたびに、次を実行します。
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
})
})
@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()
}
}
働いた
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
}
}
}
キャッシュ辞書のパスを取得して削除する
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSError *error;
BOOL success = [fileManager removeItemAtPath:documentsPath error:&error];
NSLog(@"%d",success);
数時間かかりますが、これでうまくいきます! loadRequestの後、reloadFromOriginを作成します!したがって、空のキャッシュを強制します! [WKWebView loadRequest:request]; [WKWebView reloadFromOrigin];
わたしにはできる
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()
}