【问题标题】:Can my iOS6-compiled static library check an iOS app's compiled version?我的 iOS6 编译静态库可以检查 iOS 应用的编译版本吗?
【发布时间】:2013-10-18 07:13:44
【问题描述】:

我有一个使用 iOS 6.1 编译的 iOS 静态库。我想做的是在编译时运行检查以查看链接到我的静态库的 iOS 应用程序是否使用 iOS7 编译(并在该事件中运行一些代码)。有没有办法做到这一点?我试过了:

  • __IPHONE_OS_VERSION_MAX_ALLOWED 宏,但它返回我的库 (60100) 的已编译操作系统版本,而不是链接到它的应用程序。
  • 检查 NSFoundationVersionNumber 但返回的是设备的系统版本,而不是应用程序。

非常感谢任何帮助。谢谢!

编辑:根据请求,这里有更多关于我想要完成的信息。

我的 iOS6 编译静态库提供全屏广告。随着 iOS7 对状态栏显示方式的更改,我的广告(带有 UIWebViews 的 UIViews)出现在状态栏元素下方。所以,我试图检测使用我的静态库的应用程序是否是用 iOS7 编译的,所以我可以做一些事情,比如向下调整上述 UIWebView 的原点,在我的顶部添加一个 20 点灰色 UIView 对象主 UIView 对象,因此状态栏元素可见等。此外,检查应用程序是否针对 iOS6 编译同样重要,因此我不会错误地应用 UI 修复。检查 UIDevice 的 systemVersion 属性将不起作用,因为无论使用我的库的应用程序是在 iOS6 还是 iOS7 上编译的,它都会返回相同的内容。

【问题讨论】:

  • 所以你问苹果是如何完成的:“作为一种向后兼容机制,苹果框架有时会检查构建应用程序的 SDK 版本,如果是较旧的 SDK,则修改兼容性的行为。这是在 Apple 预测或发现兼容性问题的情况下完成的。 developer.apple.com/library/ios/documentation/DeveloperTools/…

标签: c++ iphone ios objective-c ios7


【解决方案1】:

您或许可以在应用的 Mach-O 标头中搜索 LC_VERSION_MIN_IPHONEOS,它会告诉您应用所链接的 SDK 版本。

【讨论】:

    【解决方案2】:

    我看到了你的困境。您需要知道兼容模式是否处于活动状态。无论如何,我建议将您的库升级为使用 iOS 7 构建,就好像目标应用程序是为 iOS 7 构建的一样,即使您是为 iOS 6 构建的,您的库视图也会看起来错误,因为运行时是动态链接的,并且其特征由宿主应用程序,而不是您的 SDK。

    无论如何,我将通过以下方式确保您的 web 视图正确显示:

    获取窗口的边界。窗口始终以纵向表示屏幕的大小。视图被转换到那个空间。这里的关键是 iOS 6 上的窗口调整其视图控制器的大小以考虑状态栏(除了在具有隐藏状态栏的应用程序中),但在 iOS 7 上,它的大小可以放在状态栏下方。然后,您可以找到状态栏方向,从窗口的高度(或宽度)中取出必要的 20px,并使用 UIKit 将矩形转换为本地视图中的坐标

    CGRect windowBounds = [[[UIApplication sharedApplication] keyWindow] bounds];
    CGRect advertRect;
    if ([[UIApplication sharedApplication] isStatusBarHidden]) {
        advertRect = [[[UIApplication sharedApplication] keyWindow] convertRect:advertRect
                                                                         toView:self.view];     
    }
    else{
        //status bar is not hidden
        CGRectEdge edge;
        switch ([[UIApplication sharedApplication] statusBarOrientation]) {
            case UIInterfaceOrientationLandscapeLeft:
                edge = CGRectMinXEdge;
                break;
            case UIInterfaceOrientationLandscapeRight:
                edge = CGRectMaxXEdge;
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                edge = CGRectMaxYEdge;
                break;
            case UIInterfaceOrientationPortrait:
            default:
                edge = CGRectMinYEdge;
                break;
        }
    
        CGRect statusBarRect;
        CGRect remainingRect;
    
        CGRectDivide(windowBounds, &statusBarRect, &remainingRect, 20.0, edge);
    
        //converts from window co-ordinates to view co-ordinates
        advertRect = [[[UIApplication sharedApplication] keyWindow] convertRect:advertRect
                                                                         toView:myView];
    }
    

    无论您在哪个 iOS 上运行,此矩形都将是状态栏区域下所有剩余窗口空间的矩形。您应该能够使用它来定位您的网络视图。

    【讨论】:

      【解决方案3】:

      您应该对要调用的选择器使用运行时自省。

      例如

      if ([self.navigationController.navigationBar respondsToSelector:@selector(barTintColor)]) {
          [self.navigationController.navigationBar setBarTintColor:[UIColor greenColor]];
      }
      

      如果必须的话,你可以使用系统版本检查

      if ([[UIDevice currentDevice] systemVersion].floatValue < 7.000000) {
          [[UIBarButtonItem appearanceWhenContainedIn:containerClass, nil] setTintColor:tintColor];
      }
      

      自省更好,因为它保证方法可用,而上述系统检查方法在比较小系统版本时不可靠。

      【讨论】:

      • 零越多,你就越确定;)
      • 我会在我的下一张壁纸中写这个... ; )
      • 我本来也是这么想的。问题是我正在寻找链接到我的静态库的应用程序的编译操作系统版本,不一定是当前设备的操作系统。
      • 您能否在您的问题中发布更多信息?少考虑如何,多考虑为什么。如果我们知道您的最终目标,我们可以提供更多帮助。
      • 完成。感谢您花时间帮助我!
      猜你喜欢
      • 1970-01-01
      • 2012-05-24
      • 2015-08-31
      • 2016-06-05
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多