Je travaille sur une application où je vais utiliser à la fois HTML5 dans UIWebView et le framework iOS natif ensemble. Je sais que je peux implémenter la communication entre JavaScript et Objective-C. Existe-t-il des bibliothèques qui simplifient la mise en œuvre de cette communication? Je sais qu'il existe plusieurs bibliothèques pour créer des applications iOS natives en HTML5 et javascript (par exemple AppMobi, PhoneGap), mais je ne suis pas sûr qu'il existe une bibliothèque pour aider à créer des applications iOS natives avec une utilisation intensive de JavaScript. J'ai besoin de:
- Exécuter des méthodes JS à partir d'Objective-C
- Exécuter des méthodes Objective-C à partir de JS
- Écoutez les événements JS natifs d'Objective-C (par exemple, l'événement DOM ready)
javascript
ios
html
uiwebview
andr111
la source
la source
Réponses:
Il existe quelques bibliothèques, mais je n'en ai utilisé aucune dans de grands projets, vous voudrez peut-être les essayer:
-
Cependant, je pense que c'est quelque chose d'assez simple pour que vous puissiez l'essayer vous-même. J'ai personnellement fait exactement cela quand j'avais besoin de le faire. Vous pouvez également créer une bibliothèque simple qui répond à vos besoins.
1. Exécutez les méthodes JS à partir d'Objective-C
Ce n'est en réalité qu'une seule ligne de code.
Plus de détails sur la documentation officielle d' UIWebView .
2. Exécutez les méthodes Objective-C à partir de JS
Ceci est malheureusement un peu plus complexe, car il n'y a pas la même propriété windowScriptObject (et la même classe) qui existe sur Mac OSX permettant une communication complète entre les deux.
Cependant, vous pouvez facilement appeler à partir d'URL personnalisées javascript, telles que:
Et interceptez-le d'Objective-C avec ceci:
Ce n'est pas aussi propre qu'il devrait l'être (ou en utilisant windowScriptObject) mais cela fonctionne.
3. Écoutez les événements JS natifs d'Objective-C (par exemple, l'événement DOM ready)
D'après l'explication ci-dessus, vous voyez que si vous voulez faire cela, vous devez créer du code JavaScript, le joindre à l'événement que vous souhaitez surveiller et appeler le bon
window.location
appel pour être ensuite intercepté.Encore une fois, pas propre comme il se doit, mais cela fonctionne.
la source
La méthode suggérée pour appeler l'objectif c depuis JS dans la réponse acceptée n'est pas recommandée. Un exemple de problèmes: si vous effectuez deux appels consécutifs immédiats, l'un est ignoré (vous ne pouvez pas changer d'emplacement trop rapidement).
Je recommande l'approche alternative suivante:
Vous appelez la
execute
fonction à plusieurs reprises et comme chaque appel s'exécute dans sa propre iframe, ils ne doivent pas être ignorés lorsqu'ils sont appelés rapidement.Crédits à ce gars .
la source
Mise à jour: cela a changé dans iOS 8. Ma réponse s'applique aux versions précédentes.
Une alternative, qui peut vous faire rejeter de l'App Store, consiste à utiliser WebScriptObject.
Ces API sont publiques sur OSX mais pas sur iOS.
Vous devez définir des interfaces avec les classes internes.
Vous devez définir votre objet qui servira de WebScriptObject
Maintenant, définissez cette instance sur votre UIWebView
Maintenant, dans votre javascript, vous pouvez appeler:
la source
Dans iOS8, vous pouvez consulter WKWebView au lieu de UIWebView . Cela a la classe suivante: WKScriptMessageHandler: Fournit une méthode pour recevoir des messages de JavaScript s'exécutant dans une page Web.
la source
WKWebView
a beaucoup de problèmes, y compris une mauvaise gestion des cookies. Juste un avertissement pour quiconque vient ici pensant que cela résoudra tous vos problèmes - recherchez un peu sur Google avant de l'adopter.Ceci est possible avec iOS7, consultez http://blog.bignerdranch.com/3784-javascriptcore-and-ios-7/
la source
Votre meilleur pari est l'offre Appcelerators Titanium. Ils ont déjà construit un pont javascript Obj-C en utilisant le
moteurJavascriptCore du moteurV8utilisé par webkit. Il est également open source, vous pourrez donc le télécharger et bricoler l'Obj-C comme vous le souhaitez.la source
Jetez un œil au projet KirinJS: Kirin JS qui permet d'utiliser Javascript pour la logique applicative et l'interface utilisateur native adaptée à la plateforme sur laquelle il s'exécute.
la source
J'ai créé une bibliothèque comme WebViewJavascriptBridge, mais elle ressemble plus à JQuery, est plus facile à configurer et à utiliser. Ne repose pas sur jQuery (bien qu'à son crédit, si j'avais su que WebViewJavascriptBridge existait avant d'écrire ceci, je me serais peut-être un peu retenu avant de plonger). Laissez-moi savoir ce que vous pensez! jockeyjs
la source
Si vous utilisez WKWebView sur iOS 8, jetez un œil au XWebView qui peut automatiquement exposer l'interface native à javascript.
la source