UIWebView délégué méthode shouldStartLoadWithRequest: équivalent en WKWebView?
J'ai un module à l'intérieur de mon iOS 7+ app qui est une UIWebView. La page html charges un javascript qui crée personnalisée en forme de boutons (à l'aide de la Raphaeljs de la bibliothèque). Avec UIWebView, j'ai mis délégué à l'autonomie. Le délégué de la méthode webView: shouldStartLoadWithRequest: navigationType:
est appelée à chaque fois que l'un de mes personnalisé bouton est pressé. Les demandes ne doivent pas être manipulés par le html, mais plutôt par l'iOS code. J'ai donc utilisé une demande de convention (lu quelque part ici sur stackoverflow) à l'aide de "dans des applis" comme le schéma de mes demandes. Je vérifie pour l'hôte et de prendre les mesures appropriées.
Ce code fonctionne très bien sur iOS 7. Mais le web vues apparaissent en blanc sur iOS 8 (bug?), j'ai donc décidé d'utiliser WKWebView pour iOS 8 appareils. Les vues web maintenant rendre bien (et étonnamment, plus rapide!), mais mes boutons n'ont aucun effet.
J'ai essayé d'utiliser - (WKNaviation *)loadRequest:(NSURLRequest *)request
, mais il n'est pas appelé.
Je ne peux pas trouver un équivalent de la UIWebView délégué méthode webView: shouldStartLoadWithRequest: navigationType:
. Quelle est la meilleure façon de répondre à ces demandes avec WKWebView?
Vous devez vous connecter pour publier un commentaire.
Re-lecture de votre description, il semble comme ce que vous avez réellement besoin de savoir comment ré-écrire un script Javascript/Objective-C pont à l'aide de WKWebView.
Je viens de faire moi-même, en suivant le tutoriel à http://tetontech.wordpress.com/2014/07/17/objective-c-wkwebview-to-javascript-and-back/ et l'info à http://nshipster.com/wkwebkit/
WKWebView est doté d'un moyen de communication entre Javascript et Objective-C/Swift:
WKScriptMessageHandler
.Tout d'abord, incorporez le WebKit-têtes et
WKScriptMessageHandler
protocole dans la vue du contrôleur d'en-tête:La lors de l'initialisation de votre
WKWebView
, vous devez configurer à l'aide d'un script gestionnaire de messages. Nommez tout ce que vous voulez, mais pour moi, il semble que le nommant pour votre application fait sens.Maintenant, de mettre en œuvre
userContentController:didReceiveScriptMessage:
. Cela déclenche lorsque votre webview reçoit un message, de sorte qu'il ne le travail que vous aviez déjà fait avecwebView:shouldStartLoadWithRequest:navigationType:
.Vous êtes maintenant prêt à recevoir des messages à partir de Javascript. L'appel de la fonction, vous devez ajouter à votre Javascript est: est-ce
J'ai été à la recherche d'une bonne explication de moi, mais je n'ai pas trouvé un. J'ai utilisé dans mon application et tout semble fonctionner (Edit: mise à jour basé sur ccoroom commentaire):
Voici les autres
UIWebViewDelegate
méthodes:J'aimerais quelqu'un pour confirmer cela pour moi.
Edit: en Fait, j'ai répondu à la question qui a été posée dans le titre (bien que je ne suis plus confiant que
webView:didCommitNavigation:
est appelé à l'exact même moment dans le cycle de vie), mais re-lecture de votre description, il semble comme ce que vous avez réellement besoin de savoir comment ré-écrire un script Javascript/Objective-C pont à l'aide de WKWebView. Donc un coup d'oeil à mon autre réponse.WKNavigationAction.request
) dans- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
Vous devez utiliser au-dessus de la méthode du délégué à la place dewebView:shouldStartLoadWithRequest:navigationType:
.Pour répondre à la question d'origine, l'équivalent de
webView:shouldStartLoadWithRequest:navigationType:
dans UIWebView estwebView:decidePolicyForNavigationAction:decisionHandler:
dans WKWebView. Ces méthodes sont appelées avant chaque demande est faite (y compris la demande initiale) et offrent la possibilité d'autoriser/interdire cela.Suffit d'utiliser la méthode suivante , c'est une partie de WKNavigationDelegate
Dans Swift vous pouvez faire quelque chose comme ceci:
Et c'est le lien dans la page web:
pour swift 4.2:
(la prise de Yifei Il 何一非. )
Vous pouvez ajouter Observateur pour votre WKWebView
N'oubliez pas de le supprimer dans viewWillDisappear