目前,我正在调整我的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版本。 - 这是对的吗?我对第二个问题特别好奇,因为这意味着我们可以使用像UIVisualEffectView
这样的酷新内容来运行在iOS上运行的应用程序。 8.此外,这意味着更少的头痛,例如在保持CoreLocation
功能的同时遵循对其所做的所有更改(kCLAuthorizationStatusAuthorized
- > kCLAuthorizationStatusAuthorizedWhenInUse
等),因为我们可以只需维护一个代码库,就不必经常#ifdef
。
如果我的假设是正确的,请告诉我,如果没有,请在答案中更正。
谢谢!
答案 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,无论版本如何。