uiwebview javascript例外のSourceIDをソースファイルに関連付けるにはどうすればよいですか?
-
19-09-2019 - |
質問
短い質問:例外の「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]
正常に実行され、「JS」コードの最後のステートメントの評価の結果を含むJSON文字列を返します。
評価中に悪いことが起こった場合、JSSONIFIED例外オブジェクトを取得します。たとえば、「JS」コードの構文エラーが発生した場合、次のようなものが得られます。
{"Message": "parse error"、 "line":1、 "sourceId":26121296}
これはすでに問題を追跡するのに非常に役立ちます...
ただし、複数の文字列を実行すると runJS:
, 、例外を引き起こしたものを特定できるようにしたいと思います(以前のJavaScriptコード文字列で作成された関数からランタイムエラーが発生する可能性があるため)。この「SourceID」プロパティは興味深いように見えますが、それが指し示していることを見つけることができません。ポインターアドレスのように見えます(他のオブジェクトとのポインターと同様の値)が、評価者に渡した文字列のいずれにも一致しません。どうすればこのリンクを作成できますか?
ボーナスポイントの場合:この例外オブジェクトのように、UIWebview固有のJavaScript環境に関するドキュメントはありますか? Safari Webコンテンツガイド いいですが、この種の詳細には入りません。
解決
最悪の解決策:
評価されている各js文字列の内部では、例外をスローし、キャッチし、sourceIDを抽出し、何らかの形で露出するコードを追加して、 runJS:
メソッドは、どのsourceIDがどの文字列を使用するかを記録することができます。
(うまくいけば、誰かがより良い方法を見つけて、この醜い答えを埋めるのを助けるでしょう!)