WWDC26:Explore advanced App Intents features for Siri and Apple Intelligence

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

  • DisplayRepresentationtitlesubtitleimage を設定すると応答画面や 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 モディファイア:複数エンティティが存在するビュー内の特定要素に付与
    • コレクションアノテーション:リストの選択状態をエンティティ ID にマッピング
      • .appEntityIndentifier(forSelectionType:) で選択IDを返し、画面外の選択肢に対してもアノテーションすることが可能
    • カスタムキャンバスアノテーション:独自描画領域内のエンティティを登録
  • これにより Siri が「このイベント」「あの曲」などの参照を解決できる

20:51 – Leverage existing integrations

  • ユーザー通知 UNMutableNotificationContent、Now Playing、Alarm Kit の設定にエンティティを添付可能
    • content.appEntityIdentifiersEntityIdentifier の配列を設定
    • Now Playing では最も具体的なものから順に複数の EntityIdentifier を指定
    • Alarm Kit の AlarmConfigurationappEntityIdentifier パラメータとして渡す