web-dev-qa-db-fra.com

WKWebView et NSURLProtocol ne fonctionnent pas

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.

34
Johan

Réponse mise à jour pour iOS 11 et macOS 10.13

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:].

Ancienne réponse

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 NSURLProtocols 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.

48
Leo Natan

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);
}
3
Cloud9999Strife

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;)

1
Firuz Narzikulov

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 ~

0
ivanC