WKWebView Stockage persistant des cookies
Je suis à l'aide d'un WKWebView dans mon application iPhone native, sur un site web qui permet la connexion/inscription, et stocke les informations de session dans les cookies. Je suis à essayer de comprendre comment la persistance de stocker les informations du cookie, donc lorsque l'application redémarre, l'utilisateur a toujours leur session web disponibles.
J'ai 2 WKWebViews dans l'application, et ils partagent une WKProcessPool. Je commence avec un processus partagé de la piscine:
WKProcessPool *processPool = [[WKProcessPool alloc] init];
Ensuite, pour chaque WKWebView:
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
theConfiguration.processPool = processPool;
self.webView = [[WKWebView alloc] initWithFrame:frame configuration:theConfiguration];
Lorsque je me connecte à l'aide de la première WKWebView, et puis quelques temps plus tard passer à l'action pour la 2ème WKWebView, la session est retenue, de sorte que les cookies ont été partagés. Cependant, lorsque je relance l'application, un nouveau processus de piscine est créé et les informations de session est détruite. Est-il possible d'obtenir les informations de session, qui persistent à travers une application redémarrer?
source d'informationauteur haplo1384
Vous devez vous connecter pour publier un commentaire.
C'est en fait ce que l'un parce qu'il y a) certains bug ce n'est toujours pas résolu par Apple (je pense) et b) dépend de ce que les cookies que vous voulez, je pense.
Je n'ai pas pu tester cela, mais je peux vous donner quelques conseils:
NSHTTPCookieStorage.sharedHTTPCookieStorage()
. Celui-ci semble buggy, apparemment, les cookies ne sont pas enregistrés immédiatement pourNSHTTPCookieStorage
pour les trouver. Les gens suggèrent de déclencher un enregistrement en remettant à zéro le processus de la piscine, mais je ne sais pas si cela fonctionne de manière fiable. Vous voudrez peut-être essayer cela pour vous-même, cependant.WKWebsiteDataStore
alors je serais le chercher. Avoir au moins les cookies à partir de là à l'aide defetchDataRecordsOfTypes:completionHandler:
pourrait être possible (pas sûr de la façon de les mettre, même si, et je suppose que vous ne pouvez pas enregistrer le magasin dans les paramètres utilisateur par défaut pour la même raison que pour le processus de la piscine).[request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"]
).Une dernière chose: j'ai dit que votre succès pourrait aussi dépendre du type de cookie. C'est parce que cette réponse stipule que les cookies placés par le serveur ne sont pas accessibles via
NSHTTPCookieStorage
. Je ne sais pas si c'est pertinent pour vous (mais je suppose que c'est, puisque vous êtes probablement à la recherche pour une session, c'est à dire le serveur de cookie ensemble, correct?) et je ne sais pas si cela signifie que les autres méthodes échouent.Si tout le reste échoue, vous pouvez envisager l'enregistrement des informations d'identification des utilisateurs quelque part (porte-clés, par exemple) et de les réutiliser sur l'application prochaine de commencer à auth automatiquement. Cela pourrait ne pas restaurer toutes les données de session, mais compte tenu de l'utilisateur de quitter l'application qui est peut-être fait-il souhaitable?
Peut-être aussi certaines valeurs peuvent être capturés et enregistrés pour une utilisation ultérieure à l'aide d'un script injecté, comme mentionné ici (évidemment pas pour les établir à démarrer, mais peut-être les récupérer à un certain point. Vous avez besoin de savoir comment le site fonctionne alors, bien sûr).
J'espère que pourrais au moins vous orienter vers certaines nouvelles orientations de la résolution de la question. Ce n'est pas aussi trivial qu'il devrait l'être, il me semble (là encore, les cookies de session sont une sorte de sécurité pertinentes chose, alors peut-être les cacher loin de l'App est la conscience d'un choix de conception par Apple...).
Je suis un peu en retard à la fête, mais les gens pourraient trouver cela utile. Il y a une solution, c'est un peu gênant, mais pour autant que je peux dire, c'est la seule solution qui fonctionne de manière fiable, au moins jusqu'à ce que apple fixer ses muets Api...
J'ai passer un bon 3 jours à essayer d'obtenir la mise en cache des biscuits de la
WKWebView
inutile de dire que cela m'a nulle part... finalement j'ai sorti seulement je pouvais obtenir les cookies directement à partir du serveur.La première chose que j'ai essayé de faire est d'obtenir tous les cookies en javascript qui était en cours d'exécution dans le
WKWebView
et puis les passer à l'WKUserContentController
où je viens de les stocker àUserDefaults
. Cela n'a pas fonctionné depuis mes témoins oùhttponly
et apparemment, vous ne pouvez pas obtenir ceux avec javascript...J'ai fini de le fixer par l'insertion d'un appel javascript dans la page sur le côté serveur (Ruby on Rails dans mon cas) avec les biscuits en tant que paramètre, par exemple
sendToDevice("key:value")
Au-dessus de la js fonction est simplement de passage des cookies pour l'appareil. Espérons que cela permettra à quelqu'un de rester sain d'esprit...
Après des jours de recherches et d'expériences, j'ai trouvé une solution pour gérer les sessions dans WKWebView, C'est un travail autour de parce que je n'ai pas trouvé d'autre moyen pour y parvenir, ci-dessous sont les étapes suivantes:
D'abord, vous devez créer les méthodes pour définir et obtenir les données de l'utilisateur par défaut, quand je dis de données, cela signifie NSData, voici la méthode.
Pour le maintien de la session sur la webview, j'ai fait mon webview et WKProcessPool singleton.
Dans le ViewDidLoad, je vérifie si ce n'est pas la page de connexion de charge et de cookies en HttpCookieStore de l'Utilisateur par Défaut de sorte qu'Il sera en passe d'authentification ou de l'utilisation de ces cookies pour maintenir session.
Et, Charge de la demande.
Maintenant, nous allons maintenir le webview sessions en utilisant des cookies, sur votre page de connexion webview, d'enregistrer des cookies de httpCookieStore dans les paramètres utilisateur par défaut dans viewDidDisappear méthode.
Espère que cela résout vos problèmes !!! 🙂
WKWebView
est conforme àNSCoding
,de sorte que vous pouvez utiliserNSCoder
pour décoder/encoder vos webView ,et de le stocker quelque part d'autre ,commeNSUserDefaults
.Stocker les informations dans
NSUserDefaults
. En même temps, si les informations de session est très critique, il est préférable de le stocker dansKeyChain
.