新iOS SDK功能如何向后兼容

问题描述:

如果SDK添加了新功能,这些功能是否适用于旧设备?如果API获取新方法,编译器是否会处理这些新方法以获取某些内部本机代码,或者添加的新功能无法在未运行新操作系统的设备上使用?新iOS SDK功能如何向后兼容

大部分情况下,为了保持向后兼容性,添加到SDK的新功能是“加入”的,并且需要您利用它们发布新版本的应用程序。规则总是有例外,但通常情况是这样。

+0

这是一个真实的陈述,但他似乎在问,操作系统是否会自动支持新功能,而不是应用程序是否可以自动使用新功能。 –

据我所知,SDK更新通常与操作系统更新一致。因此,添加到SDK中的任何功能只会在支持该SDK的操作系统版本中可用。

我给基于Android的例子,但我相信它背后的过程是为iOS一样的:

Android 2.1的== SDK V7(API 7级)

的Android 2.2 == SDK v8(API级别8)

运行Android 2.1或更低版本的手机将无法使用SDK v8中可用的任何功能。

当Apple添加新的SDK功能时,他们几乎总是依赖新的框架或运行时功能,这些功能同时添加到操作系统中,并且在以前的迭代中不可用。有极少数例外,但它们总是与添加到编译器的SDK功能有关。例如,根据iOS 5 SDK中有关自动引用计数的信息,假设您将能够使用除自我调零弱指针之外的所有ARC功能构建iOS 4应用程序似乎是合理的,因为这需要一些运行时支持。虽然我们不会确定,直到苹果计划提供它们的工具才会出现NDA。

Apple反而希望您使用Objective-C运行时的动态特性,以便仅在可用时才使用新功能,并将基本部署目标设置为支持应用程序功能的操作系统的最低受支持版本在合理的范围内。

例如:

if(![someObject respondsToSelector:@selector(relevantNewMethod)]) 
{ 
    // this version of the OS doesn't actually have relevantNewMethod 
    // so we'll do something else instead; attempting to use it will 
    // raise an exception on this device 
} 

或者:

if(NSClassFromString(@"ShinyNewiOSClass")) 
{ 
    // ShinyNewiOSClass is implemented on this version of the OS, so 
    // we can use it. Otherwise we'd better find something else to do 
    // instead... 
} 

NSClassFromString回报无论是Class实例或nil如果具有该名称的类存在,所以你可以改为采取NSClassFromString的结果,并做如果您愿意的话,可以使用习惯性的alloc初始化。

仅当MFMailComposer可用时(如果您希望在可用的情况下使用iOS 3方法时支持iOS 2),一个典型示例将显示“电子邮件”按钮。

对于全新的框架,标准实践是弱链接(这意味着你的程序希望它们被加载,但操作系统不应该引发异常,如果它们不存在),然后使用相同的反射特征检查相关类是否在运行时可用。

我原来看错了问题...

如果问题是...如果我为iOS5功能编程,iOS 4将支持该功能吗?

然后答案是......不。

除非你做一些像汤米提到的防御措施,您的应用程序要么不能编译,或者当这些功能被访问会崩溃。

SDK包含特定的iOS版本。适用于iOS 5.0的SDK为其编译的应用程序提供了5.0功能的界面(以及所有旧功能或API)。 5.0中新增的功能只能用于已安装5.0的设备。该应用可以检测它是否在具有该功能的设备上运行,并且如果该设备没有支持该功能的iOS版本,则应避免使用该功能。如果某个应用在安装了iOS 3.1.3的设备上运行时尝试使用4.0功能(例如),则该应用将收到异常并崩溃。

某些设备(如原始iPhone)无法加载最新的iOS版本。原来的iPhone卡在3.1.3。 iPhone 3G获得4.X,但它的一些功能被禁用(如多任务)。这个wikipedia article对各种设备可以运行的最大iOS版本有用。