При написании приложения для iPhone / iPad с UIWebView консоль не отображается. этот отличный ответ показывает, как отлавливать ошибки, но я также хотел бы использовать console.log ().
javascript
ios
uiwebview
TinkerTank
источник
источник
Ответы:
Посоветовавшись сегодня с уважаемым коллегой, он предупредил меня о Safari Developer Toolkit и о том, как его можно подключить к UIWebViews в симуляторе iOS для вывода на консоль (и отладки!).
Шаги:
[the name of your UIWebView file]
Теперь вы можете перетащить сложный (в моем случае, flot ) Javascript и другие вещи в UIWebViews и отлаживать по желанию.
EDIT: как указал @Joshua J McKinnon, эта стратегия также работает при отладке UIWebViews на устройстве. Просто включите Web Inspector в настройках вашего устройства: Settings-> Safari-> Advanced-> Web Inspector (приветствует @Jeremy Wiebe)
ОБНОВЛЕНИЕ: WKWebView тоже поддерживается
источник
У меня есть решение для входа в консоль отладки приложений с помощью javascript. Это немного грубо, но работает.
Сначала мы определяем функцию console.log () в javascript, которая открывает и немедленно удаляет iframe с URL-адресом ios-log:.
// 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; }
источник
Вот решение Swift: (Это немного похоже на взлом, чтобы получить контекст)
Вы создаете UIWebView.
Получите внутренний контекст и переопределите функцию javascript console.log () .
self.webView = UIWebView() self.webView.delegate = self let context = self.webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext let logFunction : @convention(block) (String) -> Void = { (msg: String) in NSLog("Console: %@", msg) } context.objectForKeyedSubscript("console").setObject(unsafeBitCast(logFunction, AnyObject.self), forKeyedSubscript: "log")
источник
JavaScriptCore
фреймворк с вашим проектом иimport
его в своем быстром файле webview.Начиная с 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); };
источник
UIWebview
вы можете настроить любыеJSContext
вещи.JSContext
еще работает в iOS 8+ сWKWebView
?- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
и работает отлично!WKWebView
iOS 11.4.1 и он не может найтиdocumentView
и вылетает. Я видел этот ответ, и мне кажется, что это невозможно.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); };
Преимущество этого метода в том, что такие вещи, как новые строки в сообщениях журнала, сохраняются.
источник
console.log
, ноwindow.onerror
функция в этом ответе очень полезна!Пробовал исправить Лесли Годвин, но получал эту ошибку:
'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 вызов console.log ("_ 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()
источник
Swift 5
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { webView.evaluateJavaScript("your javascript string") { (value, error) in if let errorMessage = (error! as NSError).userInfo["WKJavaScriptExceptionMessage"] as? String { print(errorMessage) } } }
источник