Integrating Reveal without modifying your Xcode project
reveal: 檢視 iOS app 的 view 結構。
给出了如何不用修改Xcode工程就可以加载使用Reveal的方法。
在当前用户目录新建一个文件.lldbinit,位于~/.lldbinit,LLDB每次启动的时候都会加载这个文件。
在.lldbinit中输入如下内容:
1 | command alias reveal_load_sim expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0) |
上述文件创建了4个命令:
1 | reveal_load_sim,reveal_load_dev, reveal_start 和 reveal_stop |
####手动加载调试库
在设备起来之后,你就可以断下应用,在LLDB提示框中输入上述的命令了。
请注意:只有在iOS应用发出了UIApplicationDidFinishLaunchingNotification通知之后,比如应用的delegate已经处理过application::didFinishLaunchingWithOptions:之后才能调用上面的revealload*命令,然后再调用reveal_start
reveal_load_sim
这个只在iOS模拟器上有效。它从Reveal的应用程序bundle中找到并加载libReveal.dylib
(请确保你把Reveal安装到了系统的 Application 文件夹,如果你换地方了,你修改上述的文件)。
reveal_load_dev
这个命令在iOS设备和模拟器上都有效。不过,它需要你在Build Phase中的的Copy Bundle Resources中加上libReveal.dylib,请确保没有放到Link Binary With Libraries
这个地方。
reveal_start
这个命令发出一个通知启动Reveal Server。
reveal_stop
这个命令发出一个通知停止Reveal Server。
请注意:只有在iOS应用发出了UIApplicationDidFinishLaunchingNotification
通知之后,比如应用的delegate已经处理过application::didFinishLaunchingWithOptions:
之后才能调用上面的reveal_load_*
命令,然后再调用reveal_start
在设备起来之后,你就可以断下应用,在LLDB提示框中输入上述的命令了。
上述的过程还需要手动输入,下面介绍如何设置条件断点,使得Reveal在启动之后自动加载。
在你的应用的application:didFinishLaunchingWithOptions
中的代码出加一个断点,然后右键,选择编辑断点。
输入如下图一样的命令:
重新运行下应用,如果控制台输出了如下信息:
Reveal server started.
说明Reveal已经自动成功加载。
真机补充:
真机调试下需要额外增加如下配置
要用Reveal连接真机调试,我们需要先把Reveal的动态链接库上传到真机上。由于iOS设备有沙盒存在,所以我们只能将Reveal的动态链接库添加到工程中。
点击Reveal菜单栏的”Help”->”Show Reveal Library in Finder”选项(如下图所示),可以在Finder中显示出Reveal的动态链接库:libReveal.dylib
在 Copy Bundle Resources 配置区域中 ,加入libReveal.dylib
。
在Link Binary With Libraries配置项中:
如果已有libReveal.dylib,请将其移除——不应在编译时连接dylib文件。
如果下列系统框架与库文件还不存在,请将他们加入:1
2
3CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework
- Xcode一般默认会在工程中包含此框架文件。
2.进入target的Build Phases标签页,选择Editor → Add Build Phase → Add Run Script菜单。在Run Script阶段中加入以下内容:1
set -e if [ -n "${CODE_SIGN_IDENTITY}" ]; then codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib" fi
之后用Reveal连接真机的方式和连接模拟器的方式类似,我们只需要把上一节提到的断点Action的内容从reveal_load_sim
改成reveal_load_dev
即可。