Reveal使用手册
痛点
- 移动开发这一块做的最多的无疑就是UI和交互,而UI调试也是移动开发人员经常干的一苦逼事。虽然目前iOS开发工具Xcode集成了UI调试功能(Debug View Hierarchy),但带给我们的却只有失望。
简介
- Reveal 是我们调试UI的利器,他避免了每次调试UI时一旦修改UI就需要重新cmd+R重新运行的麻烦操作,我们只需要接入Reveal,然后在Reveal操作界面修改UI属性,可以直接反应在运行的App中!如下图的Reveal主界面,最左边反应树形UI视图层级,中间是一个3D的UI显示层级,右边类似我们在使用xib时选中某个元素可以修改元素的各种属性的操作,修改完成后无需运行直接反应在我们的模拟器或者真机上面!方便极了
集成方式
Framework集成 (会导致App包体积增加,不建议)
Framework集成弊端
- 因为用这种方式集成的弊端就是在于,你还要配置project的other linker Flags,还要注意不要在打包发布的时候也一起打包进去了。而且每个项目都要去加入Reveal的framework,并且配置other linker Flags。
use_frameworks!
platform :ios, '9.0'
target 'RevealDemo' do
pod 'Reveal-SDK', '~> 2',:configurations => ['Debug']
end
模拟器调试
1.添加断点按钮,添加一个Symbolic BreakPoint
![uExPkF.png](https://i-blog.csdnimg.cn/blog_migrate/159dc9d87ec8c555a3a1aa163b5f605e.png)
2.输入Symbol:UIApplicationMain
3.Add Action
![uExXND.md.png](https://i-blog.csdnimg.cn/blog_migrate/f741db3f092044d2f49e6402c97c7c3c.png)
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void )dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void)0);
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen((char *)[(NSString *)[(NSBundle )[NSBundle mainBundle] pathForResource:@"libReveal" ofType:@"dylib"] cStringUsingEncoding:0x4], 0x2) : ((void)0;
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void )dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework/RevealServer", 0x2) : ((void)0);
(Class)NSClassFromString(@"IBARevealLoader") == nil ? (void)dlopen((char)[(NSString)[(NSString)[(NSBundle)[NSBundle mainBundle] pathForResource:@"RevealServer" ofType:@"framework"] stringByAppendingPathComponent:@"RevealServer"] cStringUsingEncoding:0x4], 0x2) : ((void)0);
4.选中Automatically continue after evaluating actions.
5.至此如果是模拟器的话,直接cmd+R,即可!
![uVCDOA.png](https://i-blog.csdnimg.cn/blog_migrate/6f1b61420a1f61dcdb9301e04c6a1b86.png)
LLDB集成(推荐)
- LLDB集成的优势就是在于不用担心打包会把Reveal的framework也打包进去的问题。而且本地配置好了,只要在这台机器上任何项目都通用。
- 使用LLDB命令集成其实也很简单,大体分为如下两步。
第一步 点击pause program execution,暂停app。
![uVAAUI.png](https://i-blog.csdnimg.cn/blog_migrate/aadc5f81edbc106e09515455b19ebd7a.png)
第二步 依次输入两条命令即可,分别如下:
第一条命令
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0)
ps:/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib这个地址为绝对路径,我的Reveal是存放于application目录下的,所以路径就是/Applications/Reveal.app/.....
第二条命令
expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
- 两条命令顺利的话,控制台则会打印INFO: Reveal Server started (Protocol Version 25).这条信息。(如下图)
![uVAzon.md.png](https://i-blog.csdnimg.cn/blog_migrate/da7295f5916659afb22cd95ddb28646f.png)
- 如果最后未能正常输出INFO: Reveal Server started,那你就要好好检查一下第一条命令里的dlopen里包含的路径是否正确了。
- 最后,你在点击continue按钮或者在控制台里继续输入c字符然后回车,让程序结束暂停即可。
- 现在,你在打开你的Reveal,在你的左上角点击No Connection,瞅瞅,是否有你的app啦。
.lldbinit里设置别名
- 每次需要Reveal来审查UI的时候都要输入这两条看着如此蛋疼的命令。so… 幸运的是我们可以在~/目录下的.lldbinit文件里为我们的LLDB命令添加别名。
- 首先,简单科普一下吧。.lldbinit是一个隐藏文件,貌似默认是没有的。而Xcode每次启动的时候,则都会去~/.lldbinit这个目录寻找这个文件里的LLDB命令。所以我们可以在这个文件里进行一些命令的初始化设置或者设置别名等等
- 现在,我们打开终端,在终端里输入touch ~/.lldbinit命令来进行创建。然后在输入open ~/.lldbinit命令。则就会以文本编辑器打开此文件。然后再把如下字符复制到文本编辑器里即可:
command alias icome_reveal_load_sim expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0)
command alias icome_reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
-
command alias 其格式为:command alias 别名 LLDB命令,因此如上icome_reveal_start和icome_reveal_load_sim就是我设置的别名。也可以替换成你们自己喜欢的名字
-
然后,现在在按照如上LLDB集成的步骤,运行项目,暂停app,这时候你在输入icome_reveal_load_sim然后在输入icome_reveal_start即可在Reveal里审查你的UI元素了。(如下图)
![uVVNB4.png](https://i-blog.csdnimg.cn/blog_migrate/1044bd17564f166659fdbdc27323f474.png)