使用chrome开发者工具调试iOS webview

前言

一般情况下,如果要调试 iOS app中调用webview的表现,需要在 iOS 系统设置中为 Safari 开启 Web 检查器,并用 macOS 上的 Safari 开发者工具调试。但是早已习惯了强大的 Chrome DevTools 的我们,在使用 Safari 的开发者工具时,还是会有很多不习惯。 因此 Google 利用 Apple 的 远程 Web 检查器服务 制作了可以将 Chrome DevTools 的操作转为 Apple 远程 Web 检查器服务调用的协议和工具:iOS WebKit Debug Proxy(又称 iwdp)。 下面就来简单介绍一下如何使用这个工具来让我们用 Chrome DevTools 调试 iOS Safari 页面。

安装

首先我们通过homebrew来安装ios-webkit-debug-proxy,可以通过查看github页面的文档和issues来详细了解使用方法。

$ brew update
$ brew install libimobiledevice
$ brew install ios-webkit-debug-proxy

使用

可以使用真机,也可以使用模拟器,但是要注意的是必须先于代理启动。

通过命令行启动模拟器:

# Xcode changes these paths frequently, so doublecheck them
SDK_DIR="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"
SIM_APP="/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator"
$SIM_APP -SimulateApplication $SDK_DIR/iPhoneSimulator8.4.sdk/Applications/MobileSafari.app/MobileSafari

如果是真机的话需要在设置 - Safari - 高级中,打开web检查器。

开启代理

-f 可以选择指定的 DevTools UI 介面,这个介面可以是任意的,这里我们用 Chrome 自带的开发者工具:

$ ios_webkit_debug_proxy -f chrome-devtools://devtools/bundled/inspector.html
Listing devices on :9221
Connected :9222 to xxxx (xxxxxxxxxxxxxxxxx)

打开 http://localhost:9221/,然后点击对应的链接,之后按上头的英文指示复制链接到新tab打开就可以了:

Note: Your browser may block1,2 the above links with JavaScript console error:
  Not allowed to load local resource: chrome-devtools://...
To open a link: right-click on the link (control-click on Mac), 'Copy Link Address', and paste it into address bar.

注意:因为 Chrome 不允许打开 chrome-devtools:// 协议的链接,所以不能直接点击链接

错误处理

问题 1:

$ ios_webkit_debug_proxy
Listing devices on :9221  
Could not connect to lockdownd. Exiting.: Permission deniedConnected :9222 to SIMULATOR (SIMULATOR)  
Invalid message _rpc_reportConnectedDriverList: <dict>  
    <key>WIRDriverDictionaryKey</key>
    <dict>
    </dict>
</dict>  

解决方式:

sudo chmod +x /var/db/lockdown  

问题 2:

$ ios_webkit_debug_proxy
Listing devices on :9221  
Connected :9222 to SIMULATOR (SIMULATOR)  
Invalid message _rpc_reportConnectedDriverList: <dict>  
    <key>WIRDriverDictionaryKey</key>
    <dict>
    </dict>
</dict>  
Disconnected :9222 from SIMULATOR (SIMULATOR)  
send failed: Socket is not connected  

解决方式,重装依赖工具:

$ brew uninstall --force ignore-dependencies -libimobiledevice ios-webkit-debug-proxy
$ brew install libimobiledevice ios-webkit-debug-proxy

问题3:

$ ios_webkit_debug_proxy
Listing devices on :9221  
Connected :9222 to SIMULATOR (SIMULATOR)  
send failed: Socket is not connected  
recv failed: Operation timed out  

解决方式,指定 UI 介面:

$ ios_webkit_debug_proxy -f chrome-devtools://devtools/bundled/inspector.html

问题4:

连接 iOS 10 设备可能会出以下报错,无法连接设备:

$ ios_webkit_debug_proxy -f chrome-devtools://devtools/bundled/inspector.html
Listing devices on :9221  
Could not connect to lockdownd. Exiting.: Broken pipe  
Unable to attach <id> inspector  

更新最新的 libimobiledevice 即可:

$ brew upgrade libimobiledevice --HEAD

ref