Siri のレスポンスを App Intents によってカスタマイズする方法。Spotlight のセマンティックインデックスによって、ざっくりした指示でもアプリコンテンツに対してインタラクションできるのは良さそう。
Explore advanced App Intents features for Siri and Apple Intelligence
0:00 – Introduction
- Siri および Apple Intelligence との連携を洗練させるための高度なテクニックを解説
- 扱うテーマ:Siri 会話のカスタマイズ、コンテンツ検出の改善、システム連携の活用
1:59 – Customize how Siri responds
- Siri が返すレスポンスを、App Intents によって制御、カスタマイズし洗練させる
- 空の結果を返すことで Siri に「見つからなかった」と応答させられる
ProvidesDialogプロトコルで応答文をカスタマイズIntentDialog(full:supporting:)で詳細な応答文(フル文字列)と短い応答文(サポート文字列)を使い分け- AirPods など音声読み上げではこのフル文字列が読み上げられる
$label.requestValue(...)でインテント実行途中に追加情報をユーザーに要求可能(e.g. 既に実行中のアラームラベルが存在していた場合、別の命名をするか尋ねる)
4:20 – Visual responses
DisplayRepresentationでtitle、subtitle、imageを設定すると応答画面や Spotlight に反映されるShowsSnippetViewプロトコルで SwiftUI 製のカスタムスニペットビューを返すことが可能- アプリ独自のデザインで Siri の結果カードを表現できる
6:22 – Interaction donations
- Siri がインテントを呼び出す前に追加の質問を挟むことが可能(e.g. メッセージ送信先を指定した時、コンタクトの類似した名前のうち誰が対象かを尋ねる)
IntentDonationManager.shared.donate(intent:result:)でユーザーの UI 操作をシステムにドネート- Apple Intelligence がユーザーの好みを学習し、継続中のアクティビティを追跡できるようになる
- 過剰にドネートされるとシステムはそれらを無視することがある
- システムインタラクション(Shortcuts 経由など)は自動的にドネートされる
9:46 – Confirmations and entity ownership
- 副作用を持つインテントは Siri が自動的に確認を求める(e.g. 共用イベントの削除行為など)
OwnershipProvidingEntityプロトコルで所有権の状態を Siri に伝えるownershipプロパティで.unknown(自分のみ)や.shared(他のユーザーも関係)を返す、これに従って Siri がユーザーに確認を促すか判断する- 所有権情報を最新に保つことで Siri の確認フローが適切に動作する
11:59 – Semantic index with IndexedEntity
IndexedEntityに準拠しindexAppEntitiesで Spotlight へのインデックスを実装CSSearcableIndex.indexAppEntities(_:)でセマンティックインデックスが入力- 意味ベースの検索でコンテンツが見つかるようになる
- インデックスを最新に保つ仕組みと再インデックスのサポートが重要
- ユーザーがコンテンツを追加したらインデックスを作成
- 主要なプロパティが更新されたら再インデックス
- コンテンツを削除したら、インデックスからもエントリを削除
IndexedEntityQueryを採用することで、再インデックスをサポートできる- ただし Core Spotlight レベルの API で再インデックスに対応していれば不要
13:32 – Structured search with IntentValueQuery
- 大規模・サーバーサイド・頻繁に変化するコンテンツには
IntentValueQueryを使用- e.g. アルバムはインデックスするが、含まれる曲はインデックスしない
values(for:)で構造化された検索入力を複数のエンティティ型にマッピング
AudioSearchのような入力型で検索クライテリアを受け取り、結果を返す
15:27 – In-app search
system.searchInAppスキーマを採用したAppIntentを実装すると、Siri 検索をアプリ UI で再実行可能- ドメイン採用やインデックス化の有無に関わらず利用できる汎用的なアプローチ
perform()内でナビゲーション状態を書き換えてアプリの検索画面を開く
16:22 – Onscreen awareness
- 表示中のコンテンツをエンティティに接続する 4 つのアプローチ
NSUserActivity:ビュー全体に単一のプライマリエンティティを関連付け- View Annotation API
.appEntityIdentifierモディファイア:複数エンティティが存在するビュー内の特定要素に付与
- View Annotation API
- コレクションアノテーション:リストの選択状態をエンティティ ID にマッピング
.appEntityIndentifier(forSelectionType:)で選択IDを返し、画面外の選択肢に対してもアノテーションすることが可能
- カスタムキャンバスアノテーション:独自描画領域内のエンティティを登録
- これにより Siri が「このイベント」「あの曲」などの参照を解決できる
20:51 – Leverage existing integrations
- ユーザー通知
UNMutableNotificationContent、Now Playing、Alarm Kit の設定にエンティティを添付可能content.appEntityIdentifiersにEntityIdentifierの配列を設定- Now Playing では最も具体的なものから順に複数の
EntityIdentifierを指定 - Alarm Kit の
AlarmConfigurationにappEntityIdentifierパラメータとして渡す












