为多个iOS版本开发应用程序

时间:2012-11-16 16:42:33

标签: ios compiler-construction build target deprecated

我正在使用iOS 5.1和带有iOS 6.0的iPad 4测试iPhone 4上的应用程序。我环顾四周,出乎意料地没有找到类似的问题:

1-我的应用程序有一些在iOS 6.0中已被弃用的方法所以我相信我必须构建一些if / then条件来测试系统版本使用:[[UIDevice currentDevice] systemVersion],然后使用适当的版本方法。这是最有效的方式吗?

2-我的理解是,只有一个目标,"项目"部署目标和"目标"部署目标服务于同一目的。我需要将其中一个或两个作为iOS 5.1,因为这是iOS支持的最低要求。令人困惑的是,如果目标是基于iOS 5.1构建的,它将如何在iOS4的iPad4上运行:

  • iPad OS在运行之前是否检查目标版本,或者只是尝试运行代码,而且iOS 5.1目标没有任何与6.0不兼容的代码?

  • 即使是这种情况,5.1目标如何支持我为有条件地替换弃用方法而构建的6.0方法?

非常感谢!

5 个答案:

答案 0 :(得分:28)

不推荐使用的方法

如果您的目标是在这些方法被弃用之前发布的的iOS版本,则可以使用不推荐使用的方法。但假设您的部署目标设置正确,您将不会收到任何编译器错误,除非那些已弃用的方法始终已弃用您正在定位的版本。换句话说,如果您在代码中看到弃用警告,则需要修复它们或检查部署目标设置是否正确。不要忽视它们!

Xcode设置级别

您提到您可以在目标和项目级别定义部署目标设置。目标级别的Xcode构建设置将覆盖项目设置。因此,仅在其中一个级别定义部署目标,然后转到另一个并点击删除,这样您就没有重复的值。如果您只有一个目标,那么在目标或项目级别定义它并不重要。

向后兼容

最后,有许多因素可用于向后兼容。有时会有新的iOS 6方法,例如supportedInterfaceOrientations,在旧的iOS版本中会被忽略。其他时候你需要添加显式检查:

  • 如果您在对象上调用方法,并且该方法仅在iOS 6中引入,则需要添加respondsToSelector:检查,如下所示:

    // only available on iOS 6
    if ([locationManager respondsToSelector:@selector(pausesLocationUpdatesAutomatically)]) {
        locationManager.pausesLocationUpdatesAutomatically = YES;
    }
    
  • 如果要检查当前iOS版本中是否存在特定类,可以像这样检查+ class方法的返回值:

    // Only available on iOS 6
    if ([UICollectionView class]) {
        // ...
    } else {
        // class doesn't exist in this iOS version
    }
    
  • 如果要检查特定功能是否可用,请在其上执行简单的if语句:

    // Only available in iOS 6
    if (ABAddressBookCreateWithOptions) {
        ABAddressBookCreateWithOptions(...);
    } else {
        ABAddressBookCreate(...);
    }
    
  • 最后,如果要检查常量是否可用,请检查它的地址:

    // Only available in iOS 4
    if (&UIApplicationProtectedDataDidBecomeAvailable) {
        // subscribe to notification
    }
    

您的Base SDK设置应始终设置为“最新”。

如果您遵循所有这些准则,您将能够解决大多数问题,而无需添加显式版本检查。检查iOS版本或设备ID非常脆弱,可能会导致您的应用在未来版本中中断。你真的想避免它。

答案 1 :(得分:4)

  1. 您可以使用[[UIDevice currentDevice] systemVersion]来检测可行的操作系统版本。您可以使用respondsToSelector:来查看存在的方法,而不是检测操作系统版本,NSClassFromString() != nil可以查看是否存在类,如果该方法不可用则使用后备。

  2. iOS向后兼容,因此iOS 6可以正常运行iOS 5应用程序。但是,如果您想使用iOS 6特定功能但仍支持iOS 5.1,则必须:

    • 使用6.0 SDK进行编译,以便编译器知道新的API
    • 将目标版本设置为支持的最低版本,即。 5.1。任何高于该数字的系统都将运行代码。任何较低的人都不会尝试。
    • 使用1.中描述的方法之一,确保每个设备都执行操作系统支持代码。
  3. 我希望这很清楚,如果你有更多问题,请不要犹豫

答案 2 :(得分:2)

您必须做的是检测功能,而不是iOS版本,请查看此主题:

Conditional support of iOS 6 features in an iOS 5 app

答案 3 :(得分:0)

iOS向后兼容。如果您为iOS 5.1编译应用程序,它也将在iOS 6上完美运行。无需重新实现已弃用的类。

但如果您将部署版本从5.0更改为6.0,如果您使用弃用方法,Xcode将向您显示警告

如果您想使用仅在iOS 6中可用的方法,您可以使用此检查:

if ([self respondsToSelector:@selector(doSomething:)]) {
        [self doSomething];
    }

答案 4 :(得分:0)

您不应检查系统版本,而应检查您尝试使用的功能。在那个注意事项中记住,弃用并不意味着删除所以无论你想要做什么,都可能适用于iOS6。要检查特定功能,您可以执行以下操作:

if([TheClassInQuestion class] != nil)
{
    //use it
}