3

簡単な質問:例外の「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文字列が返されます。

これで、評価中に悪いことが起こった場合、JSON化された例外オブジェクトを取得します。たとえば、「js」コードの構文エラーの場合、次のようになります。

{"メッセージ": "解析エラー"、 "行":1、 "sourceId":26121296}

これは、問題を追跡するのにすでに非常に役立ちます...

ただし、複数の文字列を実行するrunJS:ときに、例外の原因となった文字列を特定できるようにしたいと思います(以前のJavaScriptコード文字列で作成された関数からランタイムエラーが発生する可能性があるため)。この「sourceId」プロパティは面白そうに見えますが、それが何を指しているのかわかりません。ポインタアドレス(他のオブジェクトへのポインタと同様の値)のように見えますが、評価者に渡した文字列のいずれとも一致しません。このリンクを作成するにはどうすればよいですか?

ボーナスポイントについて:この例外オブジェクトのように、UIWebView固有のjavascript環境について利用できるドキュメントはありますか?Safari Webコンテンツガイドは素晴らしいですが、この種の詳細には触れていません。

4

1 に答える 1

2

最悪の場合の解決策:

評価される各js文字列内に、例外をスローし、それをキャッチし、sourceIdを抽出し、何らかの方法でそれを公開するコードを追加して、runJS:メソッドがどのsourceIdがどの文字列に対応するかを記録できるようにします。

(うまくいけば、誰かがより良い方法を見つけて、この醜い答えを埋めるのを手伝ってくれるでしょう!)

于 2010-01-11T05:16:39.203 に答える