mac historial habilitar como cache borrar aplicaciones activar ios xcode uiwebview wkwebview wkwebviewconfiguration

historial - habilitar cookies en ios 11



Cómo eliminar las cookies de WKWebview (11)

Además de borrar las cookies en el almacenamiento compartido de cookies, intentaría borrar el caché (NSURLCache) y descartaría el WKWebView y crearía uno nuevo con un nuevo WKProcessPool

Por ahora estoy haciendo así

NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (cookie in [storage cookies]) { [storage deleteCookie:cookie]; }

Pero no funciona en iOS 8, dispositivo de 64 bits.

¿De alguna otra manera las cookies limpias de WKWebview? Cualquier ayuda será apreciada. Gracias.


Apple lanzó nuevas API para iOS 9 , por lo que ahora podemos eliminar las cookies específicas del dominio almacenadas para WKWebView con el siguiente código, pero esto solo funcionará en dispositivos con iOS versión 9 o posterior :

WKWebsiteDataStore *dateStore = [WKWebsiteDataStore defaultDataStore]; [dateStore fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] completionHandler:^(NSArray<WKWebsiteDataRecord *> * __nonnull records) { for (WKWebsiteDataRecord *record in records) { if ( [record.displayName containsString:@"facebook"]) { [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:record.dataTypes forDataRecords:@[record] completionHandler:^{ NSLog(@"Cookies for %@ deleted successfully",record.displayName); }]; } } }];

El fragmento anterior seguramente funcionará para iOS 9 y versiones posteriores. Desafortunadamente, si usamos WKWebView para versiones de iOS anteriores a iOS 9 , todavía tenemos que seguir el método tradicional y eliminar todo el almacenamiento de cookies como se muestra a continuación.

NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"]; NSError *errors; [[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];

A continuación se muestra la versión Swift 3

let dataStore = WKWebsiteDataStore.default() dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { (records) in for record in records { if record.displayName.contains("facebook") { dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: [record], completionHandler: { print("Deleted: " + record.displayName); }) } } }

Y Swift 4:

let dataStore = WKWebsiteDataStore.default() dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: records.filter { $0.displayName.contains("facebook") }, completionHandler: completion) }


En iOS9:

//// 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 NSLog(@"remove done"); }];


La respuesta de Esqarrouth es solo parcialmente correcta.
La versión rápida correcta es:

var libraryPath : String = NSFileManager().URLsForDirectory(.LibraryDirectory, inDomains: .UserDomainMask).first!.path! libraryPath += "/Cookies" do { try NSFileManager.defaultManager().removeItemAtPath(libraryPath) } catch { print("error") } NSURLCache.sharedURLCache().removeAllCachedResponses()


Ninguna de estas opciones funcionó para mí, pero encontré una que sí:

let config = WKWebViewConfiguration() if #available(iOS 9.0, *) { config.websiteDataStore = WKWebsiteDataStore.nonPersistentDataStore() } else { // I have no idea what to do for iOS 8 yet but this works in 9. } let webView = WKWebView(frame: .zero, configuration: config)


Parece que NSHTTPCookieStorage ahora se está utilizando en iOS 8.2 para borrar correctamente las cookies, según sea necesario. Había enviado una aplicación que ejecutaría este código antes de abrir un inicio de sesión basado en WKWebView:

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in [storage cookies]) { [storage deleteCookie:cookie]; }

Donde antes de iOS 8.2 el sitio web iniciaría sesión automáticamente usando las cookies guardadas, ahora solicita correctamente al usuario que vuelva a iniciar sesión. Todo esto sucedió sin que yo enviara una actualización de la aplicación. :)


Swift 4 y versión más corta:

let dataStore = WKWebsiteDataStore.default() dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: records.filter { $0.displayName.contains("facebook") }, completionHandler: completion) }


Versión Swift 3 de la respuesta de Sarat:

let dataStore = WKWebsiteDataStore.default() dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { (records) in for record in records { if record.displayName.contains("facebook") { dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: [record], completionHandler: { print("Deleted: " + record.displayName); }) } } }


Versión rápida:

var libraryPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, false).first! libraryPath += "/Cookies" do { let result = try NSFileManager.defaultManager().removeItemAtPath(libraryPath) print(result) } catch { print("error") } NSURLCache.sharedURLCache().removeAllCachedResponses()


WKWebview no almacena nada dentro de [NSHTTPCookieStorage sharedHTTPCookieStorage].

borrar WKWebsiteDataStore será la solución para este problema.

Aún para IOS8 que está usando WKwebview, este método no es aplicable.


Admite iOS 11.0 y superior

La siguiente solución funcionó bien para mí:

Paso 1. Eliminar la cookie de HTTPCookieStorage

Paso 2. WKWebsiteDataStore registros de datos de WKWebsiteDataStore y elimínelos.

Paso 3. Crea un nuevo WKProcessPool

Cree una extensión WKWebView:

extension WKWebView { func cleanAllCookies() { HTTPCookieStorage.shared.removeCookies(since: Date.distantPast) print("All cookies deleted") WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in records.forEach { record in WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {}) print("Cookie ::: /(record) deleted") } } } func refreshCookies() { self.configuration.processPool = WKProcessPool() } }

Uso:

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) webView.cleanAllCookies() webView.refreshCookies() }