Reveal 是我們調試UI的利器艰垂,他避免了每次調試UI時一旦修改UI就需要重新cmd+R重新運行的麻煩操作键思,我們只需要接入Reveal互订,然后在Reveal操作界面修改UI屬性叠赦,可以直接反應在運行的App中流妻!如下圖的Reveal主界面牲蜀,最左邊反應樹形UI視圖層級,中間是一個3D的UI顯示層級绅这,右邊類似我們在使用xib時選中某個元素可以修改元素的各種屬性的操作涣达,修改完成后無需運行直接反應在我們的模擬器或者真機上面!方便極了
模擬器的調試
1:添加斷點按鈕,添加一個Symbolic BreakPoint
2:輸入Symbol:UIApplicationMain
3:add Action
- version 1.6.3 (5790)
- 模擬器
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void )dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void)0);
- 真機
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen((char *)[(NSString *)[(NSBundle )[NSBundle mainBundle] pathForResource:@"libReveal" ofType:@"dylib"] cStringUsingEncoding:0x4], 0x2) : ((void)0;
- version 4 (8769)
- 模擬器
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void )dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework/RevealServer", 0x2) : ((void)0);
- 真機
(Class)NSClassFromString(@"IBARevealLoader") == nil ? (void)dlopen((char)[(NSString)[(NSString)[(NSBundle)[NSBundle mainBundle] pathForResource:@"RevealServer" ofType:@"framework"] stringByAppendingPathComponent:@"RevealServer"] cStringUsingEncoding:0x4], 0x2) : ((void)0);
4:選中Automatically continue after evaluating actions.5:至此如果是模擬器的話度苔,直接cmd+R匆篓,即可!
真機的調試
真機的調試比較麻煩寇窑,文檔里面沒有直接說明鸦概,所以坑很多!自己參考了唐巧的iOS開發(fā)進階里面說的甩骏,但是沒有用窗市,經過資料查詢,終于解決了這個問題饮笛!
要用Reveal連接真機調試咨察,我們需要將Reveal的動態(tài)鏈接庫直接打包到程序里面去,原因是:iOS系統(tǒng)的沙盒機制福青,在未越獄的情況下摄狱,我們不可能訪問到Reveal的動態(tài)鏈接庫!只有打包到工程去素跺!
打開我們的Reveal二蓝,在菜單欄Help=>Show Reveal Library in Finder選項,選擇iOS Library會打開Finder指厌,將Finder里面的libReveal.dylib(v1.6.3)或者RevealServer.framework(v4)拖動到工程中刊愚,選擇Create Folder Reference,取消Add to Target
在Target=>Build Parse=>Copy Bundle Resource 將剛剛拖進工程的文件添加進去
按照唐巧的書寫的此時cmd+R就應該可以連接成功了
照他說的沒用踩验!
怎么辦鸥诽!怎么辦!怎么辦箕憾!
多方查資料得知:應該是libReveal.dylib(v1.6.3)或者RevealServer.framework(v4)沒有簽名牡借!想想也是,在我們的iOS系統(tǒng)中袭异,為了安全起見钠龙,我們是不能運行沒有簽名過的代碼的!
iOS這樣做的好處是御铃,當我們得到了一個App的運行包時碴里,我們不能簡單的修改二進制文件然后在重新裝機!
但還是有方法可以實現(xiàn)的上真,原理就是注入動態(tài)鏈接庫+重簽名咬腋!詳情可參考iOS冰與火之歌番外篇 - 在非越獄手機上進行App Hook
所以我們需要運行的時候給libReveal.dylib(v1.6.3)或者RevealServer.framework(v4)簽名!
選擇target=>build parse
點擊加號睡互,選擇New Run Script Phase
添加以下腳本對libReveal.dylib(v1.6.3)或者RevealServer.framework(v4)簽名根竿!
// v4
set -e
if [ -n "${CODE_SIGN_IDENTITY}" ]; then
codesign -fs "{CODE_SIGN_IDENTITY}" "{BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/RevealServer.framework/RevealServer"
fi
v1.6.3
set -e
if [ -n "${CODE_SIGN_IDENTITY}" ]; then
codesign -fs "{CODE_SIGN_IDENTITY}" "{BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib"
fi
至此cmd+R運行即可在連接列表中發(fā)現(xiàn)我們剛剛運行的App了
選中后即可看到如下界面
至此Reveal集成完畢陵像!接下來你就可以快樂的調試UI了!