1

我有一个使用 iOS 6.1 编译的 iOS 静态库。我想做的是在编译时运行检查以查看链接到我的静态库的 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 上编译的,它都会返回相同的内容。

4

3 回答 3

2

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

于 2013-10-16T22:58:42.813 回答
0

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

例如

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

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

于 2013-10-16T19:11:02.603 回答
0

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

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

获取窗口的边界。窗口始终以纵向表示屏幕的大小。视图被转换到那个空间。这里的关键是 iOS 6 上的窗口调整其视图控制器的大小以考虑状态栏(除了在具有隐藏状态栏的应用程序中),但在 iOS 7 上,它的大小可以放在状态栏下方。然后您可以找到状态栏方向,从窗口的高度(或宽度)中取出必要的 20 像素,并使用 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 上运行,此矩形都将是状态栏区域下所有剩余窗口空间的矩形。您应该能够使用它来定位您的 Web 视图。

于 2013-10-17T23:13:44.187 回答