前言
深深的喜欢这篇文章《iOS各种调试技巧》的写作风格,读起来就是那么愉快,文章有内容有价值,而且作者这么用心为大家写,推荐大家阅读这篇文章。写文章就是用来读的啊。我们开发者写产品要有为用户考虑的态度才能做出好产品;写文章要有为读者服务的态度才能让读者喜欢;做好工作也要有给同事给领导排忧解难的的公仆态度才对。你可能要问了,人家写了那么好的有关调试的文章,你干嘛还要写调试的文章,多此一举啊?你要是有这想法啊,我就得说您幼稚了,作者我混迹江湖这么多年,怎么这会考虑不到呢,主要是觉得《iOS各种调试技巧》只能算是一个调试技巧的笼统介绍,其实里面的每一种调试技巧都值得深入讲解,而且有些调试技巧他的文章也没有提到,比如这篇文章要讲的reveal调试,但我希望能借鉴他这篇文章的写作风格,希望带给读者轻松的阅读体验。
作为iOS开发者为什么需要学会使用reveal
1.相比xcode自带的视图调试(下文简称XcodeVD),reveal强大的不是一丁点。
比如,XcodeVD会有部分信息不显示,还有布局显示不精确,而reveal则表现好很多。
XcodeVD下的表现:
reveal下的表现:
大家可以注意看看,XcodeVD中显示的文本被挡住了挡住了耶,这怎么受得了,如果读者您眼尖,相信您已经注意到reveal显示的视图层次结构提供的信息更丰富,比如显示了文本的内容(中文内容信息),而xcode不仅仅需要您眼尖,还需要您能智慧过人聪明绝顶的去猜测一个UILabel对应模拟器上的哪个Label,蛋疼吗?不疼只能说明您牛逼。
2.相比xcodeVD只能看看之外,reveal可以修改视图的属性,并实时在模拟器(真机)上显示变化。(当然只是临时修改的属性,不会修改工程的实际代码,如果真实修改,还是需要修改的工程源代码的)。
在reveal中修改UILabel的属性
而XcodeVD几乎什么也干不了,只能看看,咳。
3.reveal最强大的一点是可以通过它查看和分析别伦家的App视图元素构成和布局。(牛逼波?这是reveal最有价值的部分,如果您觉得这个信息有价值,你西不西应该打赏我一下)。
下图是我特地为了读者您去偷窥了下携程这个美妞,(如果读者您是携程的,请您留情,不要笑我太疯癫,我只笑他人看不穿(😄))。
好了,您如果看到这里,我相信您已经迫不及待想要去学会如何使用reveal,我知道您不是因为喜欢偷窥而去学的,您只是单纯的爱好学习。
如何在Mac上安装Reveal
1.作为国人我知道您不喜欢轻易付费
reveal破解和安装:在简书上看到这篇文章《Reveal 1.6.2最新版 破解教程》,大家照着做就好,如果您笨到搞不定(或者聪明到想利用时间专注做好开发和产品,而不是这些非核心的学习上),您可以付费咨询我(打赏金额:¥10+)。
2.您是愿意的付费的小众?
直接去官网下载然后购买吧 http://revealapp.com/ 你要是肯花钱买,我真的为您点个赞,您是有钱的主,您顺便顺个手也给我打赏打赏吧,嗯。
如何在项目中集成Reveal
1.reveal官方有中文集成的教程。介绍了静态库、动态库、cocoapod的安装方法(这三种建议选这种)自行查看吧:
http://support.revealapp.com/kb/getting-started/reveal
上面的集成方式多少需要在我们的工程项目中加入一些代码,可能有些同事并不想使用这玩意,所以应该在团队中慎用。
2.下面这个方法不需要在工程中加入任何代码就可以使用:
http://support.revealapp.com/kb/getting-started/revealxcodereveal
3.一劳永逸的最佳集成玩法:
http://blog.ittybittyapps.com/blog/2013/11/07/integrating-reveal-without-modifying-your-xcode-project/
第三种集成的高级玩法有点复杂,如果你只想用好reveal而不想浪费时间去学如何集成,或者同样您可能笨到没搞定(哈哈,不是侮辱您啊,我也很笨,笨有笨的优点啊,比如学习有耐性和长性,我就研究了两天才研究明白),同样可以付费咨询我:(20元打赏+)。
在自己的项目中使用Reveal
一、基本使用
本文的重点是教大家如何使用Reveal,这部分只能有请我闪亮登场(掌声响起来),亲自出马搞了,关于Reveal的中文教程真的太少,不信你搜搜看看,基本都是一些重复且看了等于没看的垃圾文章。像作者我这样认认真真给老外当搬运工的人都不多见。
1.如果您安装reveal顺利,打开reveal应该是看到大致如下图这样的界面:
2.如果您搞定了集成,那你可以在模拟器(真机)上运行您项目程序,然后就可以reveal的左上角选择该模拟器(真机)了。
3.刷新界面
当您在模拟器上操作您的APP,你可能发现reveal没有及时更新,这个它确实做不到,您可以像2提到的再选择一次模拟,或者按下Command+R,还可以点击右上角的刷新图标:
Reveal 界面和功能介绍
Reveal界面主要分为三个部分:
1.左侧层级面板:界面层级关系区域,用于显示当前界面元素的结构树。
如果你多查看几个APP,就会发现他们的根都是UIScreen,然后是UIWindow,然后还有几个我们都不了解的UIKit封装类,如:
- 1)UINavigationTransitionView:导航控制器在这里发生转场行为的容器视图。
- 2)UIViewControllerWrapperView: 包含view controller 的view属性的封装视图。
总之这些我们不了解的视图我们(biè)管就对了。
2.中央可视化面板:可视化查看区域, 用于显示当前界面的布局效果(2D/3D)
在顶部有是三个控件。
- 1)显示样式分段控件。从左至右可以让视图显示三种状态:只显示视图边界frame,不显示内容;只显示内容不显示边界frame;边界frame和内容都显示。
- 2)中间的选择器控制器可以选择视图尺寸大小,它的值是视图内容和模拟器内容的大小正比值。
- 3)最右侧的开关控制可以选择显示3D效果还是2D效果。默认为3D效果。
在3D模式下,点击空白区域然后上下左右拖动,视图也跟着您的拖动方向三地旋转和3D展示。
3.右侧属性面板:控件详细参数区域,用于当前选中控件的参数展示(可以修改并 实时反应到可视化查看区域)
如图所示,包含以下5个功能。
- 1)程序观察器Application Inspector。主要显示和程序相关的全局属性。
- 2)对象观察器Identity Inspector。主要显示选中对象的先关属性,如父类信息,自身类名信息,内存地址信息等。
- 3)属性观察器Attributes Inspector。我知道您聪明,这些都知道。可是我就是要告诉您一遍:这里展示和选中对象相关属性的信息。您能拿我怎么着(O(∩_∩)O哈哈)。
- 4)布局观察器Layout Inspector。这里可以查看选中对象的frame,bounds,自动布局特性相关信息。
- 5)图层观察器Layer Inspector。
自动布局的调试(这部分的内容是从这里搬运)
自动布局(Auto Layout)已经越来越普遍的深入千家万户了,随着iOS设备分辨率的多(sui)样(pian)化,自动布局已慢慢成为了标准配置。
你可能经常看到控制台输出类似这样的内容,而不知何处下手:
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fc82d3e18a0 H:[UIView:0x7fc82aba1210(768)]>",
"<NSLayoutConstraint:0x7fc82d6369e0 H:[UIView:0x7fc82aba1210]-(0)-| (Names: '|':UIView:0x7fc82d6b9f80 )>",
"<NSLayoutConstraint:0x7fc82d636a30 H:|-(0)-[UIView:0x7fc82aba1210] (Names: '|':UIView:0x7fc82d6b9f80 )>",
"<NSLayoutConstraint:0x7fc82d3e7fd0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc82d6b9f80(50)]>"
)
Will attempt to recover by breaking constraint
\<NSLayoutConstraint:0x7fc82d3e18a0 H:UIView:0x7fc82aba1210(768)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
除了我们在编码时自己绑定到View上的约束条件(Constraints)之外,其实许多UIKit控件还会被隐式地地设置上一些约束,而这些可能会带来一些意外的布局结果。
也许曾经你需要使用LLDB来一点点调试Auto Layouts:
(lldb) po 0x7731880
$0 = 124983424 <UIView: 0x7731880; frame = (90 -50; 80 100);
layer = <CALayer: 0x7731450>>
(lldb) po 0x7731880 superview
$2 = 0x07730fe0 \<UIView: 0x7730fe0; frame = (32 128; 259 604);
layer = \<CALayer: 0x7731150>>
(lldb) po [[0x7731880 superview] recursiveDescription]
$3 = 0x07117ac0 <UIView: 0x7730fe0; frame = (32 128; 259 604); layer = <CALayer: 0x7731150>>
| <UIView: 0x7731880; frame = (90 -50; 80 100); layer = <CALayer: 0x7731450>>
| <UIView: 0x7731aa0; frame = (90 101; 80 100); layer = <CALayer: 0x7731c60>>
有了Reveal,这就方便多了。Reveal对视图上的约束条件提供了相当丰富的检视与实时修改功能,具体看下面这张图,再自己摸索一下就好了。
- a显示/隐藏所有约束条件
- b 查看关联到此View的所有约束
- c 可以直接在Canvas中选中某一约束
- d 查看某一约束的具体信息,可以实时修改constant属性,立刻检查效果
- e 跳转到某一约束的详细属性页面
给大家透露一个我摸索到的十分特别以及及其重要的知识:蓝色的约束代表系统给对象添加的约束,紫色的约束是我们开发者给对象添加的约束。恩,这个在您调试布局冲突时很重要。不谢,打赏我就对了,我不是雷锋,我不会武功,我不会飞檐走壁,也不会饿着肚子写文章。
实时修改View属性
Reveal不仅仅只是查看各种属性的工具,也支持实时的修改一些属性。如下图中的大部份属性,你都可以实时的在模拟器中看到修改后的效果。这省去了过去总是要修改代码,重新编译运行这个漫长的反馈流程。在和设计师一起尝试各种显示效果时,这个功能特别高效。
Reveal偷窥正确姿势
(部分内容搬运,接受鄙视,但是我是让文章有深度需要的勤快的搬运工,和普通搬运工可以区别开来好嘛,O(∩_∩)O)(您错过以下内容,我只能呵呵了)
温馨提示:前方高能,越过难度有点大,如果遇到头晕脑胀、眼神绝望,请尽快逃离现场。如果您依然十分想要偷窥,又不想费时费力,最好的解决办法依然是打赏我拉,小的带您坐缆车,飞速直达目的地。(打赏¥50+)。
1.越狱你的iOS设备:可以利用盘古、PP助手、太极等三方工具一键越狱。这部分内容请自行搜索。
2.iOS设备越狱完成后,需要使用Cydia
安装两个软件:OpenSSH 和CydiaSubstrate
安装OpenSSH,打开越狱后的设备上的Cydia程序,点击搜索输入OpenSSH,然后点击安装。(下面的配图是已经安装成功后搜索的显示画面)
SSH是一种可以保证用户加密远程登录到系统的协议,OpenSSH是一个SSH的连接传输工具。
安装Cydia Substrate,打开越狱后的设备上的Cydia程序,点击搜索输入Cydia Substrate,然后点击安装。只有安装了CydiaSubstrate之后才会有MobileSubstrate目录(此目录必须存在才可以继续下面的步骤)。(下面的配图是已经安装成功后搜索的显示画面)
MobileSubstrate是一个公共库,可以用来动态替换内存中的代码、数 据等。基本上越狱机下比较有用的系统工具都需要这个库,是Cydia同一个作者 维护的,可以放心装。
3.将libReveal.dylib上传到越狱后的设备的/Library/MobileSubstrate/DynamicLibraries下检查工作:测试OpenSSH和CydiaSubstrate是否安装成功
- 1)上传libReveal.dylib文件必须使用到上面安装的OpenSSH工具。如果想要使用OpenSSH工具,那么就必须将Reveal软件所在的mac设备与越狱后的iOS设备置于同一个局域网内。
2)首先来测试OpenSSH是否安装成功。获取越狱后的设备的局域网内的IP地址,打开“设置”->“WLAN”,连上局域网,然后再点击连接上的局域网查看iOS设备的IP地址。
3)打开mac上的终端工具(Terminal),输入如下命令:ssh root@iOS设备IP地址。输入完成后回车,等待连接iOS设备。
iOS设备的IP地址指的是越狱后的设备(iphone、ipad)的IP地址,也就是上个步骤中获取的IP地址,后面的教程中出现的地址仅仅是代表笔者测试时iOS设备的IP地址(192.168.2.2),读者请一定要查看自己的iOS设备地址,并进行替换。
4)接下来会提示你输入root用户的密码,iOS设备root用户的默认密码是alpine,在终端中输入密码时,终端不会显示你输入的字符,所以只需要输入alpine字符后回车就可以请求连接iOS设备了。(这一步请保证你的iOS设备屏幕已经解锁,不然不会出现输入密码的提示!)
如果出现root#字符就表示连接成功了。
接下来测试Cydia Substrate 是否安装成功,上一步已经连接上iOS设备的终端中输入以下命令:cd /Library/MobleSubstrate/DinamicLibraries
,回车查看返回结果。如果出现-sh: cd: /Library/MobileSubstrate/DynamicLibraries: No such file or directory
提示那就说明Cydia Substrate安装不成功,不成功请重新进入iOS设备上下载安装Cydia Substrate软件。
若果没出现如何错误提示信息,就说明Cydia Substrate安装成功!
4.上传libReveal.dylib。如果上一个步骤的检查工作全部完成:OpenSSH和Cydia Substrate成功安装。
重新打开mac上的终端工具(Terminal),使用如下命令进入Reveal软件的动态库所在目录:cd /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries
使用如下命令将libReveal.dylib上传到iOS设备的/Library/MobileSubstrate/DynamicLibraries目录下:scp libReveal.dylib root@iOS设备IP地址:/Library/MobileSubstrate/DynamicLibraries/
,请替换@之后的“iOS设备的IP地址”为你的iOS设备的真实地址,回车执行命令后会让你输入iOS设备的root的密码,默认是alpine,上传成功后会显示%100字样。
5.编写并上传一份libReveal.plist
到iOS设备的/Library/MobileSubstrate/DynamicLibraries
目录中。这个文件的作用是:在Reveal中监控指定的App,不上传这个文件也是可以的,那么Reveal就会监控所有的App,只是这样速度会慢一点点。编写libReveal.plist文件,最简单的方法就是新建一个plist文件,它的内容是
Filter = { Bundles = ( “你要查看的app的bundle Id1”,”你要查看的app的bundle Id2” ); ; }
xcode下打开这个libReveal.plist文件可以看到它的结构示例(笔者已经添加了两个Bundle ID):
关于获取iOS App应用的Bundle ID:打开PP助手、iTools、itunes等工具,备份手机上安装到的程序到电脑上(或直接下载需要查看程序ipa文件),将.ipa修改成.zip,解压后按如下路径进入info.plist文件所在目录,打开info.plist其中便有我们需要的bundle Id。
6.上传libReveal.plist
到iOS设备的/Library/MobileSubstrate/DynamicLibraries
目录中。打开终端进入libReveal.plist所在的目录,使用如下命令上传:scp libReveal.plist root@iOS设备的IP地址:/Library/MobileSubstrate/DynamicLibraries/,请替换@之后的“iOS设备的IP地址”为你的iOS设备的真实地址,回车执行命令后会让你输入iOS设备的root的密码,默认是alpine,上传成功后会显示%100字样。
7.接下来在重启你的iOS设备,连上mac电脑所在的局域网,上打开你需要在Reveal中观察的程序,此时在mac电脑上的Reveal中选择你要观察的程序。
提示:如果此时在mac上的Reveal左上方没有出现你想要调试的程序,这里给出几个检查的建议:
- 1.手机连接的wifi是否与mac处于同一局域网(如果你在执行步骤7时是在正确执行步骤5和6之后,那就忽略这个检查,这里是针对手机重启了或者是切换了手机网络等情况)。
- 2.查看你编写的libReveal.plist文件中写的BundleID是否与你在iOS设备上打开的应用是否匹配。甚至,请检查你的pist文件结构是否正确!
- 3.iOS设备上想要观察的App应用必须处于前台,进入后台即使打开了,在Reveal的左上角“选择连接的应用”框中也不会显示。
补充
欢迎收藏的 我的博客