Estou trabalhando em um aplicativo em que vou usar HTML5 no UIWebView e a estrutura nativa do iOS juntos. Eu sei que posso implementar a comunicação entre JavaScript e Objective-C. Existem bibliotecas que simplificam a implementação desta comunicação? Eu sei que existem várias bibliotecas para criar aplicativos iOS nativos em HTML5 e javascript (por exemplo AppMobi, PhoneGap), mas não tenho certeza se existe uma biblioteca para ajudar a criar aplicativos iOS nativos com uso intenso de JavaScript. Eu preciso:
- Execute métodos JS de Objective-C
- Execute métodos Objective-C de JS
- Ouça eventos JS nativos de Objective-C (por exemplo, evento pronto para DOM)
javascript
ios
html
uiwebview
andr111
fonte
fonte
Respostas:
Existem algumas bibliotecas, mas não usei nenhuma em grandes projetos, então você pode querer experimentá-las:
-
No entanto, acho que é algo simples o suficiente para que você possa experimentar. Eu pessoalmente fiz exatamente isso quando precisei fazer isso. Você também pode criar uma biblioteca simples que atenda às suas necessidades.
1. Execute métodos JS de Objective-C
Esta é realmente apenas uma linha de código.
Mais detalhes na documentação oficial do UIWebView .
2. Execute métodos Objective-C de JS
Infelizmente, isso é um pouco mais complexo, porque não há a mesma propriedade windowScriptObject (e classe) que existe no Mac OSX, permitindo a comunicação completa entre os dois.
No entanto, você pode chamar facilmente a partir de URLs javascript personalizados, como:
E intercepte-o do Objective-C com este:
Isso não é tão claro quanto deveria (ou usando windowScriptObject), mas funciona.
3. Ouça eventos JS nativos de Objective-C (por exemplo, evento pronto para DOM)
A partir da explicação acima, você vê que se quiser fazer isso, você deve criar algum código JavaScript, anexá-lo ao evento que deseja monitorar e chamar a
window.location
chamada correta para ser interceptada.Novamente, não está limpo como deveria, mas funciona.
fonte
O método sugerido de chamar o objetivo c de JS na resposta aceita não é recomendado. Um exemplo de problemas: se você fizer duas chamadas consecutivas imediatamente, uma será ignorada (você não pode mudar de local muito rapidamente).
Eu recomendo a seguinte abordagem alternativa:
Você chama a
execute
função repetidamente e, como cada chamada é executada em seu próprio iframe, elas não devem ser ignoradas quando chamadas rapidamente.Créditos para esse cara .
fonte
Atualização: isso mudou no iOS 8. Minha resposta se aplica às versões anteriores.
Uma alternativa, que pode fazer com que você seja rejeitado na app store, é usar WebScriptObject.
Essas APIs são públicas no OSX, mas não no iOS.
Você precisa definir interfaces para as classes internas.
Você precisa definir o seu objeto que servirá como seu WebScriptObject
Agora defina que uma instância para seu UIWebView
Agora, dentro do seu javascript, você pode chamar:
fonte
No iOS8, você pode olhar para WKWebView em vez de UIWebView . Tem a seguinte classe: WKScriptMessageHandler: fornece um método para receber mensagens de JavaScript em execução em uma página da web.
fonte
WKWebView
tem muitos problemas, incluindo o não manuseio adequado dos cookies. Apenas um aviso para quem vier aqui pensando que vai resolver todos os seus problemas - dê uma olhada antes de adotar.Isso é possível com iOS7, confira http://blog.bignerdranch.com/3784-javascriptcore-and-ios-7/
fonte
Sua melhor aposta é a oferta de Appcelerators Titanium. Eles já construíram uma ponte javascript Obj-C usando o
motor V8JavascriptCore usado pelo webkit. Também é um código aberto, então você poderá baixá-lo e mexer no Obj-C como quiser.fonte
Dê uma olhada no projeto KirinJS: Kirin JS que permite usar Javascript para a lógica da aplicação e UI nativa adequada à plataforma em que roda.
fonte
Eu criei uma biblioteca como WebViewJavascriptBridge, mas é mais parecida com JQuery, é mais fácil de configurar e é mais fácil de usar. Não depende do jQuery (embora, para seu crédito, se eu soubesse que o WebViewJavascriptBridge existia antes de escrever isso, poderia ter me contido um pouco antes de mergulhar). Diz-me o que pensas! jockeyjs
fonte
Se você estiver usando WKWebView no iOS 8, dê uma olhada no XWebView, que pode expor automaticamente a interface nativa para javascript.
fonte