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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容