Pouvez-vous intercepter NSURLRequests dans un UIWebView sans casser le bouton de retour?
Je vais avoir des problèmes pour charger HTML personnalisé dans mon UIWebView
sans casser sa goBack
méthode.
Ce Qui Fonctionne
Je suis d'intercepter les demandes d'URL de mon UIWebView
donc je peux charger HTML personnalisé. J'ai le contrôle sur tout le HTML, donc j'ai mon application spéciale qui demande l'utilisation d'un modèle personnalisé (ie. myapp://arg1/?arg2=val
) que je ne peux analyser dans webView:shouldStartLoadWithRequest:navigationType:
. Je décide de ce que HTML, j'ai vraiment envie de charger et appeler loadHTMLString:baseURL
et retour NO
pour annuler la demande d'origine.
Ce qui Ne fonctionne pas
Ci-dessus fonctionne très bien. Le problème est que je veux profiter de la UIWebView's
goBack
méthode et loadRequest:
semble être la seule UIWebView
méthode qui ajoute à son histoire de la pile.
J'ai quelques idées, mais je ne suis pas sûr de ce qui est réalisable et comment le faire. La chose principale semble être que j'ai du renvoyer YES
dans webView:shouldStartLoadWithRequest:navigationType
et je dois utiliser UIWebView
's loadRequest
méthode.
Idée 1: Modifier NSURLRequest/Réponse:
Puis-je sous-classe NSURLRequest de façon à ce que lorsque la UIWebView en fait la demande), il n'est pas réellement faire une requête HTTP et renvoie un NSURLResponse avec mon code HTML? Ou peut-être modifier/sous-classe/ajouter une catégorie méthode de NSURLResponse en quelque sorte? J'aime l'idée d'être une vraie demande, mais je m'inquiète des Api privées et d'être rejeté à partir de l'App Store.
Idée 2: Gérer une URL personnalisée Protocole
Enregistrer une URL personnalisée protocole pour mon application répond et je peux l'avoir à retourner un légitime NSURLResponse (rempli avec mon code HTML personnalisé.)
Idée 3: Tromper le cache Créer la demande avec cette politique de cache NSURLRequestReturnCacheDataDontLoad
et puis en quelque sorte obtenir mon code HTML entre les webView et le cache?
Ou peut-être que je suis sur la mauvaise voie?
source d'informationauteur zekel
Vous devez vous connecter pour publier un commentaire.
Il y a un autre très intelligente approche qui je viens de tester: au Lieu de bricoler avec le
NSURLCache
ou la réécriture de l'ensemble de l'historique de navigation de code, il suffit de créer un personnaliséNSURLProtocol
qui est utilisé par la normeNSURLConnection
chaque fois qu'une requête HTTP. Là, vous créez votre propreNSURLRequest
pour charger les données et peut inspecter le type MIME, de modifier le contenu de la demande ou de données dans la mémoire cache sur le disque que vous s'il vous plaît. Cette idée vient de courtoisie de Rob Napier:http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588
Son code est maintenant aussi sur GitHub:
https://github.com/rnapier/RNCachingURLProtocol
J'aimerais tout d'abord essayer d'aller la route #3. Peut-être "La substitution de données locales à distance UIWebView les demandes" sur le Cacao avec l'Amour est utile pour vous.
Je déconseille l'une des méthodes ci-dessus.
J'ai eu #3 de travail, mais il était très, très fragiles et difficiles à déboguer. (Par exemple, Apple détruit et recrée
NSURLRequests
de sorte que vous ne pouvez pas sous-classe NSURLRequest et s'attendent à venir à travers dans la suite de la réponse).Il a fini par être (beaucoup) plus facile à ma propre histoire et de la note de la page à charger et la position de défilement (écran vertical offset).