集成Reveal到你的从Xcode工程中

集成Reveal:将Reveal加入您的Xcode工程

将Reveal加入您的Xcode工程,使得您团队中的其他成员无需任何额外的配置,就可以使用Reveal。

警告: 永远不要将包含Reveal动态库文件的应用正式发布。Apple不允许将含有动态加载库文件的iOS应用发布到Apple商店中。

  1. 在Xcode中打开您的iOS工程。
  2. 启动Reveal并选择__Help → Show Reveal Library in Finder__,这将会打开Finder窗口,并显示一个名为*iOS-Libraries*的文件夹。

  3. libReveal.dylib 文件拖入Xcode中的Project Navigator面板。
  4. 在下图所显示的__Add to targets__对话框中,__反选所有的target__。这确保了Xcode不会在编译时连接动态库文件。可选步骤:选中__Copy items if needed__,将会把 libReveal.dylib 拷贝到工程中——如果您这么做了, 请记住,当更新Reveal至新版本时,也依照上述步骤再次更新此库文件

  5. 点击**Finish**。
  6. 在Xcode的Project Navigator中,选中您的工程,然后将以下步骤应用在所有您希望适配Reveal的target之上:

    1. 在__Copy Bundle Resources__配置区域中,加入*libReveal.dylib*。
    2. 在**Link Binary With Libraries**配置项中:
      • 如果已有*libReveal.dylib*,请将其移除——不应在编译时连接dylib文件。
      • 如果下列系统框架与库文件还不存在,请将他们加入:
        • libz.dylib
        • CFNetwork.framework
        • QuartzCore.framework
        • CoreGraphics.framework - Xcode一般默认会在工程中包含此框架文件。
  7. 为了能在debugger之外,将库文件动态地载入设备上的应用,您需要在构建过程中加入对libReveal.dylib文件的code sign。

    进入target的__Build Phases__标签页,选择__Editor → Add Build Phase → Add Run Script__菜单。在Run Script阶段中加入以下内容:

    set -e
    
    if [ -n "${CODE_SIGN_IDENTITY}" ]; then
        codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib"
    fi
    
  8. 将下面的代码加入到项目中合适的类文件中(例如您的UIApplicationDelegate),适当修改使之满足您的需要:

    Swift:

    // MARK: - Reveal
    
    func loadReveal() {
        if NSClassFromString("IBARevealLoader") == nil {
            let revealLibName = "libReveal"
            let revealLibExtension = "dylib"
            var error: String?
    
            if let dylibPath = NSBundle.mainBundle().pathForResource(revealLibName, ofType: revealLibExtension) {
                println("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 {
                UIAlertView(title: "Reveal library could not be loaded",
                          message: "\(revealLibName).\(revealLibExtension) failed to load with error: \(error!)",
                         delegate: nil,
                cancelButtonTitle: "OK").show()
            }
        }
    }
    

    Objective-C:

    #pragma mark - Reveal
    #import <dlfcn.h>
    
    - (void)loadReveal
    {
        if (NSClassFromString(@"IBARevealLoader") == nil)
        {
            NSString *revealLibName = @"libReveal";
            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];
                [[[UIAlertView alloc] initWithTitle:@"Reveal library could not be loaded" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
            }
        }
    }
    

    警告: 不要在发布(release)构建中调用此方法,确保仅是在应用的调试(debug)构建中加载*libReveal.dylib*。

  9. 一个简单的集成方式是,在-[UIApplicationDelegate application: didFinishLaunchingWithOptions:]方法中调用上面声明的- (void)loadReveal方法,以确保Reveal库尽早地被加载进来。

    Swift:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        self.loadReveal()
        return true
    }
    

    Objective-C:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [self loadReveal];
        return YES;
    }
    

    提示: 在-[UIApplicationDelegate application: didFinishLaunchingWithOptions:]方法返回之前加载库的一个好处是,将会让Reveal服务在应用启动的同时也自动启动。

  10. 如果您不希望如上述步骤自动启动Reveal服务,也可以以手动的方式来启动,例如通过一个Debug按钮。在应用启动后,自己调用loadReveal方法,然后再分发一个名为IBARevealRequestStartNSNotification:

    Swift:

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

    Objective-C:

    - (void)startReveal
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
    }
    
  11. 在Xcode中,选择基于**Debug**配置的scheme,构建并运行您的应用。

    如果一切正常运行,请切换到Reveal应用,此时您的应用应会出现在应用选择器的下拉列表当中。选中您的应用,确认可以看到此时正在模拟器(或设备)中运行的应用界面截图。

官网地址:http://support.revealapp.com/kb/getting-started/revealrevealxcode

