Кто-нибудь работал с WKWebview
и пытался очистить кеш? Если да, как это сделать? любой пример?
P.S.: Нормальный NSURLCache не работает.
Кто-нибудь работал с 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 5:
let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
let date = Date(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ })
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()
}
Версия Swift 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()
}
Удалить кэш и файлы 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()
Мне удалось решить эту проблему, проверив мой WKWebView window.location.reload. У меня есть распознающий знак жестов на веб-просмотре, и всякий раз, когда он обнаруживает двойной кран с двумя касаниями, я запускаю следующее:
webView.evaluateJavaScript("window.location.reload(true)", completionHandler: nil);
Надеюсь, что это поможет.
Вы не можете удалять кеши только с помощью NSURLCache. После многократного вырезания я мог очистить кеши с помощью следующих шагов (начиная с iOS 8.1.1):
Caches
в Library
.В следующий раз, когда вы создаете WKWebView, кеши должны быть очищены.
Нечто похожее для 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
})
})
Swift 3.x версия сообщения @Esqarrouth
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()
}
}
Работали
Свифт 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
}
}
}
Это работает для меня
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()
}
Мне нужно несколько часов, но это работает для меня! После loadRequest я делаю reloadFromOrigin! Поэтому я заставляю пустой кеш! [WKWebView loadRequest: запрос]; [WKWebView reloadFromOrigin];
получить путь к кеш-словарю и удалить его
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSError *error;
BOOL success = [fileManager removeItemAtPath:documentsPath error:&error];
NSLog(@"%d",success);