我的iOS6编译的静态库可以检查iOS应用程序的编译版本吗?

时间:2013-10-16 18:46:33

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

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

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

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

编辑:根据请求,这里有关于我正在努力完成的更多信息。

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

3 个答案:

答案 0 :(得分:2)

您可以在应用程序的Mach-O标题中搜索LC_VERSION_MIN_IPHONEOS,它会告诉您应用程序链接的SDK版本。

答案 1 :(得分:0)

您应该在要调用的选择器上使用运行时内省。

E.g。

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];
}

内省更好,因为它保证了方法可用,并且在比较次要系统版本时,上述系统检查方法不可靠。

答案 2 :(得分:0)

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

无论如何,这是我如何确保您的webview正确显示:

获取窗口的边界。窗口始终以纵向方向表示屏幕的大小。观点转变为那个空间。这里的关键是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上运行,此rect都将是状态栏区域下所有剩余窗口空间的矩形。您应该能够使用它来定位您的Web视图。