如何在针对旧 iOS 版本时添加需要 iOS 12 的自定义 Intent?

Posted

技术标签:

【中文标题】如何在针对旧 iOS 版本时添加需要 iOS 12 的自定义 Intent?【英文标题】:How can I add a Custom Intent which requires iOS 12 while targeting an older iOS version? 【发布时间】:2018-11-11 05:58:14 【问题描述】:

我正在尝试在面向 ios 10.3 的应用中添加自定义 Intent 以支持 Siri 快捷方式。 Xcode 会自动生成意图类和协议,但是所有生成的类和协议都具有以下属性:

@available(iOS 12.0, watchOS 5.0, *)

我知道#available(...) 但它不用于在编译时包含或排除代码,所以如果我的目标设置为 pre-iOS,我不确定如何添加自定义 Intent 12.

在下面的 sn-p 中,MyIntentHandling 和 MyIntentResponse 是由 Xcode 自动生成的。但是,这里没有办法使用#available。

public class MyIntentHandler: NSObject, MyIntentHandling 

    func confirm(intent: MyIntent, completion: @escaping (MyIntentResponse) -> Void)  ... 

    func handle(intent: MyEntryIntent, completion: @escaping (MyIntentResponse) -> Void)  ... 

谁有好的解决方案?

【问题讨论】:

【参考方案1】:

不,

#available

用于编译和运行时检查。

Swift 编译器在编译时进行检查,确保没有调用您选择的部署目标不支持的方法,并强制您使用#available 条件。因此,从 Xcode 9 开始,支持旧 iOS 部署目标和使用新功能更加安全。

在运行时,会检查 #available 条件是否与您当前运行的 iOS 版本匹配,它将仅执行匹配的代码。

所以,有了额外的意图支持,您就安全了。

【讨论】:

以上是关于如何在针对旧 iOS 版本时添加需要 iOS 12 的自定义 Intent?的主要内容,如果未能解决你的问题,请参考以下文章

目标设置为 iOS 13 的 iOS 应用在 App Store 上不提供旧版本

如何在 iPhone 6 上安装旧版本的 TestFlight

Xcode的多个副本-针对iOS的较早版本测试代码

iOS CoreData 版本升级和数据库迁移

如何提交与旧版本 iOS 不兼容的新版本应用程序?

针对 XCode 4.6 下的 iOS 4.x 设备