webentwicklung-frage-antwort-db.com.de

So löschen Sie WKWebview-Cookies

Im Moment mache ich das so

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

Es funktioniert jedoch nicht auf iOS 8, 64-Bit-Geräten.

Auf andere Weise die sauberen Cookies von WKWebview? Jede Hilfe wird geschätzt. Vielen Dank.

20
Pankaj Gaikar

Apple hat neue APIs füriOS 9veröffentlicht. Jetzt können domänenspezifische Cookies entfernt werden, die für WKWebView mit dem folgenden Code gespeichert sind. Dies funktioniert jedoch nur auf Geräten mitiOSversion9oderspäter:

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

Das obige Snippet funktioniert sicher füriOS 9und höher. Wenn wir jedochWKWebViewfür iOS-Versionen voriOS 9verwenden, müssen wir uns leider an die traditionelle Methode halten und den gesamten Cookies-Speicher wie unten löschen.

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

Unten ist die 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);
                })
            }
        }
    }

Und schnell 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)
    }
29
Pankaj Gaikar

Swift 3-Version von Sarat's Antwort:

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);
            })
        }
    }
}
20
Simon Epskamp

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

Keine dieser Optionen hat für mich funktioniert, aber ich habe eine gefunden, die es tat:

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)
3
Zack Shapiro

Swift 4 und kürzere Version:

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)
}
1
Sergi Gracia

Zusätzlich zum Löschen von Cookies im gemeinsam genutzten Cookie-Speicher würde ich versuchen, den Cache zu löschen (NSURLCache), die WKWebView zu verwerfen und mit einem neuen WKProcessPool ein neues zu erstellen

1
Subbu

Unterstützt iOS 11.0 und höher

Folgende Lösung hat für mich gut funktioniert:

Schritt 1. Cookie von HTTPCookieStorage entfernen

Schritt 2. Holen Sie Datensätze aus WKWebsiteDataStore und löschen Sie sie.

Schritt 3. Erstellen Sie eine neue WKProcessPool

Erstellen Sie eine WKWebView-Erweiterung:

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

Verwendungszweck:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        webView.cleanAllCookies()
        webView.refreshCookies()
    }
0
HSAM

Es scheint, als würde NSHTTPCookieStorage jetzt in iOS 8.2 verwendet, um Cookies nach Bedarf korrekt zu löschen. Ich hatte eine App ausgeliefert, die diesen Code vor dem Öffnen eines WKWebView-basierten Logins ausführte:

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

Wo sich die Website vor iOS 8.2 automatisch mit den gespeicherten Cookies anmeldete, wird der Benutzer jetzt korrekt aufgefordert, sich erneut anzumelden. All dies geschah, ohne dass ich ein Update an die App lieferte. :)

0
Rohit suvagiya

WKWebview speichert nichts in [NSHTTPCookieStorage sharedHTTPCookieStorage].

clearing WKWebsiteDataStore wird die Lösung für dieses Problem sein.

Für IOS8, das WKwebview verwendet, ist diese Methode nicht anwendbar.

0
Jeba Moses

Esqarrouths Antwort ist nur teilweise richtig.
Die korrekte Swift-Version lautet:

var libraryPath : String = NSFileManager().URLsForDirectory(.LibraryDirectory, inDomains: .UserDomainMask).first!.path!
libraryPath += "/Cookies"
do {
    try NSFileManager.defaultManager().removeItemAtPath(libraryPath)
} catch {
    print("error")
}
NSURLCache.sharedURLCache().removeAllCachedResponses()
0
ykonda