工作填坑随记之工具使用
1、Reveal
工欲善其事,必先利其器,Reveal就是这样一个能够事半功倍的利器。Reveal为iOS开发人员带来了强大的运行时视图调试功能,包括检查,修改和调试。其实大家估计已经都在使用了,今天只是简单说下如何接入使用以及碰到的一个问题。
1.1 Reveal使用
首先你要先在Mac电脑上下载Reveal软件,至于如何下载,使用正版还是破解版本文不做任何介绍,言归正传,我们来看如何使用Xcode接入Reveal调试模拟器App。
① 打开Reveal,在菜单栏点击Help --> Install Debugger Commands...
安装调试命令工具。
② 点击Continue
完成安装。
③ 打开Xcode项目,在菜单栏选择View --> Navigators --> Show Breakpoint Navigator
。
④ 点击Xcode面板左下角的+
按钮,选择Symbolic Breakpoint...
,如下图所示
⑤ 在Symbol选项中输入UIApplicationMain
。
⑥ 点击Add Action
按钮,在出现的选项框中输入以下命令:
reveal load
如果Reveal不能正常显示App,请将reveal load
更换为下面命令:
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework/RevealServer", 0x2) : ((void*)0)
⑦ 选中Automatically continue after evaluating actions
选项。如下图所示
⑧ 右击新增的这个断点,选择Move Breakpoint To --> User
,这个User选项能够保证此断点可用于Xcode所有项目。
⑨ 在Xcode中选择一款模拟器将项目运行起来,打开Reveal就能看到被连接的App了。
reveal_04.png1.2 连接问题
一直好好的在用着的Reveal,突然有一天连接不上了,重装,然后按照上面的步骤再来一遍也是徒然,如下图所示
reveal_05.png步入正题,开始排查问题所在。
① 确保Reveal已经正确连接
首先查看Xcode控制台打印日志是否有以下类似信息:
2019-12-10 10:46:15.159761+0800 SampleApp[64692:3816012] INFO: Reveal Server started (Protocol Version 49).
如果没有看到类似这条的信息,那么Reveal没有启动成功,你需要重新按照1.1
中的指南重新集成Reveal。
② Reveal Server Started,仍看不到App显示
到了这一步,代表Xcode和Reveal的配置没有问题,Reveal已经成功集成了,但是Reveal中仍然看不到要连接的App,那么按照以下命令排查Reveal和模拟器的网络连接是否存在问题。
在终端中输入以下命令:
dns-sd -B _reveal._tcp local
可以看到输出如下:
Browsing for _reveal._tcp.local
DATE: ---Mon 09 Dec 2019---
18:11:09.386 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
18:11:09.387 Add 2 -1 local. _reveal._tcp. Reveal--60e793ec
Reveal--60e793ec
就是当前正在运行Reveal框架的应用程序,实例名称末尾的代码用来保证每一个运行在Reveal上的App在当前网络上是唯一的。如果要退出当前命令输出,请使用control + c
快捷键。
现在我们要找出在Reveal连接时当前App监听的哪个端口,命令行输入可以使用下面命令:
dns-sd -L Reveal--60e793ec _reveal._tcp.
注意: Reveal--60e793ec
要替换为你自己的应用程序的实例名称(从上一条命令获得)。
输出如下:
Lookup Reveal--60e793ec._reveal._tcp..local
DATE: ---Mon 09 Dec 2019---
18:14:15.896 ...STARTING...
18:14:15.898 Reveal--60e793ec._reveal._tcp.local. can be reached at localhost.:58811 (interface -1)
isSim=true devSysName=iOS devSysVer=12.1 appExtTypeId= protoVer=49 appBundleId=com.xxx.xxx appName=SampleApp appIsExt=false appShortVers=3.5.0 devLocalModel=iPhone deviceID=iPhoneX-iOS-12.1 devName=iPhone\ X devModel=iPhone appVers=3.5.0
control + c
停止当前命令输出。可以看到连接时App监听的host是localhost
,端口是58811
。在iOS模拟器中运行时,Reveal框架会始终绑定到localhost(127.0.0.1)。在真机设备上运行时,它将绑定到该设备的公共网络接口。
为了能够发现模拟器中运行的App,Reveal需要能够解析localhost
主机名。要检查这块是否有问题,在终端输入下面命令:
dns-sd -G v4 localhost
正常输出:
DATE: ---Tue 10 Dec 2019---
10:08:12.749 ...STARTING...
Timestamp A/R Flags if Hostname Address TTL
10:08:12.751 Add 2 -1 localhost. 127.0.0.1 1
有问题输出:
DATE: ---Tue 10 Dec 2019---
10:04:10.680 ...STARTING...
Timestamp A/R Flags if Hostname Address TTL
10:04:10.684 Add 2 0 loaclhost.xxxx.cn. 0.0.0.0 4502
No Such Recor
control + c
停止当前命令输出。如果没有看到正常的输出,表明你的/etc/hosts
文件缺失localhost
条目。使用命令:
sudo vim /etc/hosts
确保host文件包含以下内容:
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
③ 测试与Reveal服务的连接
通过②中的一系列操作,我们已经解决了Reveal与模拟器连接的问题,下面测试下嵌入到我们App的Reveal服务的连接,命令如下:
curl -s -D - http://localhost:58811/application -o /dev/null
输出内容如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Reveal-Protocol-Version: 49
Reveal-Device-Simulator: YES
Reveal-System-Name: iOS
Accept-Ranges: bytes
Date: Mon, 09 Dec 2019 10:20:07 GMT
Reveal-System-Version: 12.1
Content-Length: 2043834
Reveal-Device-Model: iPhone
看到类似的输出内容,表示与Reveal的链接是没有问题的,愉快的使用Reveal协助我们开发App吧~
至此这个Reveal不显示模拟器App的问题已经修复了,仔细一想,原来是前几天下了SwitchHosts!
作为本地host管理工具,而在这个工具中我默认关闭了backup所对应的本地host,导致Reveal不能够解析localhost
主机名而连接失败。
小小的操作引来了不必要的麻烦,记录下引以为戒!
2、小米手机Charles抓包
小米手机特别是红米系列,在使用Charles抓包时都会遇到安装证书的问题,下载完证书后安装提示SSLHandshake: Received fatal alert: certificate_unknown
,总之就是安装失败,无法使用Charles抓包了。
多次探索之后发现如下步骤能够解决这个问题:
- 保证手机和电脑处于同一wifi网络下,打开Charles,手机连接电脑代理
- 下载一个非小米的第三方浏览器,地址栏输入
chls.pro/ssl
- 弹出下载链接,将文件下载至手机的Download文件夹
- 如果是
.pem
格式,将其改为.crt
格式,如果已经是.crt
格式忽略这一步。 - 在
设置 --> 更多设置 --> 系统安全 --> 从SD卡安装
,进入页面选择已经下载好的.crt
文件即可。
安装完后,Charles抓到的链接可能都是unknown
,看到的Response也都是乱码,这个时候我们需要设置Charles的SSL Proxying
,选择Charles --> Proxy --> SSL Proxying Settings...
,在弹出的对话框中选择Add
,将下面的内容对应输入到相应的输入框中,点击OK
即可。
Host:*
Port:443
这个时候再去Charles刷新请求是不是已经能够看到请求返回的数据了呢,Perfect~
参考
Load Reveal Server via an Xcode Breakpoint
Bonjour Debugging: Why can't I connect to my app?