介面除錯神器Reveal
Reveal是iOS開發工具中的神器之一,它能夠在應用程式執行過程中除錯應用程式介面。 透過Reveal我們可以連線到應用程式,並允許開發者編輯各種使用者介面引數,�結果會馬上在使用者介面上呈現。就像Web開發人員用�瀏覽器提供的開發人員工具除錯頁面一樣,Reveal允許開發者在不修改程式碼、不重新構建專案、不重新部署應用程式的情況下就能夠除錯iOS應用的使用者介面。
安裝Reveal
Reveal下載地址:
整合指南
整合Reveal無需新增任何程式碼,無需引入任何標頭檔案。庫將會在應用啟動時自動載入,並在應用內部啟動必要的Reveal服務。下面介紹三種整合方式。
靜態連線
將Reveal的靜態庫檔案連線入應用,是最簡單快捷地啟用Reveal除錯介面的方式。
提示: 不要將Reveal庫檔案隨著正式應用一起釋出到App Store。
下面的步驟將會展示如何透過構建配置,而把Reveal靜態庫檔案,僅連線到除錯構建的流程中。
在Xcode中開啟您的iOS工程。
-
啟動Reveal並選擇Help Show Reveal Library in Finder,這將會開啟Finder視窗,並顯示一個名為iOS-Libraries的資料夾。
-
將 Reveal.framework 檔案拖入Xcode中的Project Navigator皮膚。
-
在下圖所顯示的Add to targets對話方塊中,選擇所有您希望與Reveal整合的target。�注意,在如下圖所示的視窗中選中Copy items if needed,它會把 Reveal.framework 複製到專案中,如果你這樣做了,那麼當更新Reveal至新版本時,也依照上述步驟更新Reveal.framework檔案。
-
點選Finish。
選擇Build Settings標籤,在Other Linker Flags的Debug配置項中加入如下配置。
-ObjC -lz -framework Reveal
如果您使用的是Xcode 7, 請確認 Reveal.framework 所在的目錄在您的工程配置項 “Framework Search Paths” 中。你可以在如下圖所示的位置新增下面的內容。
$(inherited)"$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries"
在Xcode中,構建並執行您的應用。如果應用執行於真實裝置之上,請確保此裝置與正在執行Reveal的Mac機器,處於同一WiFi網路中。
如果一切正常執行,請切換到Reveal應用,此時您的應用應會出現在應用選擇器的下拉選單當中。選中您的應用,確認可以看到此時正在模擬器(或裝置)中執行的應用介面截圖。
動態載入
動態載入允許iOS應用在執行時,可以按需地載入第三方庫。採用這種方式,庫檔案無需連線入應用的可執行檔案,而是被加入到了應用Bundle中去,從而在執行時能按需載入。這種方式使得開發者可以在個人應用中,完全自由地控制Reveal庫的載入,以及其服務的啟動與停止。
將Reveal加入您的Xcode工程,使得您團隊中的其他成員無需任何額外的配置,就可以使用Reveal。
提示: 永遠不要將包含Reveal動態庫檔案的應用提交給Apple的App Store。Apple不允許將含有動態載入庫檔案的iOS應用釋出到App Store中。
在Xcode中開啟您的iOS工程。
-
啟動Reveal並選擇Help Show Reveal Library in Finder,這將會開啟Finder視窗,並顯示一個名為iOS-Libraries的資料夾。
-
將 libReveal.dylib 檔案拖入Xcode中的Project Navigator皮膚。
-
在下圖所顯示的Add to targets對話方塊中,�不選中任何一個target。這確保了Xcode不會在編譯時連線動態庫檔案。可選步驟:選中Copy items if needed,將會把 libReveal.dylib 複製到工程中。如果你這樣做了,那麼當更新Reveal至新版本時,也依照上述步驟更新該檔案。
-
點選Finish。
在Copy Bundle Resources配置區域中,加入libReveal.dylib。
在Link Binary With Libraries配置項中:
如果已有libReveal.dylib,請將其移除,在編譯時不應該連結dylib檔案。
如果下列系統框架與庫檔案還不存在,請將他們加入:
libz.tdb
CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework
說明:如果Xcode使用自動連結�幫助你自動新增了這些框架,那麼就不需要手動新增了。
-
為了能在debugger之外,將庫檔案動態地載入裝置上的應用,您需要在構建過程中加入對libReveal.dylib檔案的code sign。
進入target的Build Phases標籤頁,選擇Editor Add Build Phase Add Run Script選單。在Run Script階段中加入以下內容:
set -e if [ -n "${CODE_SIGN_IDENTITY}" ]; then codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib" fi
-
將下面的程式碼加入到專案中合適的類檔案中(例如將其放到UIApplicationDelegate中),適當修改使之滿足您的需要:
Swift:
// MARK: - Reveal func loadReveal() { if NSClassFromString("IBARevealLoader") == nil { let revealLibName = "libReveal" // or "libReveal-tvOS" for tvOS targets let revealLibExtension = "dylib" var error: String? if let dylibPath = NSBundle.mainBundle().pathForResource(revealLibName, ofType: revealLibExtension) { print("Loading dynamic library (dylibPath)") let revealLib = dlopen(dylibPath, RTLD_NOW) if revealLib == nil { error = String(UTF8String: dlerror()) } } else { error = "File not found." } if error != nil { let alert = UIAlertController(title: "Reveal library could not be loaded", message: "(revealLibName).(revealLibExtension) failed to load with error: (error!)", preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) UIApplication.sharedApplication().windows.first?.rootViewController?.presentViewController(alert, animated: true, completion: nil) } } }
Objective-C:
#pragma mark - Reveal - (void)loadReveal { if (NSClassFromString(@"IBARevealLoader") == nil) { NSString *revealLibName = @"libReveal"; // or @"libReveal-tvOS" for tvOS targets NSString *revealLibExtension = @"dylib"; NSString *error; NSString *dyLibPath = [[NSBundle mainBundle] pathForResource:revealLibName ofType:revealLibExtension]; if (dyLibPath != nil) { NSLog(@"Loading dynamic library: %@", dyLibPath); void *revealLib = dlopen([dyLibPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW); if (revealLib == NULL) { error = [NSString stringWithUTF8String:dlerror()]; } } else { error = @"File not found."; } if (error != nil) { NSString *message = [NSString stringWithFormat:@"%@.%@ failed to load with error: %@", revealLibName, revealLibExtension, error]; UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Reveal library could not be loaded" message:message preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]]; [[[[[UIApplication sharedApplication] windows] firstObject] rootViewController] presentViewController:alert animated:YES completion:nil]; } } }
警告: 不要在釋出構建中呼叫此方法,確保僅是在應用的除錯過程中載入libReveal.dylib。
可以在UIApplicationDelegate的applicationDidBecomeActive:方法中呼叫上面的loadReveal方法,以確保Reveal庫儘早地被載入進來。
Swift:
func applicationDidBecomeActive:(application: UIApplication) { self.loadReveal() }
**Objective-C:**```Objective-C (void)applicationDidBecomeActive:(UIApplication *)application { [self loadReveal]; } ```
提示: 上面這樣做的好處是會讓Reveal服務在應用啟動的同時也自動啟動。
如果您不希望如上述步驟自動啟動Reveal服務,也可以以手動的方式來啟動,例如透過一個Debug按鈕。在應用啟動後,自己呼叫loadReveal方法,然後再分發一個名為IBARevealRequestStart的NSNotification: **Swift:** ``` func startReveal() { NSNotificationCenter.defaultCenter().postNotificationName("IBARevealRequestStart", object: nil) } ``` **Objective-C:** ``` - (void)startReveal { [[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil]; } ```
-
在Xcode中構建並執行您的應用。如果一切正常執行,請切換到Reveal應用,此時您的應用應會出現在應用選擇器的下拉選單當中。選中您的應用,確認可以看到此時正在模擬器(或裝置)中執行的應用介面截圖。
CocoaPods
CocoaPods是一款針對iOS與OS X專案的依賴管理系統,它大大簡化了以往Xcode工程裡對第三方庫的依賴管理與配置工作。
CocoaPods提供了Podspec用於將Reveal整合入您的專案。
提示: 不要將連線了Reveal庫檔案的應用用於正式釋出。下面的指南描述了一種使用構建配置來使Reveal靜態庫檔案僅在除錯構建中連線的方式。
說明:此說明要求您在之前已經在專案中配置好了CocoaPods,如果對Cocoapods不瞭解,可以參考我的。
-
將下面內容加入你的Podfile中:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']
在專案的根目錄下執行
pod install
命令(如果之前已經在專案中使用了CocoaPods,請執行pod update
命令)。
從您的Xcode專案中移除Reveal
根據您實際所選擇的Reveal整合方式,請根據下述相關步驟來移除Reveal。一旦庫檔案成功的移除後,下面的內容將不再會在您的應用啟動時出現在Xcode控制檯。
INFO: Reveal Server started (Protocol Version X).
靜態連線
開啟您的Xcode工程。
從 Project Navigator 中刪除 Reveal.framework 的引用。
在Xcode的 Project Navigator中選中您的工程,對於每一個整合了Reveal得target,請選擇 Build Settings 標籤頁,將下面內容從 Debug 配置中的 Other Linked Flags 設定中移除:
-framework Reveal
-ObjC and -lz (刪除前請確認此配置內容僅是用於Reveal)。
執行應用,確認Reveal沒有和應用連線上。
動態連線
開啟您的Xcode工程。
從 Project Navigator 中刪除 libReveal.dylib 的引用。
在Xcode的 Project Navigator中選中您的工程,對於每一個整合了Reveal得target,選擇 Build Phases 標籤頁,如果下列庫檔案僅供Reveal使用的話,請將它們從 Link Binary With Libraries 配置中移除:
libz.dylib
CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework
將自定義的codesign內容從 Build Phases 下的 Run Script 中刪除。
將 loadReveal / startReveal
方法從您的程式碼中刪除。
執行應用,確認Reveal沒有和應用連線上。
CocoaPods
-
在您的Podfile檔案中刪除下面這行內容:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']
在專案的根目錄下執行
pod update
命令。如果您的Podfile中只有Reveal-iOS-SDK一個pod依賴,請根據此說明,將CocoaPods從專案中完全移除。
執行應用,確認Reveal沒有和應用連線上。
顯示效果
上圖是Reveal的執行介面,其介面主要分成3部分:
左邊部分是整個介面的層級關係,在這裡可以以樹形級層的方式來檢視整個介面元素。
中間部分是一個視覺化的檢視區域,使用者可以在這裡切換2D或3D的檢視方式,這裡看到的也是程式執行的實時介面。
右邊部邊是控制元件的詳細引數檢視區域,當我們選中某一個具體的控制元件時,右邊就可以顯示出該控制元件的具體的引數列表。我們除了可以檢視這些引數值是否正確外,還可以嘗試修改這些值。所有的修改都可以實時反應到中間的實時預覽區域。
重要提示
不要將連線了Reveal庫檔案的應用正式釋出。 Reveal的檢視機制,會將您應用的許多內部資訊暴露出來,而這將很可能導致您的應用被Apple審查團隊拒絕釋出。Reveal的目的僅用於內部開發與應用除錯。
當iOS應用進入後臺後,Reveal服務將會自動停止。 當應用重新開啟時,它又會自動啟動。
Reveal支援基於iOS 7及更新版本而編譯的應用。 構建配置中的iOS Deployment Target也必須是'iOS 7.0'或更新版本。 如果iOS版本太舊,您有可能會在構建應用過程中遇到連線錯誤。
Reveal使用Bonjour協議來連線執行時的iOS應用。 如果您的iOS應用是執行在真實的裝置之上,那麼此裝置也需要處在同一個網路之內,以便電腦上的Reveal應用能夠與之連線。如果您在連線應用時仍遇到問題,請先檢查防火牆和代理設定,以確保它們沒有阻礙通訊。
用Reveal除錯其它應用介面
如果你的裝置越獄了,那麼還可以用Reveal來"除錯"其它應用介面,什麼時候會有這種奇怪的需求呢?當我們想學習別人是如何實現介面效果的時候,這一點對一個開發者來說會比較誘人。
裝置的/Library/MobileSubstrate/DynamicLibraries 下存放著所有在系統啟動時就需要載入的動態連結庫,所以我們只需要將Reveal的動態連結庫上傳到該目錄即可。
對於越獄的裝置,我們可以在安裝OpenSSH之後,用scp來上傳該檔案。具體步驟如下:
將libReveal.dylib 上傳到 /Library/MobileSubstrate/DynamicLibraries
如果libReveal.dylib沒有執行許可權,用
chmod +x libReveal.dylib
命令,給其增加執行許可權執行
killall SpringBoard
重啟桌面
致謝
以上內容根據千鋒教育成都校區林天祥老師提供的資料整理而成,在此表示感謝。
作者:jackfrued
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4662/viewspace-2802181/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS開發除錯神器:Reveal 24 for maciOS除錯Mac
- 頁面除錯神器Reveal的簡單使用除錯
- Xcode 上使用Reveal除錯介面XCode除錯
- ios 利用Reveal來除錯介面2--真機除錯(步驟詳解)iOS除錯
- iOS比優雞除錯技巧篇(一):reveal檢視除錯iOS除錯
- vue 程式碼除錯神器Vue除錯
- eruda手機端除錯神器除錯
- 核心除錯神器SystemTap 轉摘除錯
- Postman介面除錯Postman除錯
- Xcode 11 Reveal 報錯XCode
- FaceBook出品 -- Android除錯神器StethoAndroid除錯
- 如何使用神器Stetho除錯Volley除錯
- reveal.js - 程式設計師的PPT製作神器JS程式設計師
- browser-sync前端開發除錯神器前端除錯
- Weex除錯神器——WeexDevtools使用手冊除錯dev
- 139.API(除錯介面--開啟/關閉除錯)API除錯
- Vue除錯神器vue-devtools安裝Vue除錯dev
- 你必須擁有的Python除錯神器Python除錯
- Eruda 一個被人遺忘的除錯神器除錯
- OpenMLDB SQL 開發除錯神器 - OpenMLDB SQL EmulatorSQL除錯
- 推薦:IE6 前端除錯神器 SPOON!前端除錯
- this問題 以及 webstorm 除錯介面WebORM除錯
- Android除錯神器stetho使用詳解和改造Android除錯
- Arthas線上java程式診斷工具 線上除錯神器Java除錯
- Postman除錯技巧之介面簽名Postman除錯
- 小技巧|移動端網頁除錯神器Eruda使用技巧網頁除錯
- 使用 postman 除錯 jwt 開發的介面Postman除錯JWT
- stm32 SWD除錯介面的使用除錯
- Android抓包 Charles http介面除錯AndroidHTTP除錯
- STM32除錯介面SWD連線除錯
- Reveal安裝
- iOS 測試工具reveal視覺化除錯工具的使用iOS視覺化除錯
- H5移動端除錯神器 - vconsole.jsH5除錯JS
- 介面管理效率神器ApifoxAPI
- 如何技術對接接入AG介面API產品(AG介面除錯)API除錯
- 除錯篇——除錯物件與除錯事件除錯物件事件
- postman使用 Android java後端 介面除錯工具PostmanAndroidJava後端除錯
- [原創]「神器」不容錯過!逆向除錯好幫手:神運算元偏移計算工具除錯