代码之家  ›  专栏  ›  技术社区  ›  squelart

如何将uiwebview javascript异常的sourceid与源文件关联?

  •  3
  • squelart  · 技术社区  · 15 年前

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

    更长的故事:

    我正在一个iphone本地应用程序中运行javascript代码 [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”代码中最后一条语句的计算结果。

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

    {“消息”:“分析错误”,“行”:1,“源ID”:26121296}

    这对追踪问题已经很有用了…

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

    额外的一点是:有没有关于uiwebview特定javascript环境的文档,比如这个异常对象?这个 Safari Web Content Guide 很好,但不涉及这种细节。

    1 回复  |  直到 15 年前
        1
  •  2
  •   squelart    15 年前

    最坏情况解决方案:

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

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