Reveal的三种安装方法

作者: 上帝也是码农 | 来源:发表于2016-07-26 21:33 被阅读282次

    安装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然后验证看一下是否可以看到和你的模拟器一样的画面。

    相关文章

      网友评论

      • leftwater:请问我按照第二种方式设置 reveal 可以连接,但是模拟器页面和reveal不同步,需要手动点击链接刷新,这个是有哪里没设置好吗
        上帝也是码农:@leftwater 你修改Reveal的UI,模拟器是实时更新的,但是你修改模拟器的UI,你要刷新一下Reveal的才能看到。

      本文标题:Reveal的三种安装方法

      本文链接:https://www.haomeiwen.com/subject/yvtojttx.html