Pracuję nad aplikacją, w której mam zamiar używać zarówno HTML5 w UIWebView, jak i natywnej struktury iOS. Wiem, że potrafię zaimplementować komunikację między JavaScript a Objective-C. Czy są jakieś biblioteki, które ułatwiają wdrażanie tej komunikacji? Wiem, że istnieje kilka bibliotek do tworzenia natywnych aplikacji na iOS w HTML5 i javascript (na przykład AppMobi, PhoneGap), ale nie jestem pewien, czy istnieje biblioteka pomagająca w tworzeniu natywnych aplikacji na iOS z dużym wykorzystaniem JavaScript. Potrzebuję:
- Wykonaj metody JS z Objective-C
- Wykonaj metody Objective-C z JS
- Słuchaj natywnych zdarzeń JS z Objective-C (na przykład zdarzenia DOM ready)
javascript
ios
html
uiwebview
andr111
źródło
źródło
Odpowiedzi:
Jest kilka bibliotek, ale nie korzystałem z żadnej z nich w dużych projektach, więc możesz je wypróbować:
-
Myślę jednak, że jest to coś na tyle prostego, że możesz spróbować samemu. Osobiście zrobiłem to dokładnie, kiedy musiałem to zrobić. Możesz także utworzyć prostą bibliotekę, która odpowiada Twoim potrzebom.
1. Wykonaj metody JS z Objective-C
To naprawdę tylko jedna linia kodu.
Więcej szczegółów w oficjalnej dokumentacji UIWebView .
2. Wykonaj metody Objective-C z JS
Jest to niestety nieco bardziej złożone, ponieważ nie ma tej samej właściwości (i klasy) windowScriptObject, która istnieje w systemie Mac OSX, umożliwiając pełną komunikację między nimi.
Możesz jednak łatwo dzwonić z niestandardowych adresów URL javascript, takich jak:
I przechwyć to z Objective-C tym:
Nie jest to tak czyste, jak powinno (lub przy użyciu windowScriptObject), ale działa.
3. Słuchaj natywnych zdarzeń JS z Objective-C (na przykład zdarzenia DOM ready)
Z powyższego wyjaśnienia widać, że jeśli chcesz to zrobić, musisz utworzyć kod JavaScript, dołączyć go do zdarzenia, które chcesz monitorować, i wywołać prawidłowe
window.location
wywołanie, które zostanie następnie przechwycone.Ponownie, nie jest czysty, jak powinien, ale działa.
źródło
Sugerowany sposób wywoływania celu c z JS w zaakceptowanej odpowiedzi nie jest zalecany. Przykład problemu: jeśli wykonasz dwa natychmiastowe połączenia, jedno jest ignorowane (nie możesz zmienić lokalizacji zbyt szybko).
Polecam następujące alternatywne podejście:
Wywołujesz
execute
funkcję wielokrotnie, a ponieważ każde wywołanie jest wykonywane we własnym elemencie iframe, nie należy ich ignorować, gdy są wywoływane szybko.Podziękowania dla tego gościa .
źródło
Aktualizacja: Zmieniło się to w iOS 8. Moja odpowiedź dotyczy poprzednich wersji.
Alternatywą, która może spowodować odrzucenie ze sklepu z aplikacjami, jest użycie WebScriptObject.
Te interfejsy API są publiczne w systemie OSX, ale nie w systemie iOS.
Musisz zdefiniować interfejsy do klas wewnętrznych.
Musisz zdefiniować obiekt, który będzie służył jako obiekt WebScriptObject
Teraz ustaw to wystąpienie na swój UIWebView
Teraz w swoim javascript możesz zadzwonić:
źródło
W iOS8 możesz spojrzeć na WKWebView zamiast UIWebView . Ma następującą klasę: WKScriptMessageHandler: udostępnia metodę odbierania komunikatów z JavaScript uruchomionego na stronie internetowej.
źródło
WKWebView
ma wiele problemów, w tym nieprawidłową obsługę plików cookie. Tylko ostrzeżenie dla każdego, kto tu przychodzi, myśląc, że to rozwiąże wszystkie twoje problemy - poszukaj go trochę przed przyjęciem.Jest to możliwe z iOS7, sprawdź http://blog.bignerdranch.com/3784-javascriptcore-and-ios-7/
źródło
Najlepszym rozwiązaniem jest oferta Appcelerators Titanium. Zbudowali już most javascript Obj-C przy użyciu
silnika V8 silnikaJavascriptCore używanego przez webkit. Jest to również oprogramowanie typu open source, więc będziesz mógł go pobrać i majstrować przy Obj-C, jak chcesz.źródło
Przyjrzyj się projektowi KirinJS: Kirin JS, który pozwala na użycie JavaScript do logiki aplikacji i natywnego interfejsu użytkownika odpowiedniego dla platformy, na której działa.
źródło
Stworzyłem bibliotekę taką jak WebViewJavascriptBridge, ale jest bardziej podobna do JQuery, jest łatwiejsza w konfiguracji i jest łatwiejsza w użyciu. Nie polega na jQuery (choć trzeba przyznać, że gdybym wiedział, że WebViewJavascriptBridge istniał przed napisaniem tego, mógłbym się nieco powstrzymać przed zanurzeniem się). Powiedz mi co myślisz! jockeyjs
źródło
Jeśli używasz WKWebView na iOS 8, spójrz na XWebView, który może automatycznie udostępniać natywny interfejs do javascript.
źródło