当使用UIWebView编写iPhone / iPad应用程序时,控制台不可见。this excellent answer展示了如何捕获错误,但我也想使用console.log()。
发布于 2011-06-28 22:45:07
我有一个解决方案,可以使用javascript登录到应用程序调试控制台。这有点粗糙,但它是有效的。
首先,我们在javascript中定义console.log()函数,该函数打开并立即删除带有ios-log: url的iframe。
// 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;
现在,我们必须使用shouldStartLoadWithRequest函数在iOS应用程序的UIWebViewDelegate中捕获这个URL。
- (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;
}
发布于 2015-02-16 03:47:48
从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);
};
发布于 2013-02-15 04:37:32
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);
};
这种技术的优点是保留了日志消息中的换行符等内容。
https://stackoverflow.com/questions/6508313
复制相似问题