• 集成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*的文件夹。

      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 -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 App Chooser showing Soundstagram

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

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

    追寻最真
  • 相关阅读:
    HDU 5486 Difference of Clustering 图论
    HDU 5481 Desiderium 动态规划
    hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
    HDU 5478 Can you find it 随机化 数学
    HDU 5477 A Sweet Journey 水题
    HDU 5476 Explore Track of Point 数学平几
    HDU 5475 An easy problem 线段树
    ZOJ 3829 Known Notation 贪心
    ZOJ 3827 Information Entropy 水题
    zoj 3823 Excavator Contest 构造
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/5123585.html
Copyright © 2020-2023  润新知