Cómo eliminar las cookies de WKWebview

Por ahora estoy haciendo esto

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 otra forma 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 código siguiente, pero esto solo funcionará en dispositivos con iOS versión 9 o posterior :

 WKWebsiteDataStore *dateStore = [WKWebsiteDataStore defaultDataStore]; [dateStore fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] completionHandler:^(NSArray * __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 de arriba seguramente funcionará para iOS 9 y posteriores. Desafortunadamente, si utilizamos WKWebView para iOS antes de iOS 9 , todavía tenemos que seguir el método tradicional y eliminar todo el almacenamiento de cookies de la siguiente manera.

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

Swift 3 versión 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); }) } } } 

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"); }]; 

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) 

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

Parece que NSHTTPCookieStorage ahora se está utilizando en iOS 8.2 para borrar cookies correctamente, según sea necesario. Envié 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]; } 

Cuando antes de iOS 8.2 el sitio web iniciaba sesión automáticamente con las cookies guardadas, ahora le solicita al usuario que vuelva a iniciar sesión correctamente. Todo esto sucedió sin que yo enviara una actualización a la aplicación. 🙂

La respuesta de Esqarrouth es solo parcialmente correcta.
La versión correcta rápida 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() 

WKWebview no almacena nada dentro de [NSHTTPCookieStorage sharedHTTPCookieStorage].

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

Todavía para IOS8 que está usando WKwebview, este método no es aplicable.

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:

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