基本上问题在于标题。我确信有一种方法可以将您的应用程序发送到早期版本的iO(在本例中为8),同时仍然可以使用较新操作系统版本的独有功能。 例: 我的应用程序至少支持iOs 8.3,并且最新版本的iOs 9,我想添加对力触摸的支持(仅在iOs 9中可用),但同时,我希望能够修复bug例如,进行UI改进并将更新发送到两个版本。 主要的应用程序这样做,例如fb,所以必须有一种方式,但我找不到它,我放弃了:(
编辑:有没有整洁的方式呢?没有检查respondsToSelector
和这些东西?像单独的项目?或者也许xcconfig文件可以做到这一点?我只是想知道..因为当你谈论企业/大型应用程序时,在每个ios 9目标功能上都有一个if else
并不是一个很好的解决方案
答案 0 :(得分:8)
Swift 2的可用性功能可以解决您的问题。凭借可用性,Swift支持操作系统版本控制和符号可用性测试。
首先,将构建设置中的部署目标设置为iOS 8.3,将基础SDK设置为Latest。如果您在项目中使用仅在比部署目标(iOS 8.3)更新的操作系统中可用的符号(类,方法等),Xcode将在您尝试构建时在该行上显示一条错误消息并带有修复程序并运行你的项目。
请参阅 Swift编程语言一书的控制流章节中的Checking API Availability。
可用性检查如下所示:
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
属性。您可以将此属性应用于任何符号定义(例如,类),以标记符号的定义需要某个最小操作系统版本。
您可以在整个班级中使用@available
属性,而不是在使用iOS 9 API的每个地方都使用可用性检查。然后,您只需要在使用该类的位置使用可用性检查。例如:
@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
}
答案 1 :(得分:-1)
iOS 9上的设备并不意味着它具有3d触摸功能,您应该使用forceTouchCapability属性来确定设备是否具有3d触摸功能,并使代码的某些部分做出适当的反应
如果您需要知道设备正在运行哪个iOS版本,请查看this thread,您可以使用if-else语句使您的代码做出适当的反应(例如确保此设备上的属性确实存在操作系统版本)
答案 2 :(得分:-1)
将Build Settings中的“iOS部署目标”设置为8.3,将基础SDK设置为最新iOS(iOS 9.0)。
您可以在iOS 8支持的类中使用iOS 9代码,只需确保在iOS 8设备上永远不会执行任何仅限iOS 9的代码。你可以使用respondsToSelector:或[[UIDevice currentDevice] systemVersion]来帮助。