时间: 2024-08-03 17:53:19

集成Reveal到你的从Xcode工程中的相关文章

怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: &#39;NSInteger&#39; (aka &#39;long&#39;) to &#39;int32

在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,那么我们有没有办法去掉这些烦人的警告,不然一个工程几百个警告,你看着怎么都不爽吧.我们怎么去掉警告呢 1.最直接,最一劳永逸,最安全的方式,直接找到警告的那段代码,改为不警告.这个方式,最安全. 可是它有一个问题,就是,当我们很多文件都有这种类型的警告的时候,我们就需要改动很多很多的源码了, 对于不是我们写的源码,有可能

XCode工程中 Project 和 Targets区别

转自:http://blog.csdn.net/zhaozy55555/article/details/8557175 project就是一个项目,或者说工程,一个project可以对应多个target,比如一个xxx游戏的project,有free版的target,收费版的,或者还有什么节日版,product就是target build出来的一个app targets之间没一毛钱关系.但target和project有关系,target的setting会从project settings中继承一

怎么去掉Xcode工程中的某种类型的警告

问题描述  在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,那么我们有没有办法去掉这些烦人的警告,不然一个工程几百个警告,你看着怎么都不爽吧.我们怎么去掉警告呢? 1. 最直接.最一劳永逸.最安全的方式,直接找到警告的那段代码,改为不警告.这个方式最安全. 可是它有一个问题,就是,当我们很多文件都有这种类型的警告的时候,我们就需要改动很多很多的源码了, 对于不是我们写

关于XCode工程中PrefixHead.pch文件的使用

1.首先先清除pch文件在工程中的作用: 存放一些全局的宏(整个项目中都用得上的宏) 用来包含一些全部的头文件(整个项目中都用得上的头文件) 能自动打开或者关闭日志输出功能 2.由于新建的XCode工程文件是没有pch文件的,原因可能是因为大家把大量的头文件和宏定义放到pch里边,导致编译时间过长.苹果去掉他可能是要加快编译时间增加用户体验.虽然失去了编程的便利性. 所以需要我们自己手动新建一个pch文件,步骤如下: Command+N,打开新建文件窗口:ios->other->PCH fil

从XCode添加File的错误Multiple errors occurred while copying the files分析Cocos2d-x在XCode工程中添加文件

1.Multiple errors occurred while copying the files问题 关于这个问题,这里有解决办法 大致的意思是 1)添加文件没有全部添加,但是有部分添加成功,再次以文件夹添加之前的文件时会报这样的错误. 2)解决办法:先clean工程,点击上步需要添加文件的父目录,show  in  finder,删除之前添加的文件,重新添加. 这是一个解决办法,但是出现这样的问题还有另外一个原因: 勾选上了1的选项,导致出现上面的错误,直接去掉就可以了. 2.讲一讲Coc

XCode工程中ARC模式与非ARC模式共用(转)

Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外,还可以对单个文件添加标签来指定是否采用ARC模式. 添加标签的方法: 打开:你的target -> Build Phases -> Compile Sources. 双击对应的 *.m 文件 在弹出窗口中输入上面提到的标签-fobjc-arc / -fno-objc-arc (1)如果你的项目使用

如何在xcode工程中把lib工程加到主工程联合编译

名词解释:主工程 —— 产品, lib工程 —— 主工程需要引用的库的源代码工程: 1. 如果已经在xcode中打开了lib工程,关闭它,一定要关闭它,否则,后面的步骤都不能正常进行. 2. 在xcode中,打开主工程,打开树形工程目录,把lib工程的 .xcodeproj 拖入. 3. 选择主工程根目录,点击相应的target,选择Build Phases->Target Dependencies->add,把lib工程的target加进去:(这样会告诉主工程,当lib工程变化时,自动编译它

Git - 忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题

一.在同 .Git目录下创建.gitignore文件.在文件中加入如下内容: *.xcuserstate project.xcworkspace xcuserdata UserInterfaceState.xcuserstate project.xcworkspace/ xcuserdata/ UserInterface.xcuserstate 二.退出xcdoe, 打开终端(Terminal),进入项目目录下. 三.在终端键入  git rm --cached [YourProjectName

Git关于忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题

1.打开终端(Terminal),进入项目目录下 Last login: Sun Aug 13 13:38:10 on ttys001 xilanglangdeMacBook-Pro:~ xinshaofeng$ cd /Users/xinshaofeng/Work/Found xilanglangdeMacBook-Pro:Found xinshaofeng$ ls Found Podfile README.md Found.xcodeproj Podfile.lock Found.xcwor