如何删除WKWebview cookies

现在我正在这样做

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

但它不适用于iOS 8,64位设备。

任何其他方式WKWebview干净的cookies? 任何帮助将不胜感激。 谢谢。

苹果公司为iOS 9发布了新的API,现在我们可以使用下面的代码去除为WKWebView存储的特定于域的cookie,但这只适用于iOS 9 更高 版本的设备:

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

上面的代码片段肯定适用于iOS 9及更高版本。 不幸的是,如果我们在iOS 9之前的iOS版本中使用WKWebView ,我们仍然需要坚持传统的方法,并删除整个cookie存储如下。

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

萨拉特的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); }) } } } 

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

这些选项都没有为我工作,但我发现一个做:

 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) 

除了清除共享cookie存储中的cookie之外,我还会尝试清除caching(NSURLCache)并丢弃WKWebView并使用新的WKProcessPool创build一个新的caching

看来NSHTTPCookieStorage现在正在iOS 8.2中用来正确清除cookie,如果需要的话。 我已经发布了一个应用程序,可以在打开基于WKWebView的login之前运行此代码:

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

在iOS 8.2之前,网站会使用保存的cookie自动login,现在正确地要求用户重新login。 所有这一切都发生了,没有我发送更新的应用程序。 🙂

Esqarrouth的答案只是部分正确。
正确的迅捷版本是:

 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里面没有任何东西[NSHTTPCookieStorage sharedHTTPCookieStorage]。

清除WKWebsiteDataStore将是解决这个问题的方法。

对于使用WKwebview的IOS8,这个方法是不适用的。

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