WWDC Quick Look 💓 By SwiftGGTeam
Bring your app to Siri

Bring your app to Siri

观看原视频

Highlight

Siri 的底层架构在 iOS 18 发生了质变——借助 Apple Intelligence 的大语言模型,开发者只需通过 @AssistantIntent(schema:) Macro 将 App Intent 符合预定义 Schema,就能白嫖 Apple 训练好的自然语言理解能力(06:26)。


核心内容

过去接入 Siri 的体验不好。用户必须记住固定的句式,说错一个词 Siri 就无法理解。开发者的选择也很有限:要么用 SiriKit 的预定义域(音乐、消息),要么自己处理复杂的自然语言解析。

今年 Apple 改变了这个游戏规则。他们用大语言模型重构了 Siri 的语言理解层,并推出了 App Intent DomainsAssistant Schemas。本质思路是:Apple 的模型已经针对特定”形状”的 Intent 做了大量训练,你只需要让自己的 AppIntent 符合这个形状,就能免费获得 Siri 的自然语言理解能力。

目前 Apple 公开了 12 个 Domains,覆盖 Books、Camera、Mail、Photos、Spreadsheets 等场景,包含 100+ 个预定义的 Schema。Mail 和 Photos 在 iOS 18 发布时可用,其余将陆续推出。如果你应用的功能落在这些 Domain 里,接入成本极低——在 AppIntent 前加一行 @AssistantIntent(schema:) Macro 即可。

除了操作,Apple 还引入了 In-App SearchSemantic Search。前者让 Siri 能直接调用你应用内的搜索功能并导航到结果页面;后者让 Siri 能理解内容的语义(搜索”宠物”能找到猫狗蛇),而不仅匹配关键词。


详细内容

Assistant Schemas:一行代码获得自然语言理解

传统的 AppIntent 需要大量样板代码:

struct CreateAlbumIntent: AppIntent {
    static var title: LocalizedStringResource = "Create Album"
    static var description = IntentDescription(
        "Creates a new photo album",
        categoryName: "Media"
    )

    @Parameter(title: "Album Name")
    var albumName: String

    @Parameter(title: "Photos")
    var photos: [PhotosAsset]

    var openAppWhenRun: Bool = true

    func perform() async throws -> some IntentResult & ReturnsValue<AlbumEntity> {
        // 实现逻辑
    }
}

使用 Assistant Schema 后,代码可以精简到:

@AssistantIntent(schema: .photos.createAlbum)
struct CreateAlbumIntent: AppIntent {
    @Parameter(title: "Album Name")
    var albumName: String

    @Parameter(title: "Photos")
    var photos: [PhotosAsset]

    func perform() async throws -> some IntentResult & ReturnsValue<AlbumEntity> {
        // 实现逻辑
    }
}

关键点:

  • @AssistantIntent(schema:) Macro 声明后,titledescriptioncategoryName 等元数据不再需要——Schema 的形状已经定义了这些
  • openAppWhenRun 等属性也被自动处理
  • perform 方法依然是你的完全控制域——Apple 只定义输入输出形状,具体实现由你决定

如果需要灵活性,可以扩展可选参数:

@AssistantIntent(schema: .photos.createAlbum)
struct CreateAlbumIntent: AppIntent {
    @Parameter(title: "Album Name")
    var albumName: String

    @Parameter(title: "Photos")
    var photos: [PhotosAsset]

    // 扩展参数——Schema 未定义的属性
    @Parameter(title: "Album Color")
    var albumColor: AlbumColor?
}

Assistant Entity:让内容可被 Siri 理解

AppIntents 的 Entity 也有对应 Macro:

@AssistantEntity(schema: .photos.asset)
struct AssetEntity: AppEntity {
    var id: PersistentIdentifier
    var title: String
    var creationDate: Date
    var location: Location?
    var hasSuggestedEdits: Bool  // Schema 要求的属性

    static var typeDisplayRepresentation: TypeDisplayRepresentation = "Asset"
    static var defaultQuery = AssetQuery()
}

