web-dev-qa-db-fra.com

Le gestionnaire d'achèvement WKHTTPCookieStore.setCookie n'est pas appelé

Je dois partager les cookies entre les instances WKWebView - pour cela, j'utilise une seule instance WKWebViewConfiguration qui est ensuite utilisée pour lancer chaque WKWebView. 

Pour ce faire, je suppose que je dois utiliser un WKProcessPool partagé, par exemple:

let websiteDataStore = WKWebsiteDataStore.default()
websiteDataStore.httpCookieStore.add(self)

let configuration = WKWebViewConfiguration()
configuration.websiteDataStore = websiteDataStore
configuration.processPool = WKProcessPool()   /* !!! */

Cependant, cela entraîne que le gestionnaire d'achèvement setCookie N'EST PAS déclenché. 

let cookieStore = self.webConfiguration.websiteDataStore.httpCookieStore
     cookieStore.setCookie(cookie, completionHandler: {
})

Si je ne configure pas l'instance WKProcessPool (*) - le bloc d'achèvement fonctionne correctement, mais WebViews ne voit évidemment pas les cookies;/Quelqu'un l'a-t-il rencontré? Idées sur les autres moyens de partager les cookies? 

iOS: 11.2.6

9
Pawel Klapuch

Après d’autres tests, j’ai réussi à trouver une solution - bien que je ne sois pas sûr de ce qui se passe. En bref - ci-dessus le gestionnaire d'achèvement se déclenche après l'instanciation de WKWebView. 

Dans mon cas, je dois configurer certains cookies après la connexion (afin qu'aucune vue Web ne s'affiche en mode ATM). Donc, appeler setCookie ne met ces opérations en file d'attente que quelque part - elles sont vidées lorsque le client Web est déclenché. Si quelqu'un peut lier la documentation, c'est génial! 


METTRE À JOUR

Donc, comme ce problème est toujours présent - je suis enfin revenu à cela. Ma solution pour le moment est de:

  1. Valeur du cookie de cache dans le trousseau (chaque fois que l'application appelle HTTPCookieStore.setCookie - ce qui peut se terminer ou non (ce qui est le problème)

  2. Lorsque le bloc d'achèvement HTTPCookieStore.setCookie {} est déclenché (confirmation que le cookie a bien été défini), je supprime alors la valeur du trousseau et webview est désormais responsable du cycle de vie de la valeur du cookie.

  3. À chaque démarrage d'application, je vérifie si les valeurs de cookies sont mises en cache dans le trousseau -> si tel est le cas HTTPCookieStore.setCookie () 

Ci-dessus peut boucler infiniment jusqu'à ce que la vue Web soit réellement ouverte.

4
Pawel Klapuch

Mon problème était avec la suppression des cookies pour déconnecter un utilisateur de l'application. Le gestionnaire d'achèvement pour getAllCookies() ne se déclenche pas, donc ce qui fonctionne pour moi est de forcer la webView à recharger, ce qui videra la file d'attente et supprimera les cookies.

webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
    for cookie in cookies {
        if cookie.name == "authentication" {
            self.webView.configuration.websiteDataStore.httpCookieStore.delete(cookie)
        }
    }
}
webView.reload()
0
Kevin_TA