App Schema によって Siri と自然言語でアプリコンテンツとのインタラクションを実現する方法のコードベース解説。前回前々回の良い復習になった。
- WWDC26:Explore advanced App Intents features for Siri and Apple Intelligence
- WWDC26:Build intelligent Siri experiences with App Schemas
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を作成idはUUID型で指定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二よりこれらの構造を理解
- Siri は
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:イベントリストの各行に付与.userActivity(EntityIdentifier付き):詳細ビューに付与
- 「このイベント」「3 番目のイベント」のようなタイトルを言わない参照が解決できるようになる
17:18 – Create events with Siri
calendar.createEventスキーマに準拠したcreateEventIntentを実装- パラメータ型を設定し
@MainActor@Dependencyを追加 perform()内でスキーマのパラメータ(場所のユニオン値、繰り返しルール)を解決してEventEntityを返す
- パラメータ型を設定し
- 自然言語の解釈・確認・曖昧さの解消は Siri が担当
19:24 – Update events
UpdateEventIntentはCreateEventIntentと対称的な構造で、パラメータはオプショナルIntentParameterのvalueStateが重要なポイント.set(値あり):変更を意図.set(nil):クリアを意図.unset:リクエストに含まれていない(変更しない)
21:30 – Custom snippet views
- インテントの戻り値型に
ShowsSnippetViewを追加し、カスタム SwiftUI ビューを返すEventSnippetViewを返すことで Siri のデフォルトカードをアプリ独自のデザインに置き換え
22:30 – Delete events
DeleteEventIntentは最もシンプル(イベント+繰り返し用のオプショナルなスパン)- 確認や曖昧さの解消は Siri が自動的に処理する