关键点:

  • 编译器会检查你的 Entity 是否匹配 Schema 形状——缺少 hasSuggestedEdits 会编译失败(12:18
  • Xcode 提供代码片段自动填充必需属性
  • 同样可以扩展可选属性

Assistant Enum:暴露枚举类型

@AssistantEnum
struct AlbumColor: AppEnum {
    case red, blue, green, yellow

    static var typeDisplayRepresentation: TypeDisplayRepresentation = "Color"
    static var caseDisplayRepresentations: [AlbumColor: DisplayRepresentation] = [
        .red: "Red", .blue: "Blue", .green: "Green", .yellow: "Yellow"
    ]
}

关键点:

  • Assistant Enum 不限制枚举 case 的形状,你完全自由定义
  • 一行 Macro 完成所有必需配置

Siri 请求的生命周期

理解 Assistant Schemas 如何工作,需要看请求的完整流程(05:34):

  1. 用户请求 → Apple Intelligence 处理
  2. 模型推理 → 根据 Schema 形状预测匹配的 Intent
  3. 工具箱路由 → 从所有符合该 Schema 的 AppIntents 中选择
  4. 执行 → 调用你的 AppIntent 的 perform 方法
  5. 呈现结果 → 返回给用户

你的 AppIntent 通过符合 Schema,让模型能够”推理”它。这就是为什么 Schema 形状如此重要——模型是针对特定形状训练的。

In-App Search:调用应用内搜索

基于 ShowInAppSearchResultsIntent,Apple 新增了 System Domain 的 Search Schema:

@AssistantIntent(schema: .system.search)
struct SearchAssetsIntent: AppIntent {
    @Parameter(title: "Search Criteria")
    var criteria: String

    func perform() async throws -> some IntentResult {
        // 导航到应用内搜索结果页面
        navigationManager.openSearch(with: criteria)
        return .result()
    }
}

关键点:

  • 用户可以说”在 [应用名] 里搜索自行车”(16:24
  • Siri 会直接打开你的应用并导航到搜索结果 UI
  • 当前可通过 Shortcuts 测试,未来会直接支持 Siri 语音

Semantic Search:让理解超越关键词

Apple Intelligence 让 Siri 能理解语义:

// 用户说"找我的宠物照片"
// Siri 不仅匹配"宠物"这个词,还会找到猫、狗、蛇等图片

要支持这个功能,需要将你的 Entity 标记为 IndexedEntity19:56):

@AssistantEntity(schema: .photos.asset)
struct AssetEntity: IndexedEntity {  // 符合 IndexedEntity
    // ...
}

关键点:

  • IndexedEntity 协议让你的内容进入语义索引
  • Siri 能理解”宠物”包含猫狗蛇,“风景”包含山川湖海
  • 找到内容后,Siri 能直接执行操作(分享、编辑等)

测试流程:通过 Shortcuts 验证

当前阶段(iOS 18 发布时),Assistant Schemas 主要通过 Shortcuts App 测试(19:23):

  1. 所有符合 Schema 的 AppIntent 自动出现在 Shortcuts 动作列表
  2. 可创建快捷方式测试参数传递和执行结果
  3. 未来 Siri 语音支持会通过软件更新推出

核心启发

1. 给照片/媒体类应用加 Siri 支持

如果你的应用处理照片、视频或媒体内容,现在可以用 Photos Domain 的 Schema 低成本接入 Siri。比如”把昨天拍的照片加到加州相册""用滤镜处理这张照片”。用户能通过语音完成复杂操作,无需多步点击。

怎么开始:

  • 检查你的功能是否匹配 Photos Domain 的 10+ 个 Schema(CreateAlbum、OpenAsset、SetFilter 等)
  • 在现有 AppIntent 上加 @AssistantIntent(schema:) Macro
  • 用 Shortcuts 验证参数和执行结果

2. 暴露应用内搜索给 Siri

任何有搜索功能的应用都可以通过 In-App Search Schema 让 Siri 直接调用。比如邮件应用(“找所有关于自行车的邮件”)、笔记应用(“搜索项目计划”)。用户无需打开应用手动输入搜索词。

怎么开始:

  • 确认应用有搜索 UI 和 API
  • 创建符合 .system.search Schema 的 AppIntent
  • 确保 perform 方法能正确导航到搜索结果页面

3. 用 IndexedEntity 让内容可被语义搜索

如果你的应用有用户生成内容(照片、笔记、文档),标记 Entity 为 IndexedEntity 能让 Siri 理解内容语义。用户说”找我的旅行照片”时,即使照片没有”旅行”标签,Siri 也能根据地点、时间等语义推断。

怎么开始:

  • 在 AppEntity 上同时符合 IndexedEntity 协议
  • 提供丰富的属性(地点、时间、人物、类型)
  • 确保 Spotlight 搜索已集成

关联 Session

评论

GitHub Issues · utterances