2014-11-24 4 views

Antwort

2

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):

  1. Verwenden NSURLCache Caches auf die gleiche Art und Weise zu löschen, wie Sie auf UIWebView tun verwendet. Wenn Sie WKProcessPool verwenden, initialisieren Sie es erneut.
  2. Löschen Caches Verzeichnis in Library.
  3. Alles löschen WKWebViews

das nächste Mal WKWebView erstellen, sollten Caches gelöscht werden.

ShingoFukuyama/WKWebViewTips

+2

wäre schön, etwas Code zu sehen. – lostintranslation

2

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.

34

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 
}]; 
+0

Arbeitete wunderschön. Denken Sie daran, dies zu tun: #import hnilsen

+0

Dieser Code stellt den Kompilierfehler dar: 'Initialisierungselement ist keine Kompilierzeitkonstante' – andrepaulo

+0

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

20

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() 
    } 
+0

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

+0

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

0

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() 
     } 
1

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 
    }) 
}) 
0

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() 
    } 
} 
0

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 
     } 
    } 
} 
0

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];