如何支持iOs 9function,同时保持iOs 8支持?

基本上问题在于标题。 我相信有一种方法可以将您的应用程序发布到iOs的早期版本(在这种情况下为8),同时仍然可以使用较新OS版本的独有function。 示例:我的应用程序最低支持iOs 8.3,并且最新发布的iOs 9,我想添加支持强制触摸(这是只在iOs 9中可用),但在同一时间,我希望能够修复错误并做UI改进,并将更新发送到两个版本。 主要的应用程序做到这一点,例如,FB所以必须有一种方式,但我找不到它,我放弃:(

编辑 :有没有一个干净的方式来做到这一点? 没有检查respondsToSelector和这些东西? 像单独的项目? 或者也许xcconfig文件可以做到这一点? 我只是想知道..因为当你谈论一个企业/大型应用程序时,有一个if else每个ios 9的目标function并不是一个很好的解决scheme

Swift 2的可用性function应该可以解决您的问题。 随着可用性,Swift构build支持操作系统版本和符号可用性testing。

首先,将构build设置中的部署目标设置为iOS 8.3,将基础SDK设置为Latest。 如果你在你的项目中使用的符号(类,方法等)只能在比你的部署目标(iOS 8.3)更新的操作系统中可用,那么当你尝试构build时,Xcode会在该行显示一个错误消息并运行你的项目。

请参阅Swift编程语言手册的控制stream章节中 检查API可用性 。

可用性检查如下所示:

 if #available (iOS 9, *) { // use APIs only available on iOS 9 or later } else { // do nothing, don't show feature in UI, etc } 

这些是基础知识。 在问题的第二部分中,您正在寻找的是一种更大规模处理API可用性的方法。 要做到这一点,你可以使用Swift 2的可用性特性的另一个特性,即@available属性。 您可以将此属性应用于任何符号定义(例如,类),以标记该符号的定义需要特定的最低操作系统版本。

您不必在每个使用iOS 9 API的地方使用可用性检查,只需在整个类上使用@available属性即可。 那么您只需要在您使用该课程的地方使用可用性检查。 例如:

 @available(iOS 9, *) class MyAwesomeiOSNineFeature { var myCoolObject = UICooliOSNineThing() func doAwesomeStuff() { // lots of code that uses iOS 9 stuff, no availability check } func doOtherStuff() { // lots of code that uses iOS 9 stuff, no availability check } } // In another class that doesn't have an `@available` requirement: if #available(iOS 9, *) { let feature = MyAwesomeiOSNineFeature() feature.doAwesomeStuff() } else { // don't show UI for new feature } 

将Build Settings中的“iOS部署目标”设置为8.3,将基本SDK设置为Latest iOS(iOS 9.0)。

您可以在iOS 8支持的类中使用iOS 9代码,只要确保iOS 8设备上从不执行任何iOS 9代码。 你可以使用respondsToSelector:或[[UIDevice currentDevice] systemVersion]来提供帮助。

在iOS 9上的设备并不意味着它具有3D触摸,您应该使用forceTouchCapability属性来确定设备是否具有3D触摸,并使代码的某些部分反应适当

如果您需要知道设备正在运行哪个iOS版本,请查看此线程,并且可以使用if-else语句使您的代码做出适当的反应(例如,确保该设备的操作系统版本上实际存在该属性)