博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集成Reveal到你的从Xcode工程中
阅读量:6429 次
发布时间:2019-06-23

本文共 4498 字,大约阅读时间需要 14 分钟。

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

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

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

  1. 在Xcode中打开您的iOS工程。

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

    Show Reveal Library in Finder

  3. libReveal.dylib 文件拖入Xcode中的Project Navigator面板。

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

    Copy resource to project dialog

  5. 点击**Finish**。

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

    Copy library to bundle resources

    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。

    Add Run Script phase

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

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

    Swift:

    // MARK: - Revealfunc 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 
    - (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 App Chooser showing Soundstagram

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

 

 

 

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

转载于:https://www.cnblogs.com/zhao-jie-li/p/5123585.html

你可能感兴趣的文章
Linux下Apache的安装与配置
查看>>
再谈 apache设置virtualhost + apache的一些相关设值
查看>>
js权威指南
查看>>
有遍历struct中字段信息的函数或方法
查看>>
Bug跟踪的流程
查看>>
第 5 章 Nova - 035 - Suspend/Rescue Instance 操作详解
查看>>
python工程的结构
查看>>
扩展Python模块系列(五)----异常和错误处理
查看>>
【转】React-Native 实现增量热更新的思路
查看>>
至少有一个值不适合指定的文本字段
查看>>
AutoCAD .NET二次开发(四)
查看>>
使用PL/SQL 导入oracle dmp文件
查看>>
Java Web整合开发(22) -- Hibernate实体映射
查看>>
CLR Via CSharp读书笔记(20):异常和状态管理
查看>>
20180918-2 每周例行报告
查看>>
宇信系统
查看>>
[NOIP2013普及组]车站分级
查看>>
Navicat快捷键
查看>>
使用MyBatis Generator自动创建代码( SSM框架)
查看>>
initrd与initramfs的区别
查看>>