不同iOS版本之间的App迁移

时间:2014-09-09 11:09:04

标签: ios objective-c xcode migration

目前,我正在调整我的iOS 7.1应用以支持iOS 8 在这个过程中,我越来越意识到我可能已经看到SDK和OS版本之间的关系一直都是错误的。

我将用一个具体的例子告诉你:

UIViewControllerContextTransitioning协议为iOS8获得了更多方法。因此,为了支持新的操作系统,我开始在我的ContainerViewController中实现新方法。

当我遇到- (UIView *)viewForKey:(NSString *)key方法时,我自然会针对key常数检查UITransitionContextFromViewKey

此常量具有NS_AVAILABLE_IOS(8_0)后缀。所以我假设常量仅在iOS8及以上时运行时可用。

当我将Xcode中的部署目标从8.0设置为7.1并点击'Build&运行',令我惊讶的是,根本没有任何错误,应用程序在我的iOS7.1设备上运行没有任何问题。 - 即使代码中包含只能在> = iOS8上使用的常量。

以下是我现在想到的问题:

  • 标头文件中的NS_AVAILABLE_IOS(8_0)后缀不会确定iOS版本,而是标识的API可用的SDK版本。 - 这是对的吗?
  • 这是否意味着我们能够在为iOS7.1编译的应用中使用iOS8 SDK中添加的API,只要我们使用新的SDK来构建应用程序?

我对第二个问题特别好奇,因为这意味着我们可以使用像UIVisualEffectView这样的酷新内容来运行在iOS上运行的应用程序。 8.此外,这意味着更少的头痛,例如在保持CoreLocation功能的同时遵循对其所做的所有更改(kCLAuthorizationStatusAuthorized - > kCLAuthorizationStatusAuthorizedWhenInUse等),因为我们可以只需维护一个代码库,就不必经常#ifdef

如果我的假设是正确的,请告诉我,如果没有,请在答案中更正。

谢谢!

1 个答案:

答案 0 :(得分:3)

重要的是要意识到,将iOS 8 SDK与iOS 7的部署目标相链接,可以创建一个可在两者上运行的应用程序,但API可用性会有所不同。

当应用程序在iOS 7上运行时,iOS 8 API将不可用。在运行时,访问iOS 8 API可能会导致崩溃或其他不良行为。处理此问题的推荐方法是使用仅在iOS 8或更高版本上标记为可用的类,方法或常量时,必须在运行时查询其可用性。

对于新的UIViewControllerContextTransitioning方法,您可以在运行时查询这些iOS 8方法的存在:

if ([transitioner respondsToSelector:@selector(viewForKey:)]){
    // It's available, you're set to call it
} else {
    // The method is not available, you will have to work around it.
}

显然,对于某些应用程序来说,这会使事情变得更加复杂。应用程序DeployMate对于查找代码库中的API差异非常有用。它将扫描您的项目并告诉您使用仅适用于iOS 8的方法。

iOS 7技术讲座Architecting Modern Apps, Part 2中更详细地介绍了支持不同SDK和OS版本和功能的指南。虽然示例用于支持iOS 6和7,但此处的指南适用于支持多个操作系统或SDK,无论版本如何。