3

简短的问题:异常的“sourceID”指的是什么,我如何将它链接到相关的源字符串/文件?

更长的故事:

我正在通过[UIWebView stringByEvaluatingJavaScriptFromString:]. 为了帮助开发以及稍后检查用户提供的代码,我使用以下函数来安全地运行任何代码:

// 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”代码中最后一条语句的评估结果。

现在,如果在评估过程中发生了不好的事情,我会得到一个 JSON 化的异常对象。例如,如果“js”代码中出现语法错误,我会得到如下信息:

{"message":"解析错误","line":1,"sourceId":26121296}

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

但是,当我通过 运行多个字符串时runJS:,我希望能够查明是哪一个导致了异常(因为运行时错误可能来自在以前的 javascript 代码字符串中创建的函数)。这个“sourceId”属性看起来很有趣,但我找不到它指向的内容。它看起来像一个指针地址(与指向其他对象的指针的值相似),但它与我传递给评估器的任何字符串都不匹配。我怎样才能建立这个链接?

奖励积分:是否有任何关于 UIWebView 特定的 javascript 环境的文档可用,比如这个异常对象?Safari Web Content Guide很好,但没有详细介绍。

4

1 回答 1

2

最坏情况的解决方案:

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

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

于 2010-01-11T05:16:39.203 回答