2016-11-05 50 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不可用。