日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS开发笔记 - 界面调试神器Reveal

發(fā)布時(shí)間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS开发笔记 - 界面调试神器Reveal 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://blog.csdn.net/jackfrued/article/details/50934092

Reveal是iOS開發(fā)工具中的神器之一,它能夠在應(yīng)用程序運(yùn)行過程中調(diào)試應(yīng)用程序界面。 通過Reveal我們可以連接到應(yīng)用程序,并允許開發(fā)者編輯各種用戶界面參數(shù),結(jié)果會(huì)馬上在用戶界面上呈現(xiàn)。就像Web開發(fā)人員用瀏覽器提供的開發(fā)人員工具調(diào)試頁面一樣,Reveal允許開發(fā)者在不修改代碼、不重新構(gòu)建項(xiàng)目、不重新部署應(yīng)用程序的情況下就能夠調(diào)試iOS應(yīng)用的用戶界面。

安裝Reveal

Reveal 下載地址:http://revealapp.com/download/

集成指南

集成Reveal無需添加任何代碼,無需引入任何頭文件。庫(kù)將會(huì)在應(yīng)用啟動(dòng)時(shí)自動(dòng)加載,并在您的應(yīng)用內(nèi)部啟動(dòng)必要的Reveal服務(wù)。

三種集成方式

靜態(tài)連接

將Reveal的靜態(tài)庫(kù)文件連接入應(yīng)用,是最簡(jiǎn)單快捷地啟用Reveal檢視的方式。

