如何将UIWebView javascript异常的sourceId与源文件相关联?

时间:2010-01-11 05:13:00

标签: javascript iphone uiwebview stringbyevaluatingjavascr

简短问题:异常的“sourceID”引用了什么,以及如何将其链接到相关的源字符串/文件?

更长的故事:

我通过[UIWebView stringByEvaluatingJavaScriptFromString:]在iPhone原生应用中运行Javascript代码。为了帮助开发,以后检查用户提供的代码,我使用以下函数安全地运行任何代码:

// Inside @implementation MyJS
- (NSString *)runJS:(NSString *)js {
    // Do some escaping on 'js' to make it look like a string literal.
    js = escape(js);
    NSString *result =
        [webView stringByEvaluatingJavaScriptFromString:
            [NSString stringWithFormat:@"try { JSON.stringify(eval(\"%@\")); } except (e) { JSON.stringify(e); }", js]
        ];
    return result;
}

如果一切顺利,[MyJS runJS:js]运行正常并返回一个JSON字符串,其中包含“js”代码中最后一个语句的评估结果。

现在,如果在评估期间发生了不好的事情,我会得到一个JSONified异常对象。例如,如果'js'代码中出现语法错误,我会得到类似的结果:

  

{“message”:“Parse error”,“line”:1,“sourceId”:26121296}

跟踪问题已经非常有用了......

但是,当我通过runJS:运行多个字符串时,我希望能够确定导致异常的那个字符串(因为运行时错误可能来自之前的javascript代码字符串中创建的函数) 。这个“sourceId”属性看起来很有趣,但我找不到它指向的内容。它看起来像一个指针地址(与指向其他对象的指针类似的值),但它与我传递给求值程序的任何字符串都不匹配。我该如何建立此链接?

奖励积分:是否有关于UIWebView特定的javascript环境的文档,比如此异常对象? Safari Web Content Guide很好,但不会涉及这类细节。

1 个答案:

答案 0 :(得分:2)

最坏情况解决方案:

在每个被评估的js字符串中,添加一些抛出异常的代码,捕获它,提取sourceId并以某种方式公开它,以便runJS:方法可以记录哪个sourceId与哪个字符串一起使用。< / p>

(希望有人能找到更好的方法并帮助埋葬这个丑陋的答案!)