How to delete WKWebview cookies

后端 未结 13 1525
北荒
北荒 2020-11-27 04:18

For now I am doing like this

    NSHTTPCookie *cookie;
    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (cookie in [         


        
13条回答
  •  鱼传尺愫
    2020-11-27 04:55

    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 * __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
      )
    }
    

提交回复
热议问题