1涵防、Reveal
工欲善其事峡眶,必先利其器,Reveal就是這樣一個(gè)能夠事半功倍的利器疏唾。Reveal為iOS開發(fā)人員帶來(lái)了強(qiáng)大的運(yùn)行時(shí)視圖調(diào)試功能页衙,包括檢查摊滔,修改和調(diào)試。其實(shí)大家估計(jì)已經(jīng)都在使用了店乐,今天只是簡(jiǎn)單說(shuō)下如何接入使用以及碰到的一個(gè)問(wèn)題艰躺。
1.1 Reveal使用
首先你要先在Mac電腦上下載Reveal軟件,至于如何下載眨八,使用正版還是破解版本文不做任何介紹腺兴,言歸正傳,我們來(lái)看如何使用Xcode接入Reveal調(diào)試模擬器App廉侧。
① 打開Reveal页响,在菜單欄點(diǎn)擊Help --> Install Debugger Commands...
安裝調(diào)試命令工具。
② 點(diǎn)擊Continue
完成安裝段誊。
③ 打開Xcode項(xiàng)目闰蚕,在菜單欄選擇View --> Navigators --> Show Breakpoint Navigator
。
④ 點(diǎn)擊Xcode面板左下角的+
按鈕连舍,選擇Symbolic Breakpoint...
陪腌,如下圖所示
⑤ 在Symbol選項(xiàng)中輸入UIApplicationMain
。
⑥ 點(diǎn)擊Add Action
按鈕,在出現(xiàn)的選項(xiàng)框中輸入以下命令:
reveal load
如果Reveal不能正常顯示App诗鸭,請(qǐng)將reveal load
更換為下面命令:
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework/RevealServer", 0x2) : ((void*)0)
注意:如果使用上面命令染簇,RevealServer
路徑一定要配置正確。如果/Applications/Reveal.app/Contents
下沒(méi)有后面路徑强岸,需要自行將RevealServer
路徑補(bǔ)齊锻弓。
⑦ 選中Automatically continue after evaluating actions
選項(xiàng)。如下圖所示
⑧ 右擊新增的這個(gè)斷點(diǎn)蝌箍,選擇Move Breakpoint To --> User
青灼,這個(gè)User選項(xiàng)能夠保證此斷點(diǎn)可用于Xcode所有項(xiàng)目。
⑨ 在Xcode中選擇一款模擬器將項(xiàng)目運(yùn)行起來(lái)妓盲,打開Reveal就能看到被連接的App了杂拨。
1.2 連接問(wèn)題
一直好好的在用著的Reveal,突然有一天連接不上了悯衬,重裝弹沽,然后按照上面的步驟再來(lái)一遍也是徒然,如下圖所示
步入正題筋粗,開始排查問(wèn)題所在策橘。
① 確保Reveal已經(jīng)正確連接
首先查看Xcode控制臺(tái)打印日志是否有以下類似信息:
2019-12-10 10:46:15.159761+0800 SampleApp[64692:3816012] INFO: Reveal Server started (Protocol Version 49).
如果沒(méi)有看到類似這條的信息,那么Reveal沒(méi)有啟動(dòng)成功娜亿,你需要重新按照1.1
中的指南重新集成Reveal丽已。
② Reveal Server Started,仍看不到App顯示
到了這一步买决,代表Xcode和Reveal的配置沒(méi)有問(wèn)題沛婴,Reveal已經(jīng)成功集成了,但是Reveal中仍然看不到要連接的App督赤,那么按照以下命令排查Reveal和模擬器的網(wǎng)絡(luò)連接是否存在問(wèn)題嘁灯。
在終端中輸入以下命令:
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
就是當(dāng)前正在運(yùn)行Reveal框架的應(yīng)用程序,實(shí)例名稱末尾的代碼用來(lái)保證每一個(gè)運(yùn)行在Reveal上的App在當(dāng)前網(wǎng)絡(luò)上是唯一的够挂。如果要退出當(dāng)前命令輸出旁仿,請(qǐng)使用control + c
快捷鍵。
現(xiàn)在我們要找出在Reveal連接時(shí)當(dāng)前App監(jiān)聽的哪個(gè)端口孽糖,命令行輸入可以使用下面命令:
dns-sd -L Reveal--60e793ec _reveal._tcp.
注意: Reveal--60e793ec
要替換為你自己的應(yīng)用程序的實(shí)例名稱(從上一條命令獲得)枯冈。
輸出如下:
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
停止當(dāng)前命令輸出“煳颍可以看到連接時(shí)App監(jiān)聽的host是localhost
尘奏,端口是58811
。在iOS模擬器中運(yùn)行時(shí)病蛉,Reveal框架會(huì)始終綁定到localhost(127.0.0.1)炫加。在真機(jī)設(shè)備上運(yùn)行時(shí)瑰煎,它將綁定到該設(shè)備的公共網(wǎng)絡(luò)接口。
為了能夠發(fā)現(xiàn)模擬器中運(yùn)行的App俗孝,Reveal需要能夠解析localhost
主機(jī)名酒甸。要檢查這塊是否有問(wèn)題,在終端輸入下面命令:
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
有問(wèn)題輸出:
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
停止當(dāng)前命令輸出赋铝。如果沒(méi)有看到正常的輸出插勤,表明你的/etc/hosts
文件缺失localhost
條目。使用命令:
sudo vim /etc/hosts
確保host文件包含以下內(nèi)容:
##
# 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
③ 測(cè)試與Reveal服務(wù)的連接
通過(guò)②中的一系列操作革骨,我們已經(jīng)解決了Reveal與模擬器連接的問(wèn)題农尖,下面測(cè)試下嵌入到我們App的Reveal服務(wù)的連接,命令如下:
curl -s -D - http://localhost:58811/application -o /dev/null
輸出內(nèi)容如下:
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
看到類似的輸出內(nèi)容良哲,表示與Reveal的鏈接是沒(méi)有問(wèn)題的盛卡,愉快的使用Reveal協(xié)助我們開發(fā)App吧~
至此這個(gè)Reveal不顯示模擬器App的問(wèn)題已經(jīng)修復(fù)了,仔細(xì)一想筑凫,原來(lái)是前幾天下了SwitchHosts!
作為本地host管理工具滑沧,而在這個(gè)工具中我默認(rèn)關(guān)閉了backup所對(duì)應(yīng)的本地host,導(dǎo)致Reveal不能夠解析localhost
主機(jī)名而連接失敗漏健。
小小的操作引來(lái)了不必要的麻煩嚎货,記錄下引以為戒橘霎!
2蔫浆、小米手機(jī)Charles抓包
小米手機(jī)特別是紅米系列,在使用Charles抓包時(shí)都會(huì)遇到安裝證書的問(wèn)題姐叁,下載完證書后安裝提示SSLHandshake: Received fatal alert: certificate_unknown
瓦盛,總之就是安裝失敗,無(wú)法使用Charles抓包了外潜。
多次探索之后發(fā)現(xiàn)如下步驟能夠解決這個(gè)問(wèn)題:
- 保證手機(jī)和電腦處于同一wifi網(wǎng)絡(luò)下原环,打開Charles,手機(jī)連接電腦代理
- 下載一個(gè)非小米的第三方瀏覽器处窥,地址欄輸入
chls.pro/ssl
- 彈出下載鏈接嘱吗,將文件下載至手機(jī)的Download文件夾
- 如果是
.pem
格式,將其改為.crt
格式滔驾,如果已經(jīng)是.crt
格式忽略這一步谒麦。 - 在
設(shè)置 --> 更多設(shè)置 --> 系統(tǒng)安全 --> 從SD卡安裝
,進(jìn)入頁(yè)面選擇已經(jīng)下載好的.crt
文件即可哆致。
安裝完后绕德,Charles抓到的鏈接可能都是unknown
,看到的Response也都是亂碼摊阀,這個(gè)時(shí)候我們需要設(shè)置Charles的SSL Proxying
耻蛇,選擇Charles --> Proxy --> SSL Proxying Settings...
踪蹬,在彈出的對(duì)話框中選擇Add
,將下面的內(nèi)容對(duì)應(yīng)輸入到相應(yīng)的輸入框中臣咖,點(diǎn)擊OK
即可跃捣。
Host:*
Port:443
這個(gè)時(shí)候再去Charles刷新請(qǐng)求是不是已經(jīng)能夠看到請(qǐng)求返回的數(shù)據(jù)了呢,Perfect~
參考
Load Reveal Server via an Xcode Breakpoint
Bonjour Debugging: Why can't I connect to my app?