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開發進階里面說的,但是沒有用,經過資料查詢,終于解決了這個問題!
要用Reveal連接真機調試,我們需要將Reveal的動態鏈接庫直接打包到程序里面去,原因是:iOS系統的沙盒機制,在未越獄的情況下,我們不可能訪問到Reveal的動態鏈接庫!只有打包到工程去!
打開我們的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系統中,為了安全起見,我們是不能運行沒有簽名過的代碼的!
iOS這樣做的好處是,當我們得到了一個App的運行包時,我們不能簡單的修改二進制文件然后在重新裝機!
但還是有方法可以實現的,原理就是注入動態鏈接庫+重簽名!詳情可參考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運行即可在連接列表中發現我們剛剛運行的App了
選中后即可看到如下界面
至此Reveal集成完畢!接下來你就可以快樂的調試UI了!