2014-04-14 4 views
6

Pozwól mi wyjaśnić moje pytanie, które od dawna mnie dręczy. Każda pomoc zostanie doceniona. Proszę pomóż.Nie można wywołać natywnych funkcji systemu iOS z interfejsu UIWebView przy użyciu kodu JavaScriptCore i JSContext

Pracuję nad hybrydowym typem aplikacji na iOS. Używam UIWebView do ładowania stron internetowych z http://myserver.com (jego przykład to nie rzeczywisty adres URL) Mam hostowane wiele stron internetowych na tym serwerze.

Używam "JSContext" do komunikowania się między javascript (stron załadowanych z mojego serwera) w UIWebView i natywnych funkcji iOS.

Podążyłem za procedurą podaną pod UIWebView JavaScript losing reference to iOS JSContext namespace (object) kontekst został zgubiony, ale dodałem obejście dostarczone w rozwiązaniu tego pytania. Wydarzenie dla niektórych obciążeń wewnątrz ramki UIWebView mój kontekst iOS znika. Po wykonaniu poniższych kroków kontekst znika.

  1. załadować PAGE1 z mójserwer w UIWebView. Prawie wszystko działa dobrze Wszystkie funkcje Natywny system operacyjny iOS nazywa się od javascript.
  2. Teraz gdy drugi Strona2 jest ładowany w wyniku interakcji w Strona1, w samym UIWebViewjavascript kontekście pobiera zniknął.

Jest jeszcze jedna magiczna rzecz. jeśli bezpośrednio załaduję stronę2 w UIWebView zamiast ładowania pośredniego (strona1 ->strona2). Wszystko działa dobrze, wszystkie metody natywne są wywoływane z poziomu UIwebView zgodnie z oczekiwaniami. Proszę o pomoc. Jeśli chcesz uzyskać więcej informacji, zapytaj.

+0

Czy to duplikat dla http://stackoverflow.com/questions/21714365/uiwebview-javascript-losing-reference-to-ios-jscontext-namespace-object? – Andy

+0

To samo dzieje się na http://stackoverflow.com/questions/21714365/uiwebview-javascript-losing-reference-to-ios-jscontext-namespace-object. Po załadowaniu nowej strony nowa strona otrzymuje nowy JSContext. Wspomniałeś o obciążeniu ramek. Czy ramka ma poprawnie ustawiony zestaw JSContext? – pwc

+0

Kiedy część strony ładuje się bez wywoływania webViewDidFinishedloading. Nie mogę ustawić JSContext dla takiego żądania. – jnix

Odpowiedz

2

Po pierwsze kradzież i używanie w tym kontekście JavaScriptContext interfejsu UIWebView jest prawdopodobnie ścieżką do odrzucenia aplikacji.

Ale jeśli jest to tylko projekt naukowy ...

Można spróbować innej techniki dla uzyskania JavaScriptContext. Przedstawiam rozwiązanie w tym projekcie GitHub:

https://github.com/TomSwift/UIWebView-TS_JavaScriptContext

Zasadniczo używam pewną wiedzę o tym, jak działa WebKit wdrożyć kategorię na NSObject przechwycić pewnymi mało handeled metod WebKit delegata które nazywane gdy nowy Kontekst JavaScript jest tworzony dla ramki.

+0

Dzięki za odpowiedź, ale - (void) webView: (UIWebView *) webView didCreateJavaScriptContext: (JSContext *) ctx { ctx [@ "myinterface"] = self; lub ctx [@ "window.myinterface"] = self; } ' } I moje html nazywające' window.myinterface.mynativefunc ('hello'); 'nie jest wywoływane w ogóle. Proszę o pomoc. – jnix

+0

czy przykładowa aplikacja działa dla Ciebie? – TomSwift

+0

Tak. Zadziałało. – jnix