2016-11-05 8 views
0

iOS Objective-C JavaScriptCore JSContextでproj4.js(projections Javascript、http://proj4js.org)を実行できませんでした。コンテキストで実行しようとすると、proj4関数は、同じJSContextで実行しようとしている後続のJavascriptコードでは使用できません。JavaScriptCore JSContextでproj4.jsを実行できません

なJSContext上の取扱いJavascriptの例外を有効にした後、私はproj4.jsを実行しようとしたとき、私は次の例外を取得することを見つける:

TypeError: undefined is not an object (evaluating 'b.proj4=a()')

私は成功し、いくつかの経由WKWebViewで同じproj4.jsを実行しましたスクリプトをロードするHTML。そこでうまく動作します。しかし、私はそれを使用してJavascript出力からObjective-Cオブジェクトにオブジェクトを変換するJSContextで実行する必要があります。

NSString *proj4Path = [[NSBundle mainBundle] pathForResource:@"proj4" ofType:@"js" inDirectory:@"proj4"]; 
    NSString *proj4JS = [NSString stringWithContentsOfFile:proj4Path usedEncoding:nil error:nil]; 
    JSContext *context = [[JSContext alloc] init]; 
    context.exceptionHandler = ^(JSContext *context, JSValue *exception) { 
     NSLog(@"JAVASCTIPT EXCEPTION: %@", exception); 
    }; 
    [context evaluateScript:proj4JS]; // FAILS HERE 

を、私は非常に単純なJavaScriptで最後の行は、それが正常に動作することを交換する場合:

はここで失敗したコードです。たとえば、

したがって、コンテキスト自体は機能しているようです。おそらく、JSContextの環境や設定に問題がありますが、私は何も考えることはできません。

EDIT:例外が発生しproj4.jsの行は次のとおりです。

"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.proj4=a() 

だから、これは「ウィンドウ」も「グローバル」や「自己」のいずれもがなJSContext環境で定義されていることを示すことになる(I思う?)。私はJavaScriptCoreを新しくしています(JavaScriptには少し新機能です)ので、ここからどこに行くのかは分かりません(でも私は研究を続けます)。

答えて

0

私の質問に対する編集によれば、 'window'も 'global'も 'self'も新しいJSContextでは定義されていないようです。これは 'window'(それは 'global'または 'self'についてはあまり確実ではありません!!!)です。

だから私が思いついた二つの可能な修正があります。

  1. は、この最初の修正はproj4.jsのために動作しますが、私は実行するために必要な二つの連続するJavaScriptは動作しません。この修正は、単にproj4.jsを実行する前に、Objective-Cのコードの次の行を追加しました:

    [context evaluateScript:@"var global = this;"]; 
    

、問題行(元の質問の私の元のコードの最後の行)うまく動作します!

  1. この修正プログラムは、通常のWebブラウザで実行できるJavaScriptであれば動作するはずです。しかし、それはより重い手です。このソリューションに必要な唯一の変更はのUIWebViewからなJSContextを取得するためになJSContext「のinit」行を置き換えることです:

    JSContext * context = [[[UIWebView alloc] init] valueForKeyPath : @"documentView.webView.mainFrame.javaScriptContext" ]; 
    

私は、Webビューをインスタンス化を避けることを好むだろうが、あまりにもあります複雑なJavascriptのために生のJSContextを使用する多くの欠落したコンポーネントまた、UIWebViewではなくWKWebViewを使用することをお勧めしますが、現時点では、WKWebViewのJSContextは使用できません。

関連する問題