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.
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)
}
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);
})
}
}
}
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");
}];
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)
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)
}
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
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()
}
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. :)
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.
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()