Cualquiera trabajado con WKWebview y trató de borrar la caché ? Si sí, ¿cómo hacer? cualquier ejemplo ?

P. S. : Normal NSURLCache no está funcionando.

InformationsquelleAutor Sravan | 2014-11-24

11 Comentarios

  1. 51

    En 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
    }];
    • Funcionaba a la perfección. Recuerde hacer esto: #import <WebKit/WKWebsiteDataStore.h>
    • este código presenta el error de compilación: Initializer element is not a compile-time constant
    • Sólo quiero señalar que aunque el código de arriba es bueno, no trabajo para mí, para el sitio web que estaba visitando el uso de la WKWebView (el sitio web se encuentra en desarrollo), Pero la respuesta seleccionada en esta pregunta trabajado: stackoverflow.com/questions/31289838/…
  2. 36

    Actualizado Swift 5 versión:

    let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
    let date = Date(timeIntervalSince1970: 0)
    WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ })

    Swift versión:

    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 versión:

       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()
        }
    • Bien, gracias. Swift (2.0 al menos) permite la inferencia y la simplificación de los tipos: let types = Set([WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]), y luego de crédito necesario en remove llamada
    • Me pregunto si alguien realmente se trató de la < versión 9.0. Esto siempre produce un error. Cambiar el último parámetro de NSSearchPathForDirectoriesInDomains a true y trabajó para mí.
    • Incluso con iOS 9.0 disponibles, parece WKWebsiteDataStore.predeterminado().removeData… no quitar el sitio archivo de manifiesto de recursos. Tuve que usar tanto WKWebsiteDataStore.predeterminado().removeData y URLCache.compartida.removeAllCachedResponses()
    • me pueden ayudar por algún tipo de problema en WKWebView ?
  3. 5

    Eliminar el Cache y las Cookies

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

    Ejemplo:

    import WebKit
    ...
    WKWebview.clean()
  4. 3

    Yo era capaz de resolver este problema por tener a mi WKWebView evaluar la ventana.ubicación.recargar. Tengo un toque gesto de reconocimiento en la web ver y cada vez que detecta una doble pulsación con 2 toques, que me ejecute el siguiente:

    webView.evaluateJavaScript("window.location.reload(true)", completionHandler: nil);

    Espero que esto ayude.

  5. 2

    No se puede eliminar cachés sólo con NSURLCache.
    Después de mucho cortar y probar, yo podría borrar cachés por los siguientes pasos (como de iOS 8.1.1):

    1. Uso NSURLCache para eliminar cachés en la misma forma como se solía hacer en UIWebView. Si utiliza WKProccessPool, re-inicializar.
    2. Eliminar Caches directorio en Library.
    3. Eliminar todos los WKWebViews

    Próxima vez que usted cree WKWebView, se almacena en caché debe estar desactivada.

    ShingoFukuyama/WKWebViewTips

    • sería bueno ver algo de código.
  6. 1

    Algo similar para iOS 9.0 y posterior:

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

    Swift 3.x versión de @Esqarrouth el post de

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

    Trabajado

    Swift 3. Versión.

    Para La Versión Anterior 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
    }
    }
    }
  9. 0

    A mí me funciona

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

    Me toma un par de horas, pero esto funciona para mí!
    Después de la loadRequest, puedo hacer una reloadFromOrigin! Así que la fuerza de vaciar caché!
    [WKWebView loadRequest:petición];
    [WKWebView reloadFromOrigin];

  11. 0

    obtener la caché de diccionario de ruta de acceso y eliminar

       NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSError *error;
    BOOL success = [fileManager removeItemAtPath:documentsPath error:&error];
    NSLog(@"%d",success);

Dejar respuesta

Please enter your comment!
Please enter your name here