Как записывать ошибки в XCode с помощью JavaScriptCore?

У меня есть проект, который использует JavaScriptCore для связи между веб-просмотром и 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.log или console.err что-то, я получаю вывод в XCode. Проблема в том, что я НЕ получаю ошибок, генерируемых JavaScript (таких как SyntaxErrors, TypeErrors и т.п.). Подобные ошибки по-прежнему отображаются в инспекторе Safari, но не в XCode.

Любой способ добиться этого?


person BlackWolf    schedule 11.05.2015    source источник


Ответы (1)


Хм, попробуй проверить свойство webViewContext.exception, может это сработает.

Кроме того, убедитесь, что вы отловили все ошибки в оконном объекте. Нравиться:

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

После этого все ошибки должны быть отправлены вашему обработчику console.err

person Artem Yarulin    schedule 12.05.2015
comment
к сожалению, это тоже не работает. Если я наблюдаю свойство исключения, значение только кажется меняется с NSNull на другое NSNull: / - person BlackWolf; 12.05.2015
comment
О, еще одна вещь: попробуйте сначала настроить обработчик window.onerror и записать все в консоль в нем. Например, [self.webViewContext AssessmentScript: @ window.onerror = function (msg) {console.err (msg)}], а затем он должен начать исправлять все ошибки и пересылать их в console.log - person Artem Yarulin; 12.05.2015
comment
отлично, это работает, большое вам спасибо! Я искал метод, который интерпретатор JavaScript использует для регистрации ошибок, но никогда не наткнулся на window.onerror. Если вы вставите это в ответ, я приму это. - person BlackWolf; 12.05.2015
comment
Рад, что помогли. Кстати, будьте в курсе - насколько я помню, получение javaScriptContext из UIWebView не является официальным API - person Artem Yarulin; 12.05.2015
comment
да, я знаю, но для меня это не проблема. Еще один недостаток этого подхода: кажется, вы не можете получить трассировку стека внутри window.onerror. - person BlackWolf; 12.05.2015
comment
Может быть, вы сможете - проверьте это: http://stackoverflow.com/questions/19933961/does-safari-support-javascript-window-onerror - person Artem Yarulin; 13.05.2015