iOS开发笔记 - 界面调试神器Reveal
http://blog.csdn.net/jackfrued/article/details/50934092
Reveal是iOS開發工具中的神器之一,它能夠在應用程序運行過程中調試應用程序界面。 通過Reveal我們可以連接到應用程序,并允許開發者編輯各種用戶界面參數,結果會馬上在用戶界面上呈現。就像Web開發人員用瀏覽器提供的開發人員工具調試頁面一樣,Reveal允許開發者在不修改代碼、不重新構建項目、不重新部署應用程序的情況下就能夠調試iOS應用的用戶界面。
安裝Reveal
Reveal 下載地址:http://revealapp.com/download/
集成指南
集成Reveal無需添加任何代碼,無需引入任何頭文件。庫將會在應用啟動時自動加載,并在您的應用內部啟動必要的Reveal服務。
三種集成方式
靜態連接
將Reveal的靜態庫文件連接入應用,是最簡單快捷地啟用Reveal檢視的方式。
警告: 不要將Reveal庫文件隨著正式應用一起發布。 下面的步驟將會展示如何通過構建配置,而把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至新版本時,也依照上述步驟再次更新此庫文件。
點擊Finish。
選擇Build Settings標簽,在Other Linker Flags的Debug配置項中加入如下配置。
-ObjC -lz -framework Reveal如果您使用的是Xcode 7, 請確認 Reveal.framework 所在的目錄在您的工程配置項 “Framework Search Paths” 中。具體的內容看起來會像這樣。
FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries"在Xcode中,構建并運行您的應用。如果應用運行于真實設備之上,請確保此設備與正在運行Reveal的Mac機器,處于同一Wi-Fi網絡中。
如果一切正常運行,請切換到Reveal應用,此時您的應用應會出現在應用選擇器的下拉列表當中。選中您的應用,確認可以看到此時正在模擬器(或設備)中運行的應用界面截圖。
動態加載
動態加載允許iOS應用在運行時,可以按需地加載第三方庫。采用這種方式,庫文件無需連接入應用的可執行文件,而是被加入到了應用Bundle中去,從而在運行時能按需加載。這種方式使得開發者可以在個人應用中,完全自由地控制Reveal庫的加載,以及其服務的啟動與停止。
將Reveal加入您的Xcode工程,使得您團隊中的其他成員無需任何額外的配置,就可以使用Reveal。
警告: 永遠不要將包含Reveal動態庫文件的應用正式發布。Apple不允許將含有動態加載庫文件的iOS應用發布到Apple商店中。
在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 -eif [ -n "${CODE_SIGN_IDENTITY}" ]; then codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib" fi將下面的代碼加入到項目中合適的類文件中(例如您的UIApplicationDelegate),適當修改使之滿足您的需要:
Swift:
// MARK: - Revealfunc 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]; } } }警告: 不要在發布(release)構建中調用此方法,確保僅是在應用的調試(debug)構建中加載libReveal.dylib。
一個簡單的集成方式是,在-[UIApplicationDelegate applicationDidBecomeActive:]方法中調用上面聲明的- (void)loadReveal方法,以確保Reveal庫盡早地被加載進來。?
Swift:
Objective-C:
(void)applicationDidBecomeActive:(UIApplication *)application { [self loadReveal]; }提示: 在-[UIApplicationDelegate applicationDidBecomeActive:]方法返回之前加載庫的一個好處是,將會讓Reveal服務在應用啟動的同時也自動啟動。
如果您不希望如上述步驟自動啟動Reveal服務,也可以以手動的方式來啟動,例如通過一個Debug按鈕。在應用啟動后,自己調用loadReveal方法,然后再分發一個名為IBARevealRequestStart的NSNotification:?
Swift:
Objective-C:
- (void)startReveal {[[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil]; }在Xcode中,構建并運行您的應用。如果一切正常運行,請切換到Reveal應用,此時您的應用應會出現在應用選擇器的下拉列表當中。選中您的應用,確認可以看到此時正在模擬器(或設備)中運行的應用界面截圖。
CocoaPods
CocoaPods 是一款針對iOS與OSX項目的依賴管理系統。它大大簡化了以往Xcode工程里,對第三方庫的依賴管理與配置工作。
CocoaPods提供了Podspec用于將Reveal集成入您的項目。
警告: 不要將連接了Reveal庫文件的應用用于正式發布。下面的指南描述了一種使用構建配置來使Reveal靜態庫文件僅在調試構建中連接的方式。
此說明要求您在之前已經在項目中配置好了CocoaPods,若不然,請先行配置Cocoapods。
將下面內容加入你的Podfile中:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']從您的Xcode項目中移除Reveal
根據您實際所選擇的Reveal集成方式,請根據下述相關步驟來移除Reveal。
一旦庫文件成功的移除后,下面的內容將不再會在您的應用啟動時出現在Xcode控制臺:
INFO: Reveal Server started (Protocol Version X).
靜態連接
- -framework Reveal
- -ObjC and -lz (刪除前請確認此配置內容僅是用于Reveal)。
動態連接
- libz.dylib
- CFNetwork.framework
- QuartzCore.framework
- CoreGraphics.framework
CocoaPods
在您的Podfile文件中刪除下面這行內容:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']在項目的根目錄下執行 pod update 命令。
如果您的 Podfile 中只有 Reveal-iOS-SDK 一個pod依賴,請根據此說明,將CocoaPods從項目中完全移除。
搞定 - 運行應用,確認Reveal沒有和應用連接上。
顯示效果
上圖是Reveal的運行界面,其界面主要分成3部分:
-
左邊部分是整個界面的層級關系,在這里可以以樹形級層的方式來查看整個界面元素。
-
中間部分是一個可視化的查看區域,用戶可以在這里切換2D或3D的查看方式,這里看到的也是程序運行的實時界面。
-
右邊部邊是控件的詳細參數查看區域,當我們選中某一個具體的控件時,右邊就可以顯示出該控件的具體的參數列表。我們除了可以查看這些參數值是否正確外,還可以嘗試修改這些值。所有的修改都可以實時反應到中間的實時預覽區域。
重要提示
用Reveal調試其它應用界面
如果你的設備越獄了,那么還可以用Reveal來”調試“其它應用界面,什么時候會有這種奇怪的需求呢?——當我們想學習別人是如何實現界面效果的時候。iOS設備的目錄/Library/MobileSubstrate/DynamicLibraries?下存放著所有在系統啟動時就需要加載的動態鏈接庫,所以我們只需要將Reveal的動態鏈接庫上傳到該目錄即可。
對于越獄的設備,我們可以在安裝OpenSSH之后,用scp來上傳該文件。具體步驟如下:
將libReveal.dylib 上傳到 /Library/MobileSubstrate/DynamicLibraries?
如果libReveal.dylib沒有執行權限,用chmod +x libReveal.dylib命令,給其增加執行權限?
執行 killall SpringBoard 重啟桌面
轉載于:https://www.cnblogs.com/SimonGao/p/6084377.html
總結
以上是生活随笔為你收集整理的iOS开发笔记 - 界面调试神器Reveal的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张小龙宣布微信小程序可直接从桌面进入
- 下一篇: coroSync packmarker