Comment faire de l'authentification dans UIWebView correctement?
Je tiens à soutenir l'Authentification HTTP de Base dans mon UIWebView.
En ce moment, je suis l'annulation de demandes en
webView:shouldStartLoadWithRequest:navigationType:
puis gérer dans ma propre NSURLConnectionDelegate pour vérifier et fournir des informations si nécessaire. J'utilise ensuite loadData:MIMEType:textEncodingName:baseURL:
à présent code HTML dans la vue web. Cela fonctionne bien pour toutes les Url qui sont transmis au délégué.
Mon problème est que le délégué n'est jamais appelé pour les éléments intégrés, tels que des images, JavaScript ou CSS. Donc, si j'ai une page HTML qui fait référence à une image qui est protégé avec l'authentification de base, l'image ne peut pas être chargé correctement. En outre, webView:didFinishLoad:
n'est jamais appelée, parce que le web ne peut pas charger complètement la page.
J'ai vérifié que le cas avec Terra, une tierce partie du navigateur disponible sur l'App Store, et il peut pleinement faire face à cette situation. Je pense qu'il serait possible de résoudre ce problème en fournissant mon propre NSURLProtocol, mais qui semble trop compliqué. Ce qui me manque?
- Hey NeoNacho, avez-vous trouver comment résoudre ce problème? J'ai le même problème je peux charger la page html, mais tous les css / javascript jamais chargé/correctement traitées. Si vous avez des conseils, faire part 🙂
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser sharedCredentialStorage pour tous les domaines, vous devez vous authentifier.
Ici est d'échantillon de travail pour UIWebView il a été testé sur Windows IIS avoir seulement BasicAuthentication activé
C'est comment ajouter vos informations d'identification de site:
Edit: même code Swift 4
Votre webView est censé travailler, maintenant, si cela ne fonctionne pas utiliser de code suivant pour déboguer, en particulier de vérifier les messages du journal didReceiveAuthenticationChallenge.
La solution finale pour WebView l'authentification est basée sur un protocole personnalisé de mise en œuvre. Tous les protocoles enregistrés comme une pile, de sorte que si vous redéfinir le protocole HTTP, il serait d'intercepter toutes les requêtes venant de webView, donc vous devez vérifier les attributs assotiated avec demande entrante et rangez-la dans nouvelle demande et l'envoyer à nouveau par l'intermédiaire de votre propre connexion. Puisque vous êtes dans la pile, votre demande immidiatly vient à vous et vous devez l'ignorer. Donc, il va vers le bas de la pile de protocole à la réelle mise en œuvre du protocole HTTP, depuis votre demande n'est pas athenticated vous aurez authenticaiton demande. Et après authenticaiton vous obtiendrez une réponse véritable à partir du serveur, de sorte que vous remballer la réponse et la réponse à la demande initiale reçue de webView et c'est tout.
Ne t essayer de créer de nouvelles demandes ou des réponses d'organes, vous avez juste à leur renvoyer. Le code final serait aproximetly de 30 à 40 lignes de code, et il est assez simple, mais nécessite beaucoup de debuging et tetsing.
Unfortunatlly je ne peux pas fournir le code ici, depuis que je suis assigné à différents projets déjà, je voulais juste dire que mon post est mal, il stucks lorsque l'utilisateur change de mot de passe.
Le secret de l'authentification HTTP de base à l'aide de cacao est de savoir NSURL et les classes associées.
La vraie magie vient de NSURLConnection. Dans les mots de la devDocs, "Un NSURLConnection objet fournit un soutien pour effectuer le chargement d'une requête d'URL." Si vous voulez charger une URL dans le fond sans l'afficher, vous utilisez NSURLConnection. La puissance réelle de la NSURLConnection est dans la méthode
La NSURLConnectionDelegate protocole a des méthodes pour répondre à la réussite des connexions, des erreurs fatales, et les défis de l'authentification. Si vous tentez d'accéder à des données Protégées par une authentification HTTP de base c'est comment le Cacao a fait. À ce stade, un exemple devrait apporter un peu de clarté.
Cela crée une URL. À partir de l'URL URLRequest est créé. Le URLRequest est ensuite chargé dans la vue web. La Demande est également utilisé pour faire une URLConnection. Nous n'avons pas vraiment utiliser la connexion, mais nous avons besoin de recevoir des notifications sur l'authentification nous avons donc mis le délégué. Il n'existe que deux méthodes, nous avons besoin de le déléguer.
Chaque fois qu'il y a un défi d'authentification des informations d'identification est ajouté pour le stockage des identifiants. Vous dites également la connexion à utiliser le stockage des identifiants.
J'ai juste mis en œuvre par la constitution d'basic auth informations d'identification à l'aide d'un
NSMutableURLRequest
pour laUIWebView
. Cela permet aussi d'éviter les aller-retour encourus lors de la mise en œuvre desharedCredentialStorage
(bien sûr il y a des concessions à faire).Solution:
Vous pouvez saisir le NSData+Base64 catégorie qui met en œuvre la
base64EncodedString
pour NSData de Matt Gallagher page (il était au bas de l'article du blog quand je l'ai téléchargé)[NSURLRequest basicAuthHTTPURLRequestForUrl:url];
Comment les définitions précédentes même influence que la demande?Pour TKAURLProtocolPro [http://kadao.dir.bg/cocoa.htm]
Pour SVWebViewController [https://github.com/samvermette/SVWebViewController]
Assurez-vous de se rappeler que la déconnexion n'est pas si facile avec les sessions et UIWebView informations d'identification. Voir la réponse ici: https://stackoverflow.com/a/18143902/2116338.