前言
Reveal(https://revealapp.com)是一個iOS程序界面調(diào)試工具。使用Reveal,我們可以在iOS開發(fā)時動態(tài)的查看和修改應(yīng)用程序的界面。
在開發(fā)中,對于動態(tài)或者復(fù)雜的交互界面,手寫UI的不可避免的。通過Reveal,我們可以很方便的調(diào)試和修改應(yīng)用頁面,免去了每次修改之后還要重新啟動程序的痛苦。
一. Reveal簡介
Reveal類似Chrome的“審查元素”功能,使我們不但可以在運行時看到iOS程序的界面層級關(guān)系,還可以實時的修改程序界面,不用重新運行程序就可以看到修改之后的結(jié)果。
在使用時,我們將Reveal連接上模擬器或真機上正在運行的iOS程序,然后就可以查看調(diào)試iOS程序的界面。
下圖是Reveal的運行界面,其界面主要分成三個部分:
1. 左邊部分是整個界面的層級關(guān)系,在這里可以以樹形層級的方式查看所有的界面元素。
2. 中間部分是可視化查看區(qū)域,用戶可以在這里切換2D或者3D的查看方式,這里也能看到程序運行的實時界面。
3. 右面部分是控件詳細(xì)的參數(shù)查看區(qū)域,當(dāng)我們選中其中某個控件的時候,右邊就可以顯示出該控件的詳細(xì)參數(shù)列表。除了在查看這些參數(shù)值以外,還可以修改這些值,所有的修改會實時的反應(yīng)到中間的預(yù)覽區(qū)域。
二. Reveal的使用
Reveal官方介紹的方法大多數(shù)需要修改工程文件,由于目前團隊開發(fā)居多,那么如果修改了工程文件,就需要團隊中其他人也都裝Reveal,這是很不友好的。下面介紹不修改任何工程文件的情況下完成對模擬器和真機的調(diào)試方法。
2.1 創(chuàng)建.lldbinit文件,并編輯
打開終端,輸入 vi ~/.lldbinit,創(chuàng)建一個.lldbinit文件,然后將如下內(nèi)容輸入到該文件中,并:wq保存退出。
command alias reveal_load_sim expr (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2);
command alias reveal_load_dev expr (void *)dlopen([(NSString *)[(NSBundle *)[NSBundle mainBundle] pathForResource:@"libReveal" ofType:@"dylib"] cStringUsingEncoding:0x4], 0x2);
command alias reveal_start expr (void)[(NSNotificationCenter *)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
command alias reveal_stop expr (void)[(NSNotificationCenter *)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStop" object:nil];
該步驟其實是為lldb設(shè)置了4個別名,這樣可以方便后續(xù)操作,這4個別名意義如下:
reveal_load_sim 為模擬器加載reveal調(diào)試用的動態(tài)鏈接庫。
reveal_load_dev 為真機加載reveal調(diào)試用的動態(tài)鏈接庫。
reveal_start 啟動reveal調(diào)試功能。
reveal_stop 停止reveal調(diào)試功能。
注:reveal_load_sim等別名可以根據(jù)自己的喜好設(shè)置。
2.2 模擬器調(diào)試
在AppDelegate類的application: didFinishLaunchingWithOptions:方法中,進行如下三個步驟:
1. 在方法內(nèi)部第一行增加一個斷點,并編輯該斷點“Edit Breakpoint”;
2. 單擊“Action”右面的“Add Action”按鈕,然后輸入模擬器加載動態(tài)庫的別名:“reveal_load_sim”;
3. 勾選“Option”上的“Automatically continue after evaluating actions”選項

之后運行iOS程序,并打開Reveal,在Reveal界面的左上角看到是否有模擬器可以連接調(diào)試,如果有選擇它,查看并調(diào)試iOS程序。

2.3 真機調(diào)試
在開發(fā)中,大部分的調(diào)試設(shè)備是沒有越獄的設(shè)備,那么使用Reveal來調(diào)試UI的步驟稍微復(fù)雜一些的。
要用Reveal連接真機調(diào)試,需要把Reveal動態(tài)鏈接庫上傳到真機上,由于iOS設(shè)備有沙盒存在,那么只能將Reveal的動態(tài)鏈接庫添加到工程中,步驟如下:
1. 選擇Reveal菜單欄中的“Help” -> “Show Reveal Library in Finder” -> “iOS Library”。

2. 找到iOS動態(tài)鏈接庫libReveal.dylib庫

3. 把libReveal.dylib庫拖入到工程如圖位置中

注:libReveal.dylib庫必須在 “Copy Bundle Resources” 下,如果在“Link Binary With Libraries”中,必須刪除。
4. 導(dǎo)入時選擇“Copy items if needed”選項

5. 由于連接模擬器的方式和連接真機方式類似,只需要吧AppDelegate斷點Action內(nèi)容從reveal_load_sim改為reveal_load_dev即可。
6. 添加Reveal運行腳本選項

7. 添加腳本內(nèi)容

腳本內(nèi)容如下:
set -e
if [ -n "${CODE_SIGN_IDENTITY}" ]; then
codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib"
fi
8. 真機調(diào)試

2.4 真機調(diào)試說明
1. 真機調(diào)試必須保證開發(fā)者電腦和手機都在統(tǒng)一wifi環(huán)境下;
2. 開發(fā)者證書必須和鑰匙串中證書保持一致,而且只有一個,因為Reveal只能識別一個證書,如果在鑰匙串中有多個以iPhone Developer開頭的證書,先刪除其他的,否則調(diào)試可能會不成功。


三.總結(jié)
除了Reveal還有其他的調(diào)試工具,如PonyDebugger(https://github.com/square/PonyDebugger),也可以調(diào)試iOS應(yīng)用界面,是免費而且是開源的,Reveal是收費的,不過功能相對強大。