2016-11-05 49 views
0

我一直無法在iOS Objective-C JavaScriptCore JSContext中運行proj4.js(預測Javascript,http://proj4js.org)。在嘗試在上下文中運行它之後,proj4函數不能用於後來嘗試在同一個JSContext中運行的Javascript代碼。無法運行JavaScriptCore中的proj4.js JSContext

能夠在JSContext的Javascript異常處理後,我發現我得到下面的異常試圖運行proj4.js時:

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

我已經成功地運行通過一些在WKWebView相同proj4.js加載腳本的HTML。在那裏工作很好。但我現在需要它運行在JSContext中,我使用它並將對象從Javascript輸出轉換爲Objective-C對象。

下面是失敗的代碼:

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的最後一行,它工作正常。例如,

[context evaluateScript:@"1 + 1"]; 

因此看起來上下文本身是功能性的。也許在JSContext的環境或配置中存在一些問題,但我想不出什麼。

編輯:在導致異常proj4.js該生產線是:

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

那麼這將表明,無論是「窗口」和「全球」也不是「自我」的JSContext環境中定義(我認爲?)。我是JavaScriptCore的新手(對於JavaScript來說屬於中等新手),所以我不確定從哪裏開始(但我會繼續研究)。

回答

0

根據對我的問題的編輯,'window','global'和'self'都不會在新的JSContext中定義。這對'窗口'有意義(對'全球'或'自我'不太確定!!!)。

所以有,我想出了兩種可能的解決方法:

  1. 這首先修復功能proj4.js,但我需要運行兩個後續的JavaScript不起作用。此修復程序是嘗試運行proj4.js前只需添加的Objective-C代碼以下行:

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

那麼問題線(在我的原代碼的最後一行在原來的問題)運行良好!

  1. 此修補程序更全面,它適用於任何可以在普通Web瀏覽器中運行的JavaScript。但是,這更爲嚴厲。對於這個解決方案所需的唯一改變是更換JSContext「初始化」線路從一個UIWebView得到JSContext:

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

雖然我寧願避免初始化Web視圖,有太多許多缺少的組件爲複雜的Javascript使用原始JSContext。我還喜歡使用WKWebView而不是UIWebView,但目前,WKWebView的JSContext不可用。