Hat jemand mit WKWebview
gearbeitet und versucht, den Cache zu löschen? Wenn ja, wie? irgendein Beispiel?Wie entfernt man den Cache in WKWebview?
P.S. : Normal NSURLCache funktioniert nicht.
Hat jemand mit WKWebview
gearbeitet und versucht, den Cache zu löschen? Wenn ja, wie? irgendein Beispiel?Wie entfernt man den Cache in WKWebview?
P.S. : Normal NSURLCache funktioniert nicht.
Sie können Caches nicht nur mit NSURLCache löschen. Nach vielen Ausschneiden und versuchen, ich Caches durch die folgenden Schritte löschen könnte (wie von iOS 8.1.1):
Caches
Verzeichnis in Library
.das nächste Mal WKWebView erstellen, sollten Caches gelöscht werden.
ich dieses Problem lösen konnte durch meine WKWebView window.location.reload bewerten zu müssen. Ich habe einen Hahn Gestenerkenner auf der Web-Ansicht und wann immer es ein doppeltes Tippen mit zwei Berührungen erkennt, laufe ich folgende:
webView.evaluateJavaScript("window.location.reload(true)", completionHandler: nil);
Hoffnung, das hilft.
In 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
}];
Arbeitete wunderschön. Denken Sie daran, dies zu tun: #import
Dieser Code stellt den Kompilierfehler dar: 'Initialisierungselement ist keine Kompilierzeitkonstante' – andrepaulo
Ich möchte nur darauf hinweisen, obwohl der obige Code gut ist, hat es nicht für mich für die Website funktioniert, die ich besucht habe der WKWebView (die Website ist auch in der Entwicklung) Aber die ausgewählte Antwort in dieser Frage hat funktioniert: https://StackOverflow.com/questions/31289838/how-to-delete-wkwebview-cookies – c0d3Junk13
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()
}
swift3 Version:
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()
}
Schön, danke. Swift (mindestens 2.0) erlaubt Inferenz und Vereinfachung für Typen: 'let types = Set ([WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])' und dann keine Bridging benötigt in 'remove' Aufruf – BaseZen
Ich frage mich, ob jemand tatsächlich die <9.0 Version ausprobiert. Dies spuckt immer einen Fehler aus. Ändern Sie den letzten Parameter von 'NSSearchPathForDirectoriesInDomains' in' true' und es funktionierte für mich. – BridgeTheGap
Es funktioniert für mich
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()
}
Etwas Ähnliches für iOS 9.0 und höher:
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 Version von @ Esqarrouth der Post
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()
}
}
Arbeitete
Swift 3. Version.
für ältere Version 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
}
}
}
Es dauert ein paar Stunden, aber das funktioniert für mich! Nach dem loadRequest, mache ich ein ReloadFromOrigin! Also zwinge ich leeren Cache! [WKWebView loadRequest: Anfrage]; [WKWebView reloadFromOrigin];
wäre schön, etwas Code zu sehen. – lostintranslation