美文网首页
工作填坑随记之工具使用

工作填坑随记之工具使用

作者: 楚丶liu香 | 来源:发表于2019-12-10 15:14 被阅读0次

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...,如下图所示

reveal_01.png

在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选项。如下图所示

reveal_02.png

右击新增的这个断点,选择Move Breakpoint To --> User,这个User选项能够保证此断点可用于Xcode所有项目。

reveal_03.png

在Xcode中选择一款模拟器将项目运行起来,打开Reveal就能看到被连接的App了。

reveal_04.png

1.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主机名而连接失败。

reveal_06.png

小小的操作引来了不必要的麻烦,记录下引以为戒!

2、小米手机Charles抓包

小米手机特别是红米系列,在使用Charles抓包时都会遇到安装证书的问题,下载完证书后安装提示SSLHandshake: Received fatal alert: certificate_unknown,总之就是安装失败,无法使用Charles抓包了。

多次探索之后发现如下步骤能够解决这个问题:

  1. 保证手机和电脑处于同一wifi网络下,打开Charles,手机连接电脑代理
  2. 下载一个非小米的第三方浏览器,地址栏输入chls.pro/ssl
  3. 弹出下载链接,将文件下载至手机的Download文件夹
  4. 如果是.pem格式,将其改为.crt格式,如果已经是.crt格式忽略这一步。
  5. 设置 --> 更多设置 --> 系统安全 --> 从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?

相关文章

网友评论

      本文标题:工作填坑随记之工具使用

      本文链接:https://www.haomeiwen.com/subject/ykdggctx.html