WWDC26:Code-along: Make your app available to Siri

App Schema によって Siri と自然言語でアプリコンテンツとのインタラクションを実現する方法のコードベース解説。前回前々回の良い復習になった。

Code-along: Make your app available to Siri


0:00 – Introduction

  • ピクニックシナリオを通じた実演:イベント検索、時間の更新、参加者へのテキスト送信、会話形式での質問応答
  • 既存アプリを Siri 対応にする流れをコードアロング形式で体験

1:43 – App Schemas and the plan

  • App Intents によるシステム連携の仕組みと App Schemas の役割を整理
    • App Schemas はコンテンツとアクションを Siri が理解できる形で記述する
    • トレーニングフレーズ不要で Siri との連携が成立する
  • サンプルアプリ CometCal で calendar ドメインを採用する 2 つの目標
    • コンテンツの理解(エンティティ)
    • アクションの実行(インテント)

3:44 – Build the CalendarEntity

  • @AppEntity(schema: .calendar.calendar) マクロでスキーマ準拠の AppEntity を作成
  • idUUID 型で指定
  • IndexedEntity に準拠して Spotlight へのインデックスを有効化
  • @Dependency でデータアクセスを注入
    • App Intent が共有リソースをインテントやクエリに注入する仕組み
    • インスタンスの再生成をせず、既に登録したオブジェクトを提供 
  • EnumerableEntityQuery を採用してすべてのカレンダー allEntities を列挙可能に
  • displayRepresentation でタイトルや画像を設定して Siri や Shortcuts での表示名を定義
  • IndexedEntity はインデックスされるコンテンツの形状を定義、コンテンツ更新に従って再インデックスが必要
    • CSSearchableIndex.indexAppEntities(_:) でエンティティを提供
    • 同様に updateAppEntities, deleteAppEntities

8:00 – Build the AttendeeEntity

  • @AppEntity(schema: .calendar.attendee) から構築
  • TransientAppEntity に準拠(IndexedEntity ではなく)
    • 参加者はイベントを通じてのみアクセスされ、一時的なエンティティであるため、識別子・クエリ・インデックスが不要
    • 同じ人が複数イベントへの参加を表明する場合、仮に参加ごとにインデックスを作成すると Spotlight で重複した結果が生じる
  • IntentPerson 型(システム標準の人物表現)と参加者のステータス・種別用の @AppEnum を導入

10:30 – Build the EventEntity

  • @AppEntity(schema: .calendar.event) から構築する中心的な IndexedEntity
  • タイトルやメモの質問に対応するセマンティックインデックスをサポート
  • CalendarEntity[AttendeeEntity] を合成して構造化
    • Siri は AppSchema 二よりこれらの構造を理解
  • Calendar.RecurrenceRule によりイベントの繰り返しルールを定義
  • 場所・アラームのユニオン値 EventLocation、イベントステータス EventEntityStatux, スパン EventSpan

14:34 – Open events with OpenIntent

  • Siri からアプリのメイン画面が開くだけでなく、対象のイベントを開いて欲しい
  • system.open スキーマに準拠した OpenEventIntent を実装
    • EventEntity を受け取り NavigationManager でイベント詳細画面へ遷移
  • Spotlight や Siri でイベントをタップすると直接詳細画面が開くようになる

15:30 – Onscreen awareness

  • 2 つのビューモディファイアでオンスクリーン認識を有効化
    • .appEntityIdentifier:イベントリストの各行に付与
    • .userActivityEntityIdentifier 付き):詳細ビューに付与
  • 「このイベント」「3 番目のイベント」のようなタイトルを言わない参照が解決できるようになる

17:18 – Create events with Siri

  • calendar.createEvent スキーマに準拠した createEventIntent を実装
    • パラメータ型を設定し @MainActor @Dependency を追加
    • perform() 内でスキーマのパラメータ(場所のユニオン値、繰り返しルール)を解決して EventEntity を返す
  • 自然言語の解釈・確認・曖昧さの解消は Siri が担当

19:24 – Update events

  • UpdateEventIntentCreateEventIntent と対称的な構造で、パラメータはオプショナル
  • IntentParametervalueState が重要なポイント
    • .set(値あり):変更を意図
    • .setnil):クリアを意図
    • .unset:リクエストに含まれていない(変更しない)

21:30 – Custom snippet views

  • インテントの戻り値型に ShowsSnippetView を追加し、カスタム SwiftUI ビューを返す
    • EventSnippetView を返すことで Siri のデフォルトカードをアプリ独自のデザインに置き換え

22:30 – Delete events

  • DeleteEventIntent は最もシンプル(イベント+繰り返し用のオプショナルなスパン)
  • 確認や曖昧さの解消は Siri が自動的に処理する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です