2016-06-01 1 views
1

WKScriptMessageHandlerプロトコルを実装しましたが、userContentController(:didReceiveScriptMessage:)メソッドを定義しました。WKWebViewからのJavaScriptエラーを取得します

JavaScriptでエラーがあった場合、私は(WKScriptMessageオブジェクト内)のような、本当に有用ではない何かを得る:私はサファリのWebインスペクタを開いた場合一方

{ 
    col = 0; 
    file = ""; 
    line = 0; 
    message = "Script error."; 
    type = error; 
} 

を、私は見ることができます戻って私のネイティブコードでそのエラーを取得する方法は

TypeError: FW.Ui.Modal.sho is not a function. (In 'FW.Ui.Modal.sho', 'FW.Ui.Modal.sho' is undefined)

あります:(例えば)で実際のエラー?

EDIT: ちょうど明確にするためには、JavaScriptコードはJavaScript開発者によって書かれている(ネイティブソースコードへのアクセスを持っていないので、彼はXcodeのを経由してアプリをデバッグすることはできません)。彼が書いたコードは、iOSアプリ(エンタープライズアプリストアからダウンロード)にプッシュされます。

答えて

-1

ブロックを評価する前に、try catchブロックに式をラップすることができます。そして、失敗した場合、JavaScriptはエラーメッセージを返します。 GitHubで利用可能なTurbolinks-iOS adapterの例を示します。私が正しく理解していれば、この解決策は、それ自身のコンピュータ上ではJavaScript開発者の書き込みコードがある私のシナリオでは動作しませんし、このコードはiOSアプリにプッシュされます(企業から例えばダウンロード

extension WKWebView { 
    func callJavaScriptFunction(functionExpression: String, withArguments arguments: [AnyObject?] = [], completionHandler: ((AnyObject?) ->())? = nil) { 
     guard let script = scriptForCallingJavaScriptFunction(functionExpression, withArguments: arguments) else { 
      NSLog("Error encoding arguments for JavaScript function `%@'", functionExpression) 
      return 
     } 

     evaluateJavaScript(script) { (result, error) in 
      if let result = result as? [String: AnyObject] { 
       if let error = result["error"] as? String, stack = result["stack"] as? String { 
        NSLog("Error evaluating JavaScript function `%@': %@\n%@", functionExpression, error, stack) 
       } else { 
        completionHandler?(result["value"]) 
       } 
      } else if let error = error { 
       self.delegate?.webView(self, didFailJavaScriptEvaluationWithError: error) 
      } 
     } 
    } 

    private func scriptForCallingJavaScriptFunction(functionExpression: String, withArguments arguments: [AnyObject?]) -> String? { 
     guard let encodedArguments = encodeJavaScriptArguments(arguments) else { return nil } 

     return 
      "(function(result) {\n" + 
      " try {\n" + 
      " result.value = " + functionExpression + "(" + encodedArguments + ")\n" + 
      " } catch (error) {\n" + 
      " result.error = error.toString()\n" + 
      " result.stack = error.stack\n" + 
      " }\n" + 
      " return result\n" + 
      "})({})" 
    } 

    private func encodeJavaScriptArguments(arguments: [AnyObject?]) -> String? { 
     let arguments = arguments.map { $0 == nil ? NSNull() : $0! } 

     if let data = try? NSJSONSerialization.dataWithJSONObject(arguments, options: []), 
      string = NSString(data: data, encoding: NSUTF8StringEncoding) as? String { 
       return string[string.startIndex.successor() ..< string.endIndex.predecessor()] 
     } 

     return nil 
    } 
} 
+0

アプリストア)。 JSの開発者は正しいエラー(上記の例の構文エラー)を見ることはできませんが、一般的な "スクリプトエラー"は表示されません。私は正しいですか? –

+0

ああ、つまらない。あなたは正しいです、このコードは、iOSクライアントに埋め込まれたスクリプトを評価するためのものです。しかし、同じ 'try catch'の考え方が適用されます - スクリプトを開発するときにそのコードを実装するだけです。 –

+0

コードが小さい場合は動作する可能性があります。しかし、コードが何千行ものコードであれば、私は思っている通りにすべてを入れることができません。また、私は 'try {result.sho();のような構文エラーで' try catch 'が動作するかどうかはわかりません。 catch(エラー){...}; ' –

関連する問題