如何将含不可配置参数的SiriKit Custom Intent转为AppIntent并兼容iOS16?
解决方案
1. 手动编写自定义AppIntent类(推荐)
自动转换工具会默认将参数设为可配置,不符合需求的话,直接手动编写AppIntent类,精准控制参数可见性和预设参数捐赠:
import AppIntents // 定义符合需求的AppIntent struct PresetActionIntent: AppIntent { // 自定义快捷指令展示标题 static let title: LocalizedStringResource = "预设动作" // 可选:设置语音调用短语 static let suggestedInvocationPhrase = "执行我的预设动作" // 将参数设为隐藏,不在快捷指令App中显示 @Parameter(visibility: .hidden) var presetParam1: String @Parameter(visibility: .hidden) var presetParam2: Int // 执行逻辑 func perform() async throws -> some IntentResult { // 在这里处理业务逻辑,使用预设的参数 print("参数1: \(presetParam1), 参数2: \(presetParam2)") return .result() } // 自定义参数摘要(确保快捷指令中只显示动作本身,不展示参数) static var parameterSummary: some ParameterSummary { Summary("执行预设好的自定义动作") } } // 捐赠带预设参数的快捷指令 func donatePresetShortcut() { // 创建已设置好参数的Intent实例 let intent = PresetActionIntent( presetParam1: "固定参数值1", presetParam2: 456 ) // 生成快捷指令并设置自定义标题 let shortcut = Shortcut(intent: intent) shortcut.title = "我的专属预设快捷指令" // 执行捐赠 Task { do { try await DonationCenter.shared.donate(shortcut) } catch { print("快捷指令捐赠失败: \(error.localizedDescription)") } } }
调用donatePresetShortcut()的时机可以选在App启动完成后,或者用户首次打开相关功能时。
2. 修正自动转换后的AppIntent代码
如果已经通过菜单栏完成自动转换,只需修改生成的代码,调整参数可见性即可:
- 找到自动生成的参数定义,添加
visibility: .hidden属性 - 调整参数摘要,隐藏参数展示
示例修改:
// 自动转换后的原参数 // @Parameter(title: "Param1") // var param1: String // 修改后 @Parameter(title: "Param1", visibility: .hidden) var param1: String
之后同样可以通过创建带预设参数的Intent实例,生成Shortcut并捐赠,步骤同方案1。
3. 旧Custom Intent与App Shortcuts共存兼容
若必须保留旧Custom Intent,需确保旧Intent的配置和捐赠逻辑不受App Intents框架影响:
- 保留原有的Intent Definition文件,不要删除或禁用
- 继续使用
INInteraction完成旧Intent的捐赠,不要混用AppIntents的捐赠方法 - 确保Info.plist中旧Intent的相关配置(如
NSUserActivityTypes、IntentsSupported)仍然存在
示例旧Intent捐赠代码:
import Intents func donateOldCustomIntent() { let oldIntent = MyOldCustomIntent() oldIntent.param1 = "预设参数" oldIntent.param2 = 123 oldIntent.suggestedInvocationPhrase = "旧版动作" let interaction = INInteraction(intent: oldIntent, response: nil) interaction.donate { error in if let error = error { print("旧版Intent捐赠失败: \(error.localizedDescription)") } } }
注意:iOS 16及以上系统中,旧版Custom Intent可能会被系统优先展示AppIntents相关内容,此方案仅作为临时兼容,长期建议迁移到AppIntent。
内容的提问来源于stack exchange,提问作者holtmann
相关产品推荐
相关产品推荐

