如何支持 iOs 9 项功能,同时保持 iOs 8 项支持?

How to support iOs 9 feature(s), while keeping iOs 8 support?

基本上问题就在标题里。我确信有一种方法可以将您的应用程序转移到早期版本的 iOs(在本例中为 8),同时仍然能够使用更新的 OS 版本的独有功能。 例子: 我的应用程序最低支持 iOs 8.3,并且在最新版本 iOs 9 中,我想添加对强制触摸的支持(仅在 iOs 9 中可用),但在同时,我希望能够修复错误并进行 UI 改进,并将更新发布到两个版本。 主要的应用程序都是这样做的,例如 fb,所以一定有办法,但我在任何地方都找不到,我放弃了:(

编辑:有整洁的方法吗?不检查 respondsToSelector 之类的东西?像单独的项目?或者也许 xcconfig 文件可以做到这一点?我只是想知道.. 因为当你谈论一个 enterprise/large 应用

时,在每个 ios 9 个目标功能上都有一个 if else 并不是一个好的解决方案

一个设备在iOS9并不意味着它有3d触摸,你应该使用forceTouchCapability属性来确定设备是否有3d触摸,并使某些部分您的代码做出适当的反应

如果您需要知道设备是哪个 iOS 版本 运行,请查看 this thread 并且您可以使用 if-else 语句使您的代码做出适当的反应(比如确保 属性 确实存在于此设备 OS 版本)

将构建设置中的 "iOS Deployment Target" 设置为 8.3,并将您的基础 SDK 设置为最新 iOS (iOS 9.0)。

您可以在 iOS 8 中支持 iOS 9 代码 类,只要确保任何 iOS 9 代码永远不会在 [=15= 上执行] 8器。您可以使用 respondsToSelector: 或 [[UIDevice currentDevice] systemVersion] 来提供帮助。

Swift 2 的可用性功能应该可以解决您的问题。有了可用性,Swift 构建了对 OS 版本控制和符号可用性测试的支持。

首先,将构建设置中的部署目标设置为 iOS 8.3,将基础 SDK 设置为最新。如果您在项目中使用仅在比部署目标 (iOS 8.3) 更新的操作系统中可用的符号(classes、方法等),Xcode 将显示一条错误消息当您尝试构建和 运行 您的项目时,在该行上进行修复。

请参阅 The Swift Programming Language 一书的 Control Flow 章节中的 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 属性。您可以将此属性应用于任何符号定义——例如 class——以标记该符号的定义需要特定的最低 OS 版本。

您可以使用 iOS 9 API 而不是在每个地方都使用可用性检查,您可以只对整个 class 使用 @available 属性。然后你只需要在你使用那个 class 的地方使用可用性检查。例如:

@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
}