如何支持 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
}
基本上问题就在标题里。我确信有一种方法可以将您的应用程序转移到早期版本的 iOs(在本例中为 8),同时仍然能够使用更新的 OS 版本的独有功能。 例子: 我的应用程序最低支持 iOs 8.3,并且在最新版本 iOs 9 中,我想添加对强制触摸的支持(仅在 iOs 9 中可用),但在同时,我希望能够修复错误并进行 UI 改进,并将更新发布到两个版本。 主要的应用程序都是这样做的,例如 fb,所以一定有办法,但我在任何地方都找不到,我放弃了:(
编辑:有整洁的方法吗?不检查 respondsToSelector
之类的东西?像单独的项目?或者也许 xcconfig 文件可以做到这一点?我只是想知道.. 因为当你谈论一个 enterprise/large 应用
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
}