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

Xcode 14 beta下Widget自定义Intent报错如何修复

修复方案

该报错是Xcode版本迭代带来的SiriKit/Intent框架API变更导致:Xcode 12及之前版本自动生成的Intent处理协议,默认支持不带completion回调的方法实现,Xcode 13开始自动生成的协议方法统一要求带completion参数,旧代码里残留的单参数实现会和自动生成的方法产生Objective-C选择器冲突,Swift 6语言模式下会直接触发编译错误。

绝对不要手动编辑标注为「This file was automatically generated and should not be edited.」的自动生成文件,所有修改在自定义业务代码中完成即可,操作步骤如下:

  • 删除项目中手动实现的三个旧版无completion参数的冲突方法:
    • provideHeroOptionsCollection(for:)
    • confirm(intent:)
    • handle(intent:)
  • 实现新版带completion回调参数的协议方法,将原有业务逻辑迁移到新方法中,方法签名参考如下:
// 英雄选项提供方法
func provideHeroOptionsCollection(
    for intent: DynamicCharacterSelectionIntent,
    with completion: @escaping (INObjectCollection<Hero>?, Error?) -> Void
) {
    // 迁移原有英雄列表加载逻辑,最终通过completion返回结果
    let heroList = // 原有获取所有英雄对象的逻辑
    completion(INObjectCollection(items: heroList), nil)
}

// Intent确认方法
func confirm(
    intent: DynamicCharacterSelectionIntent,
    completion: @escaping (DynamicCharacterSelectionIntentResponse) -> Void
) {
    // 迁移原有参数校验逻辑,最终通过completion返回确认结果
    completion(.init(code: .success, userActivity: nil))
}

// Intent处理方法
func handle(
    intent: DynamicCharacterSelectionIntent,
    completion: @escaping (DynamicCharacterSelectionIntentResponse) -> Void
) {
    // 迁移原有Widget跳转、数据传递逻辑,最终通过completion返回处理结果
    guard let selectedHero = intent.hero else {
        completion(.init(code: .failure, userActivity: nil))
        return
    }
    completion(.success(hero: selectedHero))
}
  • 按下Shift + Command + K清理Xcode构建缓存,重新编译项目,自动生成文件中的报错会自动消失。

注意:所有对Intent逻辑的修改都要在.intentdefinition可视化配置文件和自定义的业务实现文件中操作,直接修改自动生成的Swift文件会在下次Intent定义变更时被Xcode覆盖,所有修改会丢失。

内容的提问来源于stack exchange,提问作者user14119170

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:27:07