在不破坏向后兼容性的情况下使用iOS 5功能

12

我的应用程序目前编译使用的是最新的iOS 4.x SDK。如果iOS 5.0 SDK发布了,我是否可以在应用程序中使用新的iOS 5.0 SDK功能,并使其在iOS 4设备上运行(但使用新功能的部分会被禁用)?


请参阅《如何使 iPhone 应用程序与多个 SDK(固件)版本兼容》(https://dev59.com/BXA75IYBdhLWcg3w7t16)。虽然这些问题中的版本比较旧,但是同样的一般原则适用。 - Brad Larson
2个回答

10
一般来说,Objective-C运行时是完全反射的。这意味着你可以通过respondsToSelector:查询一个对象支持哪些方法,并且可以通过NSClassFromString按名称获取类。iOS二进制文件还支持与框架的弱链接概念。这意味着如果可用,则会加载框架,但如果框架不可用,则不会将其视为致命错误(这是默认行为)。
这意味着当苹果发布新版本的操作系统时,你可以编写代码,在最新版本的操作系统上使用新功能,但如果这些新功能是新的API位,则无需考虑它们也可以正常运行。
苹果有时还提供一些并非新API的新SDK功能,例如添加到Xcode的Clang静态分析器。由于这些功能通常不需要任何运行时支持,因此完全可用。 iOS 5有点特别,因为苹果对LLVM项目的提交表明,ARC中的某些新编译时特性依赖于一些运行时支持。因此,如果确实在工具中以苹果打算分发它们的方式存在,则它们将不可用。

9
你可以在运行时检查某些功能是否可用。
例如:
Class motionManagerClass = NSClassFromString(@"CMMotionManager");
if(motionManagerClass) {
    CMMotionManager *motionManager = [[CMMotionManager alloc] init];
    if([motionManager isGyroAvailable]) {
        //iOS device with gyro
    }else {
        //right iOS but device has no gyro
    }
}else{
//wrong iOS
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接