2010-01-11 31 views
3

簡短問題:異常的「sourceID」是指什麼,以及如何將其鏈接到相關的源字符串/文件?如何將UIWebView javascript異常的sourceId與源文件關聯?

更長的故事:

我通過[UIWebView stringByEvaluatingJavaScriptFromString:]運行的JavaScript代碼在iPhone本機應用程序。爲了幫助開發,後來檢查用戶提供的代碼,我用下面的函數來安全地運行任何代碼:

// 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」碼的語法錯誤的情況下,我得到這樣的:

{「消息」:「解析錯誤」,「線」:1,「的SourceID」:26121296}

這已經是跟蹤問題非常有用......

然而,當我通過runJS:運行多個字符串,我希望能夠找出其中一個導致異常(因爲運行時錯誤可能來自在之前的JavaScript代碼字符串中創建的函數)。這個「sourceId」屬性看起來很有趣,但我找不到它指向的內容。它看起來像一個指針地址(與指向其他對象的指針類似),但它與我傳遞給評估程序的任何字符串都不匹配。我怎樣才能使這個鏈接?

對於獎勵積分:是否有任何有關UIWebView特定的JavaScript環境的文檔,像這個異常對象? Safari Web Content Guide很好,但沒有涉及到這種細節。

回答

2

最壞情況的方案:

內每個js的字符串被評估,添加一些代碼拋出異常,捕獲它,提取的SourceID並以某種方式公開它使得runJS:方法可以保持的記錄,其中的SourceID用哪個字符串。

(希望有人會找到更好的方法,並幫助掩蓋這個醜陋的答案!)

相關問題