Comment gérer les cookies avec UIWebView dans Swift
Qu'avoir un sujet où les gens peuvent facilement voir comment gérer les cookies dans une webview en utilisant le nouveau langage Swift? Si vous vérifiez internet vous ne trouverez rien d'intéressant quand vous avez besoin de mettre en œuvre ceci. Même la documentation d'apple est médiocre.
quelqu'un sait comment gérer ces processus dans Swift? C'est ce que j'ai trouvé mais à Obj-C:
VOIR COOKIES STOCKÉS
NSHTTPCookie *cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [cookieJar cookies]) {
NSLog(@"%@", cookie);
}
SUPPRIMER STOCKÉ COOKIES
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
[storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];
Ce serait bien pour tout le monde si nous pouvons donner pour un temps une réponse à cette! Acclamations!
8 réponses
Essayez ce code:
VOIR COOKIES STOCKÉS
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies {
for cookie in cookies {
NSLog("\(cookie)")
}
}
SUPPRIMER LES COOKIES STOCKÉS
var storage : NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies as! [NSHTTPCookie]{
storage.deleteCookie(cookie)
}
swift 2.0
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
Swift 3.0
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {
NSLog("\(cookie)")
}
}
let storage = HTTPCookieStorage.shared
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
swift 3 version claire
enregistrer les cookies
func saveCookies() {
guard let cookies = HTTPCookieStorage.shared.cookies else {
return
}
let array = cookies.flatMap { (cookie) -> [HTTPCookiePropertyKey: Any]? in
cookie.properties
}
UserDefaults.standard.set(array, forKey: "cookies")
UserDefaults.standard.synchronize()
}
Charger les cookies:
func loadCookies() {
guard let cookies = UserDefaults.standard.value(forKey: "cookies") as? [[HTTPCookiePropertyKey: Any]] else {
return
}
cookies.forEach { (cookie) in
guard let cookie = HTTPCookie.init(properties: cookie) else {
return
}
HTTPCookieStorage.shared.setCookie(cookie)
}
}
Vous pouvez appeler ces fonctions comme le code suivant
func webViewDidStartLoad(_ webView: UIWebView) {
loadCookies()
}
func webViewDidFinishLoad(_ webView: UIWebView) {
saveCookies()
}
N'oubliez pas d'avoir un délégué de votre WebView pour webViewDidStartLoad et webViewDidFinishLoad
swift 2.0
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults().synchronize()
Merci pour la "traduction"rapide... Juste besoin de changer la suppression! à force abattu:
var storage : NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies as! [NSHTTPCookie]
{
storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults()
Voici la réponse complète avec comment capturer des cookies avec la fonction de délégué D'UIWebView:
func webViewDidFinishLoad(_ webView: UIWebView) {
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {
print("cookie= \(cookie)")
}
}
}
gardez à l'esprit que les cookies seront sauvegardés par défaut et cette fonction de délégué appelle chaque mouvement qui s'est terminé avec la charge webview. (Il est également mis à jour avec Swift 3.0.1)
Si vous travaillez sur swift 4 ce code va désactiver cookies et supprimer l'URL de cache.
let cookieJar : HTTPCookieStorage = HTTPCookieStorage.shared
for cookie in cookieJar.cookies! as [HTTPCookie]{
NSLog("cookie.domain = %@", cookie.domain)
cookieJar.deleteCookie(cookie)
}
URLCache.shared.removeAllCachedResponses()
URLCache.shared.diskCapacity = 0
URLCache.shared.memoryCapacity = 0
swift 3
let storage = HTTPCookieStorage.shared
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
Déconnexion pour api VKontakte, 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);
})
}
}
}