Lorsque vous utilisez l'ancien UIWebView, vous pouvez intercepter les demandes en implémentant un NSURLProtocol personnalisé. Je nous sert à gérer les demandes qui nécessitent une authentification.
J'ai essayé le même code et cela ne fonctionne pas avec le nouveau WKWebView mais ma classe de protocole n'est pas appelée du tout. Quelqu'un rencontre-t-il le même problème ou existe-t-il une meilleure façon de faire l'authentification avec WKWebView?
Sans aucune modification, j'obtiens une réponse 401 dans la fonction déléguée decidePolicyForNavigationResponse. J'ai également essayé de me connecter au serveur avec un NSURLConnection et de gérer l'authentification avec un NSURLConnectionDataDelegate. Cela fonctionne, mais les informations d'identification stockées ne sont pas récupérées par WKWebView.
Depuis iOS 11, il est possible de déclarer un objet conforme au protocole WKURLSchemeHandler
et de l'enregistrer dans la configuration WKWebView
: -[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]
.
WKWebView
fait des demandes et rend le contenu hors processus, ce qui signifie que votre application n'entend pas les demandes qu'elle fait. Si vous manquez une fonctionnalité, il est maintenant temps d'ouvrir un rapport de bogue et/ou une demande d'amélioration avec Apple.
Depuis le SDK iOS 10.3, WKWebView
n'est toujours pas en mesure d'utiliser des NSURLProtocol
s personnalisés à l'aide d'API publiques.
Les développeurs entreprenants ont trouvé une méthode intéressante: +[WKBrowsingContextController registerSchemeForCustomProtocol:]
Il ajoute le schéma fourni à une liste de schémas de protocole personnalisé et devrait ensuite fonctionner avec NSURLProtocol
.
WKWebView
possède une propriété navigationDelegate
. Si ce délégué est défini, WKWebView
appellera la méthode didReceiveAuthenticationChallenge
sur ce délégué si la méthode est implémentée. Vous devez placer votre code d'authentification dans cette méthode. Exemple:
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler {
NSURLCredential *credential = [[NSURLCredential alloc] initWithUser:@"bob"
password:@"pass"
persistence:NSURLCredentialPersistenceNone];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}
Essayez cette approche: https://github.com/WildDylan/WKWebViewWithURLProtocol/tree/master/Example/WKWebViewWithURLProtocol
Il peut s'agir d'une API privée - je ne suis pas sûr;)
Si vous utilisez URLProtocol uniquement pour l'authentification, il existe un autre moyen d'y parvenir.
Comme lorsque vous avez obtenu un code d'erreur -1202 de didFailLoad, et effectuez une connexion URLConnection pour faire la chose d'authentification, rechargez la page après.
En fait, je dois également utiliser URLProtocol avec WKWebView, lol ~