2015-05-11 38 views
0

我有一個使用JavaScriptCore在webview和objective C之間進行通信的項目。這一切都很好,除了我似乎無法將運行時錯誤記錄到XCode控制檯。如何使用JavaScriptCore將錯誤記錄到XCode?

我有以下幾點:

- (void)createWebViewContext { 
    //Find the context 
    self.webViewContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; 

    //Register JS error handler 
    self.webViewContext.exceptionHandler = ^(JSContext *c, JSValue *e) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"JAVASCRIPT ERROR: %@. Stack: %@", e, [e valueForProperty:@"stack"]); 
     }); 
    }; 

    //Attach logger 
    id logger = ^(NSString *logMessage) { 
     NSLog(@"%@", logMessage); 
    }; 
    self.webViewContext[@"console"][@"log"] = logger; 
    self.webViewContext[@"console"][@"info"] = logger; 
    self.webViewContext[@"console"][@"error"] = logger; 
    self.webViewContext[@"console"][@"err"] = logger; 
    self.webViewContext[@"console"][@"warn"] = logger; 
} 

此代碼似乎工作 - 如果我console.logconsole.err的東西,我得到的輸出在XCode中。問題是我沒有得到JavaScript引發的錯誤(如SyntaxErrors,TypeErrors或類似錯誤)。這些類型的錯誤仍然顯示在Safari檢查器中,但不在XCode中。

任何方式來實現這一目標?

回答

2

嗯,試着檢查webViewContext.exception屬性,也許這會奏效。

此外請確保您捕獲窗口對象中的所有錯誤。像:

[self.webViewContext evaluateScript:@"window.onerror = function(msg) { console.err(msg)}"] 

之後,所有錯誤都應該被轉發到您的console.err處理

+0

遺憾的是,似乎並沒有任何工作。如果我觀察異常屬性,那麼該值似乎只會從NSNull變爲另一個NSNull:/ – BlackWolf

+1

哦,另一件事:嘗試首先設置window.onerror處理程序,並將所有內容記錄到控制檯中。就像「[self.webViewContext evaluateScript:@」window.onerror = function(msg){console.err(msg)}「],然後它應該啓動所有錯誤並將其轉發到console.log –

+0

完美,非常感謝你!我一直在尋找一種JavaScript解釋器用來記錄錯誤的方法,但是我從來沒有偶然發現過window.onerror。如果你把它寫成一個答案,我會接受。 – BlackWolf