You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含不可配置参数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:52:51