警告: 不要將Reveal庫(kù)文件隨著正式應(yīng)用一起發(fā)布。 下面的步驟將會(huì)展示如何通過構(gòu)建配置,而把Reveal靜態(tài)庫(kù)文件,僅連接到調(diào)試構(gòu)建的流程中。

  • 在Xcode中打開您的iOS工程。

  • 啟動(dòng)Reveal并選擇Help → Show Reveal Library in Finder,這將會(huì)打開Finder窗口,并顯示一個(gè)名為iOS-Libraries的文件夾。

  • 將?Reveal.framework?文件拖入Xcode中的Project Navigator面板。

  • 在下圖所顯示的Add to targets對(duì)話框中,選擇所有您希望與Reveal集成的target??蛇x步驟:選中Copy items if needed,將會(huì)把?Reveal.framework?拷貝到工程中——如果您這么做了, 請(qǐng)記住,當(dāng)更新Reveal至新版本時(shí),也依照上述步驟再次更新此庫(kù)文件。

  • 點(diǎn)擊Finish。

  • 選擇Build Settings標(biāo)簽,在Other Linker Flags的Debug配置項(xiàng)中加入如下配置。

    -ObjC -lz -framework Reveal
  • 如果您使用的是Xcode 7, 請(qǐng)確認(rèn) Reveal.framework 所在的目錄在您的工程配置項(xiàng) “Framework Search Paths” 中。具體的內(nèi)容看起來會(huì)像這樣。

    FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries"
  • 在Xcode中,構(gòu)建并運(yùn)行您的應(yīng)用。如果應(yīng)用運(yùn)行于真實(shí)設(shè)備之上,請(qǐng)確保此設(shè)備與正在運(yùn)行Reveal的Mac機(jī)器,處于同一Wi-Fi網(wǎng)絡(luò)中。

    如果一切正常運(yùn)行,請(qǐng)切換到Reveal應(yīng)用,此時(shí)您的應(yīng)用應(yīng)會(huì)出現(xiàn)在應(yīng)用選擇器的下拉列表當(dāng)中。選中您的應(yīng)用,確認(rèn)可以看到此時(shí)正在模擬器(或設(shè)備)中運(yùn)行的應(yīng)用界面截圖。

  • 動(dòng)態(tài)加載

    動(dòng)態(tài)加載允許iOS應(yīng)用在運(yùn)行時(shí),可以按需地加載第三方庫(kù)。采用這種方式,庫(kù)文件無需連接入應(yīng)用的可執(zhí)行文件,而是被加入到了應(yīng)用Bundle中去,從而在運(yùn)行時(shí)能按需加載。這種方式使得開發(fā)者可以在個(gè)人應(yīng)用中,完全自由地控制Reveal庫(kù)的加載,以及其服務(wù)的啟動(dòng)與停止。

    將Reveal加入您的Xcode工程,使得您團(tuán)隊(duì)中的其他成員無需任何額外的配置,就可以使用Reveal。

    警告: 永遠(yuǎn)不要將包含Reveal動(dòng)態(tài)庫(kù)文件的應(yīng)用正式發(fā)布。Apple不允許將含有動(dòng)態(tài)加載庫(kù)文件的iOS應(yīng)用發(fā)布到Apple商店中。

  • 在Xcode中打開您的iOS工程。

  • 啟動(dòng)Reveal并選擇Help → Show Reveal Library in Finder,這將會(huì)打開Finder窗口,并顯示一個(gè)名為iOS-Libraries的文件夾。

  • 將?libReveal.dylib?文件拖入Xcode中的Project Navigator面板。

  • 在下圖所顯示的Add to targets對(duì)話框中,反選所有的target。這確保了Xcode不會(huì)在編譯時(shí)連接動(dòng)態(tài)庫(kù)文件??蛇x步驟:選中Copy items if needed,將會(huì)把?libReveal.dylib?拷貝到工程中——如果您這么做了, 請(qǐng)記住,當(dāng)更新Reveal至新版本時(shí),也依照上述步驟再次更新此庫(kù)文件。

  • 點(diǎn)擊Finish。

  • Copy Bundle Resources配置區(qū)域中,加入libReveal.dylib

  • Link Binary With Libraries配置項(xiàng)中:

    • ?如果已有l(wèi)ibReveal.dylib,請(qǐng)將其移除——不應(yīng)在編譯時(shí)連接dylib文件。
    • 如果下列系統(tǒng)框架與庫(kù)文件還不存在,請(qǐng)將他們加入:?
      • libz.tdb
      • CFNetwork.framework
      • QuartzCore.framework
      • CoreGraphics.framework - Xcode一般默認(rèn)會(huì)在工程中包含此框架文件。
  • 為了能在debugger之外,將庫(kù)文件動(dòng)態(tài)地載入設(shè)備上的應(yīng)用,您需要在構(gòu)建過程中加入對(duì)libReveal.dylib文件的code sign。

    進(jìn)入target的Build Phases標(biāo)簽頁,選擇Editor → Add Build Phase → Add Run Script菜單。在Run Script階段中加入以下內(nèi)容:

    set -eif [ -n "${CODE_SIGN_IDENTITY}" ]; then codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib" fi

  • 將下面的代碼加入到項(xiàng)目中合適的類文件中(例如您的UIApplicationDelegate),適當(dāng)修改使之滿足您的需要:

    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]; } } }
  • 警告: 不要在發(fā)布(release)構(gòu)建中調(diào)用此方法,確保僅是在應(yīng)用的調(diào)試(debug)構(gòu)建中加載libReveal.dylib。

  • 一個(gè)簡(jiǎn)單的集成方式是,在-[UIApplicationDelegate applicationDidBecomeActive:]方法中調(diào)用上面聲明的- (void)loadReveal方法,以確保Reveal庫(kù)盡早地被加載進(jìn)來。?
    Swift:

    1. func applicationDidBecomeActive:(application: UIApplication) {self.loadReveal() }
  • Objective-C:

    (void)applicationDidBecomeActive:(UIApplication *)application { [self loadReveal]; }
  • 提示: 在-[UIApplicationDelegate applicationDidBecomeActive:]方法返回之前加載庫(kù)的一個(gè)好處是,將會(huì)讓Reveal服務(wù)在應(yīng)用啟動(dòng)的同時(shí)也自動(dòng)啟動(dòng)。

    如果您不希望如上述步驟自動(dòng)啟動(dòng)Reveal服務(wù),也可以以手動(dòng)的方式來啟動(dòng),例如通過一個(gè)Debug按鈕。在應(yīng)用啟動(dòng)后,自己調(diào)用loadReveal方法,然后再分發(fā)一個(gè)名為IBARevealRequestStart的NSNotification:?
    Swift:

    func startReveal() {NSNotificationCenter.defaultCenter().postNotificationName("IBARevealRequestStart", object: nil) }
  • Objective-C:

    - (void)startReveal {[[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil]; }
  • 在Xcode中,構(gòu)建并運(yùn)行您的應(yīng)用。如果一切正常運(yùn)行,請(qǐng)切換到Reveal應(yīng)用,此時(shí)您的應(yīng)用應(yīng)會(huì)出現(xiàn)在應(yīng)用選擇器的下拉列表當(dāng)中。選中您的應(yīng)用,確認(rèn)可以看到此時(shí)正在模擬器(或設(shè)備)中運(yùn)行的應(yīng)用界面截圖。

  • CocoaPods

    CocoaPods 是一款針對(duì)iOS與OSX項(xiàng)目的依賴管理系統(tǒng)。它大大簡(jiǎn)化了以往Xcode工程里,對(duì)第三方庫(kù)的依賴管理與配置工作。

    CocoaPods提供了Podspec用于將Reveal集成入您的項(xiàng)目。

    警告: 不要將連接了Reveal庫(kù)文件的應(yīng)用用于正式發(fā)布。下面的指南描述了一種使用構(gòu)建配置來使Reveal靜態(tài)庫(kù)文件僅在調(diào)試構(gòu)建中連接的方式。

    此說明要求您在之前已經(jīng)在項(xiàng)目中配置好了CocoaPods,若不然,請(qǐng)先行配置Cocoapods。

  • 將下面內(nèi)容加入你的Podfile中:

    pod 'Reveal-iOS-SDK', :configurations => ['Debug']
  • 在項(xiàng)目的根目錄下執(zhí)行?pod install?命令(如果之前已經(jīng)在項(xiàng)目中使用了Cocoapods,請(qǐng)執(zhí)行?pod update?命令)。
  • 從您的Xcode項(xiàng)目中移除Reveal

    根據(jù)您實(shí)際所選擇的Reveal集成方式,請(qǐng)根據(jù)下述相關(guān)步驟來移除Reveal。

    一旦庫(kù)文件成功的移除后,下面的內(nèi)容將不再會(huì)在您的應(yīng)用啟動(dòng)時(shí)出現(xiàn)在Xcode控制臺(tái):

    INFO: Reveal Server started (Protocol Version X).

    靜態(tài)連接

  • 打開您的Xcode工程。
  • 從?Project Navigator?中刪除 Reveal.framework?的引用。
  • 在Xcode的?Project Navigator中選中您的工程,對(duì)于每一個(gè)集成了Reveal得target,請(qǐng)選擇?Build Settings?標(biāo)簽頁,將下面內(nèi)容從 Debug 配置中的 Other?Linked Flags?設(shè)置中移除:?
    • -framework Reveal
    • -ObjC and -lz (刪除前請(qǐng)確認(rèn)此配置內(nèi)容僅是用于Reveal)。
  • 搞定 - 運(yùn)行應(yīng)用,確認(rèn)Reveal沒有和應(yīng)用連接上。
  • 動(dòng)態(tài)連接

  • 打開您的Xcode工程。
  • 從 Project Navigator 中刪除 libReveal.dylib?的引用。
  • 在Xcode的 Project Navigator中選中您的工程,對(duì)于每一個(gè)集成了Reveal得target,選擇 Build Phases 標(biāo)簽頁,如果下列庫(kù)文件僅供Reveal使用的話,請(qǐng)將它們從 Link Binary With Libraries 配置中移除:?
    • libz.dylib
    • CFNetwork.framework
    • QuartzCore.framework
    • CoreGraphics.framework
  • 將自定義的codesign內(nèi)容從 Build Phases 下的 Run Script 中刪除。
  • 將?loadReveal / startReveal?方法從您的代碼中刪除。
  • 搞定 - 運(yùn)行應(yīng)用,確認(rèn)Reveal沒有和應(yīng)用連接上。
  • CocoaPods

  • 在您的Podfile文件中刪除下面這行內(nèi)容:

    pod 'Reveal-iOS-SDK', :configurations => ['Debug']
  • 在項(xiàng)目的根目錄下執(zhí)行 pod update 命令。

  • 如果您的 Podfile 中只有 Reveal-iOS-SDK 一個(gè)pod依賴,請(qǐng)根據(jù)此說明,將CocoaPods從項(xiàng)目中完全移除。

  • 搞定 - 運(yùn)行應(yīng)用,確認(rèn)Reveal沒有和應(yīng)用連接上。

  • 顯示效果

    上圖是Reveal的運(yùn)行界面,其界面主要分成3部分:

    • 左邊部分是整個(gè)界面的層級(jí)關(guān)系,在這里可以以樹形級(jí)層的方式來查看整個(gè)界面元素。

    • 中間部分是一個(gè)可視化的查看區(qū)域,用戶可以在這里切換2D或3D的查看方式,這里看到的也是程序運(yùn)行的實(shí)時(shí)界面。

    • 右邊部邊是控件的詳細(xì)參數(shù)查看區(qū)域,當(dāng)我們選中某一個(gè)具體的控件時(shí),右邊就可以顯示出該控件的具體的參數(shù)列表。我們除了可以查看這些參數(shù)值是否正確外,還可以嘗試修改這些值。所有的修改都可以實(shí)時(shí)反應(yīng)到中間的實(shí)時(shí)預(yù)覽區(qū)域。

    重要提示

  • 不要將連接了Reveal庫(kù)文件的應(yīng)用正式發(fā)布。 Reveal的檢視機(jī)制,會(huì)將您應(yīng)用的許多內(nèi)部信息暴露出來,而這將很可能導(dǎo)致您的應(yīng)用被Apple審查團(tuán)隊(duì)拒絕發(fā)布。Reveal的目的僅用于內(nèi)部開發(fā)與應(yīng)用調(diào)試。
  • 當(dāng)iOS應(yīng)用進(jìn)入后臺(tái)后,Reveal服務(wù)將會(huì)自動(dòng)停止。 當(dāng)應(yīng)用重新打開時(shí),它又會(huì)自動(dòng)啟動(dòng)。
  • Reveal支持基于iOS 7及更新版本而編譯的應(yīng)用。 構(gòu)建配置中的iOS Deployment Target也必須是’iOS 7.0’或更新版本。 如果iOS版本太舊,您有可能會(huì)在構(gòu)建應(yīng)用過程中遇到連接錯(cuò)誤。
  • Reveal使用Bonjour協(xié)議來連接運(yùn)行時(shí)的iOS應(yīng)用。 如果您的iOS應(yīng)用是運(yùn)行在真實(shí)的設(shè)備之上,那么此設(shè)備也需要處在同一個(gè)網(wǎng)絡(luò)之內(nèi),以便電腦上的Reveal應(yīng)用能夠與之連接。如果您在連接應(yīng)用時(shí)仍遇到問題,請(qǐng)先檢查防火墻和代理設(shè)置,以確保它們沒有阻礙通訊。
  • 用Reveal調(diào)試其它應(yīng)用界面

    如果你的設(shè)備越獄了,那么還可以用Reveal來”調(diào)試“其它應(yīng)用界面,什么時(shí)候會(huì)有這種奇怪的需求呢?——當(dāng)我們想學(xué)習(xí)別人是如何實(shí)現(xiàn)界面效果的時(shí)候。iOS設(shè)備的目錄/Library/MobileSubstrate/DynamicLibraries?下存放著所有在系統(tǒng)啟動(dòng)時(shí)就需要加載的動(dòng)態(tài)鏈接庫(kù),所以我們只需要將Reveal的動(dòng)態(tài)鏈接庫(kù)上傳到該目錄即可。

    對(duì)于越獄的設(shè)備,我們可以在安裝OpenSSH之后,用scp來上傳該文件。具體步驟如下:

    將libReveal.dylib 上傳到 /Library/MobileSubstrate/DynamicLibraries?
    如果libReveal.dylib沒有執(zhí)行權(quán)限,用chmod +x libReveal.dylib命令,給其增加執(zhí)行權(quán)限?
    執(zhí)行 killall SpringBoard 重啟桌面

    轉(zhuǎn)載于:https://www.cnblogs.com/SimonGao/p/6084377.html

    總結(jié)

    以上是生活随笔為你收集整理的iOS开发笔记 - 界面调试神器Reveal的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。