How to delete WKWebview cookies How to delete WKWebview cookies xcode xcode

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