web-dev-qa-db-fra.com

Comment supprimer les cookies WKWebview

Pour l'instant je fais comme ça

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

Mais cela ne fonctionne pas sur iOS 8, appareil 64 bits.

Toute autre manière les cookies propres de WKWebview? Toute aide serait appréciée. Merci.

20
Pankaj Gaikar

Apple a publié de nouvelles API pouriOS 9, nous pouvons donc supprimer les cookies spécifiques à un domaine stockés pour WKWebView avec le code ci-dessous, mais cela ne fonctionnera que sur les appareils dotés deiOSversion9ouplus tard:

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

L'extrait ci-dessus fonctionnera sûrement pouriOS 9et ultérieurs. Malheureusement, si nous utilisonsWKWebViewpour les versions iOS antérieures àiOS 9, nous devons toujours nous en tenir à la méthode traditionnelle et supprimer le stockage complet des cookies comme indiqué ci-dessous.

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

Ci-dessous, la version de 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);
                })
            }
        }
    }

Et rapide 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

Version rapide 3 de la réponse de Sarat:

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

Dans 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

Aucune de ces options n'a fonctionné pour moi mais j'ai trouvé celle qui a fonctionné

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 et version plus courte:

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

En plus d'effacer les cookies dans le stockage de cookies partagé, j'essayais d'effacer le cache (NSURLCache), de supprimer le WKWebView et d'en créer un nouveau avec un nouveau WKProcessPool

1
Subbu

Prend en charge iOS 11.0 et les versions ultérieures

La solution suivante a bien fonctionné pour moi:

Étape 1. Supprimer le cookie de HTTPCookieStorage

Étape 2. Récupérez les enregistrements de données de WKWebsiteDataStore et supprimez-les.

Étape 3. Créez une nouvelle WKProcessPool

Créer une extension WKWebView:

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

Utilisation:

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

Il semble que NSHTTPCookieStorage soit maintenant utilisé dans iOS 8.2 pour supprimer correctement les cookies, si nécessaire. J'avais envoyé une application qui exécutait ce code avant d'ouvrir une connexion basée sur WKWebView:

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

Si, auparavant, le site Web se connectait automatiquement à l'aide des cookies enregistrés, il invite désormais correctement l'utilisateur à se reconnecter. Tout cela s'est passé sans que je reçoive une mise à jour de l'application. :)

0
Rohit suvagiya

WKWebview ne stockant rien dans [NSHTTPCookieStorage sharedHTTPCookieStorage].

effacer WKWebsiteDataStore sera la solution à ce problème.

Toujours pour IOS8 qui utilise WKwebview, cette méthode n’est pas applicable.

0
Jeba Moses

La réponse d'Esqarrouth n'est que partiellement juste.
La version correcte de Swift est:

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