Estoy trabajando en una aplicación en la que usaré HTML5 en UIWebView y el marco nativo de iOS juntos. Sé que puedo implementar la comunicación entre JavaScript y Objective-C. ¿Existen bibliotecas que simplifiquen la implementación de esta comunicación? Sé que hay varias bibliotecas para crear aplicaciones nativas de iOS en HTML5 y javascript (por ejemplo, AppMobi, PhoneGap), pero no estoy seguro de si existe una biblioteca para ayudar a crear aplicaciones nativas de iOS con un uso intensivo de JavaScript. Necesito:
- Ejecutar métodos JS desde Objective-C
- Ejecutar métodos Objective-C desde JS
- Escuche eventos JS nativos de Objective-C (por ejemplo, evento listo para DOM)
javascript
ios
html
uiwebview
andr111
fuente
fuente
Respuestas:
Hay algunas bibliotecas, pero no utilicé ninguna de estas en proyectos grandes, por lo que es posible que desee probarlas:
-
Sin embargo, creo que es algo lo suficientemente simple como para que lo pruebes tú mismo. Personalmente hice exactamente esto cuando necesitaba hacer eso. También puede crear una biblioteca simple que se adapte a sus necesidades.
1. Ejecute métodos JS desde Objective-C
En realidad, esta es solo una línea de código.
Más detalles sobre la documentación oficial de UIWebView .
2. Ejecutar métodos Objective-C desde JS
Desafortunadamente, esto es un poco más complejo, porque no existe la misma propiedad (y clase) windowScriptObject que existe en Mac OSX que permita una comunicación completa entre los dos.
Sin embargo, puede llamar fácilmente desde URL personalizadas de JavaScript, como:
E interceptarlo de Objective-C con esto:
Esto no es tan limpio como debería ser (o usando windowScriptObject) pero funciona.
3. Escuche eventos JS nativos de Objective-C (por ejemplo, evento listo para DOM)
De la explicación anterior, verá que si desea hacer eso, debe crear un código JavaScript, adjuntarlo al evento que desea monitorear y llamar a la
window.location
llamada correcta para que luego sea interceptada.Una vez más, no está limpio como debería estar, pero funciona.
fuente
No se recomienda el método sugerido para llamar al objetivo c desde JS en la respuesta aceptada. Un ejemplo de problemas: si realiza dos llamadas consecutivas inmediatas, una se ignora (no puede cambiar de ubicación demasiado rápido).
Recomiendo el siguiente enfoque alternativo:
Usted llama a la
execute
función repetidamente y, dado que cada llamada se ejecuta en su propio iframe, no deben ignorarse cuando se llaman rápidamente.Créditos a este chico .
fuente
Actualización: esto ha cambiado en iOS 8. Mi respuesta se aplica a versiones anteriores.
Una alternativa, que puede hacer que lo rechacen de la tienda de aplicaciones, es usar WebScriptObject.
Estas API son públicas en OSX pero no en iOS.
Necesita definir interfaces para las clases internas.
Necesita definir su objeto que servirá como su WebScriptObject
Ahora configure esa instancia en su UIWebView
Ahora, dentro de su javascript, puede llamar:
fuente
En iOS8 puede mirar WKWebView en lugar de UIWebView . Tiene la siguiente clase: WKScriptMessageHandler: proporciona un método para recibir mensajes de JavaScript que se ejecutan en una página web.
fuente
WKWebView
tiene muchos problemas, incluido el no manejar las cookies correctamente. Solo una advertencia para cualquiera que venga aquí pensando que resolverá todos sus problemas: busque en Google un poco antes de adoptarlo.Esto es posible con iOS7, consulte http://blog.bignerdranch.com/3784-javascriptcore-and-ios-7/
fuente
Su mejor apuesta es la oferta de Appcelerators Titanium. Ya han construido un puente javascript Obj-C utilizando el
motorJavascriptCore del motorV8utilizado por webkit. También es de código abierto, por lo que podrás descargarlo y jugar con el Obj-C como quieras.fuente
Eche un vistazo al proyecto KirinJS: Kirin JS que permite usar Javascript para la lógica de la aplicación y la interfaz de usuario nativa adecuada a la plataforma en la que se ejecuta.
fuente
Creé una biblioteca como WebViewJavascriptBridge, pero es más similar a JQuery, es más fácil de configurar y es más fácil de usar. No depende de jQuery (aunque para su mérito, si hubiera sabido que WebViewJavascriptBridge existía antes de escribir esto, podría haberme retenido un poco antes de sumergirme). ¡Déjame saber lo que piensas! jockeyjs
fuente
Si está utilizando WKWebView en iOS 8, eche un vistazo a XWebView que puede exponer automáticamente la interfaz nativa a javascript.
fuente