换个姿势调试 UIWebView

Hybrid App 开发 App 现在越来越流行, 尤其对于快速迭代开发来说, Hybrid App 是一个快速验证需求点的好方式,在 Hybrid App 过程中不可避免的要和 UIWebView 打交道, 调试 UIWebView 上的网页不像桌面版的 Safari 或 Chrome 一样有强大的开发者工具, 在手机上调试 UIWebView 是一件痛苦的事情, 找了几种调试的方式, 对比下来发现还是麻烦, 不如换个姿势找找其他方式?

当前有几种调试 UIWebView 的方式:

1.通过 NSProxy 来 Hook UIWebView 的事件.

2.通过私有 API 来开启远程调试

第一种方式可能相对复杂不便于进行全局调试, 有兴趣的同学可以看看这篇文章 NSProxy UIWebView 我们就简单说下如何通过私有 API 来调试 UIWebView 的方法. 通过对 WebKit.framework 直接 class-dump 我们可以得到 UIWebView 的私有API.

@interface WebView (WebPrivate)
+ (void)_enableRemoteInspector;
@end

通过方法名还是很容易看出来这是我们想要的私有 API__(Available iOS5)__, 那么通过 +[WebView _enableRemoteInspector] 我们来开启远程调试.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [NSClassFromString(@"WebView") _enableRemoteInspector];

}

当然这个私有 API 不可能通过编译器的检查, 所以我们使用其他方式绕过编译器的检查, 通过 performSelector:@selector() 方法来绕过消息检查.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
#if (TARGET_IPHONE_SIMULATOR)
    [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];
#endif
    
}

OK, 仅仅通过一个私有 API 便可进行远程 Debug, 现在打开模拟器然后在 Safari 地址栏输入 localhost:9999 便可.

不想折腾的同学还也可以看看 brainlock 的开源项目 ios-remote-inspector, 更多的思路永远不是坏事.