如何使用 JavaScriptCore 将错误记录到 XCode?

Posted

技术标签:

【中文标题】如何使用 JavaScriptCore 将错误记录到 XCode?【英文标题】:How to log errors to XCode with JavaScriptCore? 【发布时间】:2015-05-11 18:51:37 【问题描述】:

我有一个项目使用 javascriptCore 在 webview 和 Objective C 之间进行通信。这一切都很好,除了我似乎无法将运行时错误记录到 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 中。

有什么方法可以实现吗?

【问题讨论】:

【参考方案1】:

嗯,尝试检查webViewContext.exception 属性,也许这会起作用。

另外确保您捕获窗口对象中的所有错误。喜欢:

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

之后,所有错误都应转发到您的 console.err 处理程序

【讨论】:

不幸的是,这似乎也不起作用。如果我观察到异常属性,该值似乎只从 NSNull 变为另一个 NSNull :/ 哦,还有一件事:首先尝试设置 window.onerror 处理程序并将所有内容记录到控制台中。像 "[self.webViewContext evaluateScript:@"window.onerror = function(msg) console.err(msg)"] 然后它应该开始捕获所有错误并将其转发到 console.log 完美,可以,非常感谢!我一直在寻找 JavaScript 解释器用来记录错误的方法,但我从未偶然发现 window.onerror。如果您将其放入答案中,我会接受。 很高兴得到帮助。顺便说一句 - 据我记得从 UIWebView 获取 javaScriptContext 不是官方 API 是的,我知道,但这对我来说不是问题。这种方法的另一个缺点:您似乎无法在 window.onerror 中获得堆栈跟踪

以上是关于如何使用 JavaScriptCore 将错误记录到 XCode?的主要内容,如果未能解决你的问题,请参考以下文章

一个人如何在JavaScriptCore中使用摩卡咖啡和柴? [关闭]

如何通过 JavascriptCore 注入和使用这个 javascript 库 (web3)

如何使用 Browserify & iOS JavaScriptCore

使用 Swift iOS 中的 Javascriptcore 框架将 NSobject 传递给 javascript

如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数

iOS 8 JavaScriptCore:您将 JavaScript 文件放在哪里?