如何在支持iOS 8的同时支持iOS 9功能?

3
基本上问题就在标题中。我相信有一种方法可以将您的应用程序运送到早期版本的iOs(在这种情况下为8),同时仍然能够使用新OS版本的独家功能。 例如: 我的应用程序最低支持iOs 8.3,并且随着iOs 9的最新发布,我想添加对force touch的支持(仅在iOs 9中可用),但与此同时,我还想能够修复错误和进行UI改进等,并将更新发送到两个版本。 主要应用程序都这样做,例如fb,因此必须有一种方法,但我找不到它的任何地方,我放弃了:(
编辑:有没有一种简洁的方法可以做到这一点?而不需要检查respondsToSelector之类的东西?像分离项目这样的东西?或者xcconfig文件可以完成这个技巧吗?我只是在想..因为当你谈论企业/大型应用程序时,在每个ios 9目标功能上都有一个if else并不是一个好的解决方案。
3个回答

8

Swift 2的可用性特性可以解决你的问题。使用可用性,Swift内置了对操作系统版本和符号可用性测试的支持。

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

请参见The Swift Programming Language书中Control Flow章节的检查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
}

是的,显然没有绕过 if else 的方法,也许可以将它们封装在工厂和自定义类的可选项中,以便通用代码在没有自定义功能的情况下可读性更高,但检查发生在内部。 我认为这回答了我的问题,所以谢谢 :) - Nour Helmi

-1

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

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


你的建议并没有帮助,因为该属性在iOS 8上不存在。他正在询问如何处理符号不存在的情况,而不是如何测试特定功能 - 测试本身在其他方面很重要,但在平台早期版本中不存在。 - Jack Lawrence

-1

在构建设置中将“iOS部署目标”设置为8.3,将基本SDK设置为最新的iOS(iOS 9.0)。

您可以在支持iOS 8的类中拥有iOS 9代码,只需确保任何仅适用于iOS 9的代码不会在iOS 8设备上执行。您可以使用respondsToSelector:或[[UIDevice currentDevice] systemVersion]来帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接