Reveal的三種安裝方法

安裝Reveal的三種方式

一、靜態鏈接(最簡單快捷地啟用Reveal檢視的方式)

警告: 不要將Reveal庫文件隨著正式應用一起發布。 下面的步驟將會展示如何通過構建配置,而把Reveal靜態庫文件,僅連接到調試構建的流程中。
1、啟動Reveal并選擇Help → Show Reveal Library in Finder,這將會打開Finder窗口,并顯示一個名為iOS-Libraries的文件夾。Show Reveal Library in Finder(圖1)
將 Reveal.framework 文件(圖2)拖入你的項目中。
圖1

屏幕快照 2016-07-26 下午8.56.19.png

圖2
屏幕快照 2016-07-26 下午8.56.28.png

2、在下圖所顯示的Add to targets對話框中,選擇所有您希望與Reveal集成的target。可選步驟:選中Copy items if needed,將會把 Reveal.framework 拷貝到工程中——如果您這么做了, 請記住,當更新Reveal至新版本時,也依照上述步驟再次更新此庫文件

屏幕快照 2016-07-26 下午8.59.21.png

3、在Xcode的Project Navigator中,選中您的工程,然后將以下步驟應用于所有您希望與Reveal集成的target之上:

1)選擇Build Phases標簽,如果在Link Binary With Libraries配置項中已有Reveal.framework,請將其移除。

屏幕快照 2016-07-26 下午9.01.46.png

2)選擇Build Settings標簽,在Other Linker FlagsDebug配置項中加入如下配置:
-ObjC -lz -framework Reveal

屏幕快照 2016-07-26 下午9.03.09.png

4、如果一切正常運行,請切換到Reveal應用,此時您的應用應會出現在應用選擇器的下拉列表當中。選中您的應用,確認可以看到此時正在模擬器(或設備)中運行的應用界面截圖。


屏幕快照 2016-07-26 下午9.04.21.png

成功鏈接項目:


屏幕快照 2016-07-26 下午9.04.30.png

TIP:再次運行您的應用,這一次,請選擇基于**Release**的scheme。請確認此時,Reveal不再能連接上您的應用。如果應用仍然與Reveal保持連接,請確認 Reveal.framework 沒有出現在**Build Phases**標簽的**Link Binary With Libraries**配置項中

二、動態鏈接不添加庫(推薦使用)

1、將Reveal加入您的Xcode工程
2、集成Reveal:不修改您的Xcode工程并加載Reveal(僅能運行在模擬器)
此方法的好處:通過不修改Xcode工程文件來加載Reveal的方式,您可以檢視任何一個您正在開發的iOS應用,而不需要對這些應用的工程做任何修改。另一個好處就是,您不需要再擔心,犯下一不小心將Reveal庫連接到應用中發布了的錯誤。
1)打開您的iOS工程,選擇 View → Navigators → Show Breakpoint Navigator。

2)在面板左下角,點擊 + 按鈕并選擇Add Symbolic Breakpoint

屏幕快照 2016-07-26 下午9.14.26.png

3)在 Symbol 輸入區內輸入 UIApplicationMain(不可有空格)
4)點擊 Add Action 按鈕, 確認 Action 被設置為 Debugger Command
5)將以下內容拷貝到 Action 的輸入區內:
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0)
注意: 請確認Reveal.app的路徑信息符合您Mac的實際位置。位置不正確不能正常使用Reveal。
6)選中 Automatically continue after evaluating actions 選項

屏幕快照 2016-07-26 下午9.14.38.png

7)右擊剛才新創建的斷點,選擇 Move Breakpoint To → User

屏幕快照 2016-07-26 下午9.14.50.png

您可以像其他斷點一樣,禁用或啟用此斷點。用戶級別斷點在所有的Xcode工程中都可以使用
8)在iOS模擬器上構建并運行您的應用
如果一切正常運行,請切換到Reveal應用,此時您的應用應會出現在應用選擇器的下拉列表當中。選中您的應用,確認可以看到此時正在模擬器中運行的應用界面截圖。

三、動態鏈接添加庫

添加Reveal到你的Xcode項目允許你團隊中所有的成員不用再配置Reveal就可以使用Reveal。
Warning:永遠不要在你的發布版本中集成Reveal動態庫。Apple不允許通過在APP store下載的APP含有動態庫。
1、代開你Xcode中的iOS或者tvOS項目
2、打開Reveal點擊導航欄的Help->Show Reveal Library in Finder選項選擇iOS Library或者tvOS Library。這回打開一個帶有相應的framework的文件管理窗口。
3、將libReveal.dylib(or libReveal-tvOS.dylib for tvOS apps)拖進你的Xcode項目中。
4、在拖入Xcode Library的對話框中,選擇所有的targets。這樣會確保Xcode在編譯的時候不會鏈接動態庫。選項Copy items if needed是可選的,如果你選擇了這一項你需要注意當Reveal更新的時候你要更新這個library。

屏幕快照 2016-07-26 下午8.59.21.png

5、點擊finish
6、在Xcode的導航欄中,選擇你想使用Reveal的target

  • 選擇Copy Bundle Resource這一項,添加libReveal.dylib(or libReveal-tvOS.dylib for tvOS apps)
  • 需要在Link Binary with Libraries做的:
    1)移除libReveal.dylib和libReveal-tvOS.dylib如果它們存在的話,
    ![Uploading 屏幕快照 2016-07-26 下午9.29.14_861591.png . . .]dylib不應該在編譯的時候被鏈接
    2)添加如下的系統框架和庫如果它們不存在的話libz.tbd, CFNetwork.framework, QuartzCore.framework, 和 CoreGraphics.framework

屏幕快照 2016-07-26 下午9.29.14.png

7、為了當一個應用運行在模擬器時動態加載這些庫,你需要在libReveal.dylib添加一些代碼當在程序構建的過程中。
在你的targetBulid Phases這一項選擇Editor->Add Bulid Phase ->Add Run Script,編輯運行腳本:

屏幕快照 2016-07-26 下午9.32.05.png

iOS targets:

set -e

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

tvOS targets:

set -e

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

8.在你的項目中尋找一個合適的類添加下面的代碼(eg: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:

#import <dlfcn.h>

#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];
        }
    }
}

WARING:你應該確保在你的發布版本中不調用這個方法。你要確保僅在調試版本加載libReveal.dylib這個庫。

9、你可以 -[UIApplicationDelegate applicationDidBecomeActive:] 方法中調用如下方法來確認這個庫以被正確的加載。

Swift:

func applicationDidBecomeActive:(application: UIApplication) {
    self.loadReveal()
}

Objective-C:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self loadReveal];
}

NOTE:在-[UIApplicationDelegate applicationDidBecomeActive:返回值之前加載該庫,Reveal 服務將會自動開始啟動。
10、如果你不想自動啟動Reveal服務在上一步,你想通過調試按鈕或者其他的類似按鈕。你只需要在app已經啟動的時候調用loadReveal這個方法,然后系統會發出一個IBARevealRequestStart的通知:
Swift:

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

Objective-C:

- (void)startReveal
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
}

11、在Xcode中構建并運行你的項目,如果一切順利,你應該可以切換你的iOS項目在Reveal的下拉列表中。選擇你的app然后驗證看一下是否可以看到和你的模擬器一樣的畫面。

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

推薦閱讀更多精彩內容