iOS Reveal 非越獄真機斷點調試

Reveal 是我們調試UI的利器,他避免了每次調試UI時一旦修改UI就需要重新cmd+R重新運行的麻煩操作,我們只需要接入Reveal,然后在Reveal操作界面修改UI屬性,可以直接反應在運行的App中!如下圖的Reveal主界面,最左邊反應樹形UI視圖層級,中間是一個3D的UI顯示層級,右邊類似我們在使用xib時選中某個元素可以修改元素的各種屬性的操作,修改完成后無需運行直接反應在我們的模擬器或者真機上面!方便極了

image.png

模擬器的調試

1:添加斷點按鈕,添加一個Symbolic BreakPoint

image.png

2:輸入Symbol:UIApplicationMain

image.png

3:add Action

image.png
  • 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.
image.png

5:至此如果是模擬器的話,直接cmd+R,即可!

image.png

真機的調試

真機的調試比較麻煩,文檔里面沒有直接說明,所以坑很多!自己參考了唐巧的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

image.png

在Target=>Build Parse=>Copy Bundle Resource 將剛剛拖進工程的文件添加進去

image.png

按照唐巧的書寫的此時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

image.png

點擊加號,選擇New Run Script Phase

image.png

添加以下腳本對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

image.png

至此cmd+R運行即可在連接列表中發現我們剛剛運行的App了

image.png

選中后即可看到如下界面

image.png

至此Reveal集成完畢!接下來你就可以快樂的調試UI了!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Reveal簡介 Reveal是一個iOS程序界面調試工具。可以在Reveal上查看視圖的層級和修改控件的屬...
    繁星mind閱讀 11,375評論 11 35
  • Reveal是iOS開發工具中的神器之一,它能夠在應用程序運行過程中調試應用程序界面。 通過Reveal我們可以連...
    jackfrued閱讀 12,517評論 2 48
  • 在移動開發當中,APP的界面的編寫和調試占了相當的一部分時間,那么在不借助Xcode之外的第三方工具的情況下來調試...
    要上班的斌哥閱讀 11,803評論 15 72
  • Reveal Reveal是分析、調試iOS應用UI的利器。 Reveal能夠在運行時調試和修改iOS應用程序。它...
    fakepinge閱讀 1,694評論 0 5
  • 那時在老家上初一的小女兒放暑假了,想馬上來長沙玩,因沒達到她爸給她訂的期考目標分數,先補課一個月,八月份才能來...
    熱冰_1c24閱讀 210評論 0 5