如何从 Xcode 控制台输出 JavaScript 的 log?

调试 UIWebView 中的 JavaScript 一直以来都是很痛苦的一件事。通常我们会通过下面的方法调试 HTML 和 JavaScript。

1、第一种,使用桌面浏览器调试。大多数现代浏览器都有功能强大的调试器,可以通过 console.log() 方法进行调试。
2、如果桌面浏览器不能追踪到这些 log,我们可以从 Xcode 启动 iOS 模拟器,运行我们的 app。然后,启动 Safari 选择 Develop > iPhone Simulator > tieba.baidu.com

3.如果你不能在 iOS 模拟器上复现问题,也不能从运行在 iPhone 真机上的 APP 获得 console.log(),要调试 HTML 或者 JavaScript 是非常困难的。这篇文章就教你怎么用 NSLog 输出 JavaScript 中的 log。

把 JavaScript Log 转化成 Application Log

最基本的思路是这样的:为了把 JavaScript 的 log 现实出来,我们需要给debugger 发出一个 XMLHttpRequest,发起一个特殊的请求,把 Log 信息当做请求的路径,debugger 当做 host 名,例如: http://debugger/myError。我们可以通过 Apple 提供给我们的黑科技 NSURLProtocl 截获所有从 UIWebView 发起的请求。如果请求里有 「debugger」,就是用 NSURLProtocol 调用 NSLog 打印这些 log。
假设你的工程里有一个文件叫做 Sample.html

<html>
<head>
<script>
function log(msg) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', "http://debugger/" +
    encodeURIComponent(msg));
  xhr.send(null);
}

function test() {
  log("Button was clicked");
  log("We are done");

  return false;
}
</script>
</head>

<body>
<button onclick="return test();">Click Me</button>
</body>

</html>

接下来,创建一个 NSURLProtocol 的子类 WebConsole

/WebConsole.h
@interface WebConsole : NSURLProtocol
+ (void) enable;
@end

//WebConsole.m
@implementation WebConsole
+ (void) enable {
  [NSURLProtocol registerClass:[WebConsole class]];
}

+ (BOOL) canInitWithRequest:(NSURLRequest *)request {
  if ([[[request URL] host] isEqualToString:@"debugger"]){
    NSLog(@"%@", [[[request URL] path] substringFromIndex: 1]);
  }

  return FALSE;
}
@end

通过 canInitWithRequest 检查截获的请求,如果请求的 host 是「debugger」就用 NSLog 把这个请求的 「path」(也就是 JavaScript 的 log)输出。
最后我们只需要在 UIWebView 加载请求之前调用 enable,注册这个类,就能够通过拦截 UIWebView 发起的请求打印 JavaScript 的 log 了。


- (void)viewDidLoad {
  [super viewDidLoad];

  [WebConsole enable];

  NSError *error = nil;
  NSString *htmlStr = [NSString stringWithContentsOfFile:
    [[NSBundle mainBundle]
      pathForResource:@"Sample" ofType:@"html"]
      encoding:NSUTF8StringEncoding
      error:&error];

  [self.webView loadHTMLString:htmlStr baseURL:nil];
}

OneAPM Mobile Insight以真实用户体验为度量标准进行 Crash 分析,监控网络请求及网络错误,提升用户留存。访问 OneAPM 官方网站感受更多应用性能优化体验,想阅读更多技术文章,请访问 OneAPM 官方技术博客
本文转自 OneAPM 官方博客

时间: 2024-10-02 09:45:18

如何从 Xcode 控制台输出 JavaScript 的 log?的相关文章

在浏览器控制台输出内容 console.log(string);

在浏览器控制台中写如数据 1添加    <script type="text/javascript">djConfig = { isDebug: true };</script>     在<script>写入需要输出的内容 <script> 如: dojo.require("esri.map"); function init() { var map = new esri.Map("map"); d

JS简单实现仿百度控制台输出信息效果_javascript技巧

本文实例讲述了JS简单实现仿百度控制台输出信息效果.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <h3>打开控

js控制台输出的方法(详解)_javascript技巧

console.log(object[, object, ...]) 在控制台输出一条消息.如果有多个参数,输出时会用空格隔开这些参数. 第一个参数可以是一个包含格式化占位符输出的字符串,例如: console.log("The %s jumped over %d tall buildings", animal, count); 上面的例子可以用下面的无格式化占位符输出的代码替换: console.log("The", animal, "jumped ov

利用正则实现彩色控制台输出

最近忙了一阵less的二次开发的工作,期间遇到了不少需要向控制台输出彩色文字的需求.翻了下以前同事的代码,发现要么自己拼转义字符串,要么使用一些不太好用的第三方库,总之都不是很合自己的口味.按照自己的口味,一个好的第三方库应该满足如下需求: 要支持丰富的颜色设置,同时设置颜色又不能太累赘,而且要支持console.log的通配符表示方法以减少拼字符串的工作.cli-color和colors的语法类似,都是采用方法来设定字符串颜色: // colors console.log("this is a

Log4j 2.0在开发中的高级使用详解—配置简单的控制台输出(三)

Log4j 2.0在最近迎来了重大的版本升级.解决了1.x中死锁bug之外,性能也有10倍的提升. 同样的在最新版本中的新特性中.配置文件也不仅仅局限于xml和java特性文件properties.更是支持json和yaml的配置文件. 日志的使用在我们日常开发中经常用到.也有很多的高手遇到过日志死锁问题.在2.0中引入了异步日志处理.死锁问题得以解决. 好吧,介绍了这么多,进入它的helloworld吧. 今天看看它的简单配置.配置输出到console的日志记录器,并且为info级别的输出.

java中解析xml,要求在控制台输出但是输出的是null

问题描述 java中解析xml,要求在控制台输出但是输出的是null package pero.common.Metied; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.MessageFormat; import javax.xml.bind.JAXBContext; import java

Windows下的控制台输出

控制台输出就象dos下的输出,可不是图形界面.象ping/ipconfig/ftp等命令都是这类程序. 回忆过去,在dos下进行文件操作时,常用到"文件把柄"的概念,使用文件把柄操作时,非常方便,操作时,只要知道把柄号就可以,而不用操心文件的位置.dos下,设备也都有自己的专用把柄,这些把柄是:0000H 标准输入设备 (stdin)0001H 标准输出设备 (stdout)0002H 标准错误设备 (stderr)0003H 标准辅助设备 (stdaux)0004H 标准打印设备 (

ASP.NET动态输出Javascript文本格式换行问题

前言 在动态输出Javascript的时候我们习惯用Response.write("<script language=\"javascript\" type=\"text/javascript\">alert(1);</script>");这样的语句来动态输出,但是你可能没注意到里面的格式问题,比如,我测试连接数据库,如果连接失败就打印catch信息,但是你会发现你直接输出是输出不了的,会报错,比如字符串没有结束之类的脚本

tomcat控制台输出信息时会卡住的原因

在window2003 系统下运行tomcat5.5 当运行时代码中有控制台输出的语句,如System.out.println 或 e.printStackTrace() 时,当前线程会卡住,而且控制台没有任何输出,只要在运行的服务器上敲下空格或回车,才回有输出,该线程才恢复运行. 原因: 1 在控制台左上角鼠标右键,选属性 2 看图上的解释,去掉那个快速编辑 3 这个你根据情况自己决定吧.我一般选下面那个