WKWebview - Communication complexe entre Javascript & amp; code natif
Dans WKWebView nous pouvons appeler ObjectiveC/swift code en utilisant webkit gestionnaires de messages
par exemple: webkit.messageHandlers.<handler>.pushMessage(message)
Il fonctionne bien pour de simples fonctions javascript sans paramètres. Mais;
- Est-il possible de faire appel à du code natif avec JS fonction de rappel comme paramètres?
- Est-il possible de renvoyer une valeur à la JS fonction de code natif?
source d'informationauteur Clement Prem
Vous devez vous connecter pour publier un commentaire.
Malheureusement, je ne pouvais pas trouver une solution native.
Mais la solution de contournement suivante résolu mon problème
L'utilisation de javascript promesses & vous pouvez appeler le résoudre fonction de votre iOS code.
Mise à JOUR
C'est comment vous pouvez utiliser promesse
En JS
dans iOS
Appeler le
window.onMessageReceive
de la fonction avec le gestionnaire approprié idIl y a un moyen d'obtenir une valeur de retour vers JS du code natif à l'aide de WkWebView. C'est un peu bidouille mais qui fonctionne bien pour moi, sans problèmes, et notre production à l'application utilise beaucoup de JS/Native de la communication.
Dans le WKUiDelegate affecté à la WKWebView, remplacer la RunJavaScriptTextInputPanel. Il utilise de la manière que le délégué poignées de la JS fonction invite à le faire:
Dans mon cas, je suis de passage type de données=xyz,nom=xyz,data=xyz pour passer le args. Mon ToUiSynch() code traite la demande et renvoie toujours une chaîne de caractères, qui remonte à la JS comme une simple valeur de retour.
Dans le JS, je suis simplement en appelant le prompt() fonction avec mon formaté args chaîne et d'obtenir une valeur de retour:
XWebView est le meilleur choix actuellement. Il peut automatiquement exposer des objets natifs de l'environnement javascript.
Pour la question 2, vous devez réussir un JS fonction de rappel natif pour obtenir le résultat, parce que la communication synchronisée JS natif est impossible.
Pour Plus de détails, consultez les l'échantillon app.
Cette réponse repose sur l'idée de Nathan Brown réponse ci-dessus.
Autant que je sache, il n'existe actuellement aucun moyen de retourner des données à javascript synchrone. Espérons qu'apple offrira une solution pour l'avenir.
Donc hack est d'intercepter l'invite appels js.
Apple fourni cette fonctionnalité afin de montrer natif popup design lors de la js appelle l'alerte, rapide etc.
Maintenant, depuis l'invite de la fonctionnalité, où vous montrez les données à l'utilisateur (nous allons exploiter cette méthode param ) et la réponse de l'utilisateur pour ce message sera retourné à js (nous allons exploiter ce que le retour de données)
Chaîne de caractères peut être retourné.
Ce qui se passe dans synchrone.
Nous pouvons mettre en œuvre l'idée ci-dessus comme suit:
À la javascript fin:
appel de la swift méthode de la manière suivante:
À la swift/xcode fin procédez comme suit:
Mettre en œuvre le protocole
WKUIDelegate
et puis d'affecter la mise en œuvre de WKWebviewsuiDelegate
propriété comme cela:Maintenant écrire ce
func webView
à remplacer (?) /intercepter la demande pourprompt
à partir de javascript.Si vous n'appelez pas la
completionHandler()
puis js exécution ne sera pas traitée. Maintenant parser le json et téléphoner swift méthode.J'ai une solution de contournement pour la question1.
PostMessage avec JavaScript
Poignée dans votre Objectif-C projet
Vous ne pouvez pas.
@Clément mentionné, vous pouvez utiliser des promesses et de l'appel de la détermination de la fonction.
Assez bon état (bien que l'utilisation de Différé qui est considéré comme l'anti-modèle maintenant) exemple est GoldenGate.
En Javascript, vous pouvez créer l'objet avec les deux méthodes: d'expédition et de les résoudre:
(J'ai compilé cs de js pour faciliter la lecture)
Puis vous appelez
Et de l'iOS côté:
Veuillez considérer ce grand article à propos de promesses