How to delete WKWebview cookies
Apple released new APIs for iOS 9, so now we can remove domain specific cookies stored for WKWebView with below code, but this will only work on devices with iOS version 9 or later:
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); } ]; } } } ];
Above snippet will sure work for iOS 9 and later. Unfortunately if we use WKWebView for iOS versions before iOS 9, we still have to stick to traditional method and delete the whole cookies storage as below.
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"];NSError *errors;[[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];
Below is Swift 3 version
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); }) } } }
And 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 )}
Swift 3 version of Sarat's answer:
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); }) } }}
Supports iOS 11.0 and above
Following solution worked well for me:
Step 1. Remove Cookie from HTTPCookieStorage
Step 2. Fetch data records from WKWebsiteDataStore
and delete them.
Step 3. Create a new WKProcessPool
Create a WKWebView Extension:
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() }}
Usage:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) webView.cleanAllCookies() webView.refreshCookies() }