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

工作填坑随记之工具使用

作者: 楚丶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