Консоль Javascript.log() в iOS UIWebView
при написании приложения для iPhone / iPad с помощью UIWebView консоль не отображается. это отличный ответ показывает, как ловить ошибки, но я хотел бы использовать консоль.log() также.
6 ответов:
после консультации с уважаемым коллегой сегодня он предупредил меня о Safari Developer Toolkit, и как это может быть связано с UIWebViews в симуляторе iOS для вывода консоли (и отладки!).
действия:
- открыть Настройки Safari - > вкладка "Дополнительно" - > включить флажок"Показать меню разработки в строке меню"
- запустите приложение с UIWebView в iOS Simulator
- Safari - > разработка - > I (Pad/Pod) симулятор - >
[the name of your UIWebView file]
теперь вы можете отбросить комплекс (в моем случае,flot) Javascript и другие вещи в UIWebViews и отладки по желанию.
EDIT: как указал @Joshua J McKinnon эта стратегия также работает при отладке UIWebViews на устройстве. Просто включите веб-инспектор на вашем устройстве настройки: Настройки - > Safari - >Advanced - >Web Inspector (cheers @Jeremy Wiebe)
обновление: WKWebView тоже поддерживается
у меня есть решение для входа, используя javascript, в консоль отладки приложений. Это немного грубо, но это работает.
во-первых, мы определяем консоли.функция log () в javascript, которая открывает и сразу же удаляет iframe с ios-log: url.
// Debug console = new Object(); console.log = function(log) { var iframe = document.createElement("IFRAME"); iframe.setAttribute("src", "ios-log:#iOS#" + log); document.documentElement.appendChild(iframe); iframe.parentNode.removeChild(iframe); iframe = null; }; console.debug = console.log; console.info = console.log; console.warn = console.log; console.error = console.log;
теперь мы должны поймать этот URL-адрес в UIWebViewDelegate в приложении iOS с помощью функции shouldStartLoadWithRequest.
- (BOOL)webView:(UIWebView *)webView2 shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *requestString = [[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; //NSLog(requestString); if ([requestString hasPrefix:@"ios-log:"]) { NSString* logString = [[requestString componentsSeparatedByString:@":#iOS#"] objectAtIndex:1]; NSLog(@"UIWebView console: %@", logString); return NO; } return YES; }
вот быстрое решение: (это немного хак, чтобы получить контекст)
вы создаете UIWebView.
получить внутренний контекст и переопределить
начиная с iOS7, вы можете использовать собственный мост Javascript. Что-то так же просто, как следующие
#import <JavaScriptCore/JavaScriptCore.h> JSContext *ctx = [webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; ctx[@"console"][@"log"] = ^(JSValue * msg) { NSLog(@"JavaScript %@ log message: %@", [JSContext currentContext], msg); };
NativeBridge очень полезен для связи от UIWebView до Objective-C. Вы можете использовать его для передачи журналов консоли и вызова функций Objective-C.
https://github.com/ochameau/NativeBridge
console = new Object(); console.log = function(log) { NativeBridge.call("logToConsole", [log]); }; console.debug = console.log; console.info = console.log; console.warn = console.log; console.error = console.log; window.onerror = function(error, url, line) { console.log('ERROR: '+error+' URL:'+url+' L:'+line); };
преимущество этого метода заключается в том, что сохраняются такие вещи, как новые строки в сообщениях журнала.
попытался исправить Лесли Годвин, но получал эту ошибку:
'objectForKeyedSubscript' is unavailable: use subscripting
для Swift 2.2, вот что сработало для меня:
вам нужно будет импортировать JavaScriptCore для этого кода для компиляции:
import JavaScriptCore if let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") { context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }") let consoleLog: @convention(block) String -> Void = { message in print("javascript_log: " + message) } context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog") }
затем в коде javascript, вызывая консоль.журнал ("_your_log_") будет напечатан в консоли Xcode.
еще лучше, добавьте этот код в качестве расширения для UIWebView:
import JavaScriptCore extension UIWebView { public func hijackConsoleLog() { if let context = valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") { context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }") let consoleLog: @convention(block) String -> Void = { message in print("javascript_log: " + message) } context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog") } } }
а затем вызвать этот метод во время инициализации UIWebView шаг:
let webView = UIWebView(frame: CGRectZero) webView.hijackConsoleLog()