【问题标题】:How to support iOs 9 feature(s), while keeping iOs 8 support?如何在保持 iOs 8 支持的同时支持 iOs 9 功能?
【发布时间】:2015-12-20 05:19:50
【问题描述】:

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

编辑:有简洁的方法吗?不检查respondsToSelector 和这些东西?像单独的项目?或者也许 xcconfig 文件可以做到这一点?我只是想知道.. 因为当您谈论企业/大型应用程序时,在每个 ios 9 目标功能上都有一个 if else 并不是一个好的解决方案

【问题讨论】:

    标签: ios iphone ios8 ios9


    【解决方案1】:

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

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

    【讨论】:

    • 您的建议没有帮助,因为该属性在 iOS 8 上不存在。他问的是当符号不存在时如何处理,而不是如何测试特定功能——测试本身在其他方式,但在早期版本的平台上不存在。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      Swift 2 的可用性功能应该可以解决您的问题。在可用性方面,Swift 内置了对操作系统版本控制和符号可用性测试的支持。

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

      请参阅 The Swift Programming Language 一书中的控制流一章中的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
      }
      

      【讨论】:

      • 是的,显然没有其他办法,也许将它们封装在自定义类的工厂和选项中,因此通用代码在没有自定义功能的情况下是可读的,但检查发生在内部。我想这回答了我的问题,所以,谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多