-
App SchemaによるインテリジェントなSiri体験の構築
App Intentを活用して、アプリのコンテンツやアクションをSiriと連係させましょう。App Entityによるデータのモデル化、パワフルなシステムアクションを可能にするためのApp Schemaの導入、Apple Intelligenceによる自然言語インタラクションのサポートについて解説します。セマンティック検索の実装、複数アプリ間でのアクション実行、オンスクリーン認識やコンテンツ転送によるコンテキストに即した体験の構築のための方法を確認するほか、高速で信頼性の高いSiri体験を実現するためのベストプラクティスとテストツールも紹介します。
関連する章
- 0:00 - Introduction
- 1:06 - What's new in Siri
- 4:06 - Contributing content with App Entities
- 6:21 - Entity resolution and IndexedEntity
- 9:49 - Making actions available
- 12:03 - Adopting a schema domain in UnicornChat
- 15:39 - Moving content across apps
- 16:00 - Working across apps: onscreen awareness
- 21:09 - Best practices
- 24:18 - Testing your integration
- 26:21 - Next steps
リソース
- Integrating your messaging app with Apple Intelligence
- Donating your app’s data and actions to the system
- Making app entities available in Spotlight
- Making actions and content discoverable by Apple Intelligence
- Providing contextual cues to Apple Intelligence and Siri
- Apple Intelligence and Siri AI
- Messages
- App schema domains
関連ビデオ
WWDC26
-
このビデオを検索
こんにちは Dan Niemeyerです Swift Intelligenceチームのエンジニアです。 今日はアプリをSiriに連携させる 方法を紹介します。 Apple Intelligenceが支える 新機能を使って実現します。 '27のリリースでSiriは より高機能でパーソナルになりました。 App Intentはその実現を支える 基盤フレームワークです。
今日の内容を紹介します。 まずSiriとApp Intentの 新機能からです。 Siriがアプリのコンテンツを 理解する方法 コンテンツを理解したSiriが アクションを取れるようにする方法
トークの最後にはアプリ間連携の ユースケースを紹介します。 アプリ間の連携について 例えばSiriに妻の飛行機チケットを テキストで送るよう頼む またはこの写真にシネマティック フィルタを適用する場合などです。 アプリをSiriに連携させる ベストプラクティスも紹介します。 システムがアプリの機能を理解できるよう 拡張する方法です。
内容が多いですが さっそく始めましょう。
'27のリリースでSiriは 大きな進化を遂げました。 Apple Intelligenceに支えられ 日常の作業でより創造的で 生産的になれるよう支援する パーソナルインテリジェンス プラットフォームです。 デベロッパとしてApple Intelligenceに 参加する手段は App Intentフレームワークです。 App IntentはSiriと Apple Intelligenceを統合するための 基盤となります。 アプリの機能と管理する コンテンツを体系的に記述する 手段を提供します。 今日紹介することはすべて App Intentの上に構築されています。
App Intentが初めての方には これらの動画から始めることを 強くお勧めします 基礎をより詳しく解説しています。
今年Siriは3つの重要な面で より強力になりました。 Siriはアプリのエンティティに アクセスできるようになりました。 アプリ内の真に意味のある コンテンツです。 「次のミーティングはいつどこですか?」 のような質問に対して Siriが直接答えられるようになります。 アプリにおけるミーティングとは何か どのミーティングが関連するか 返すべきプロパティは何かを理解します。 時刻や場所などです。
Siriはアプリのインテントを使って アクションを取れます。 例えば「最新のレポートを Maryに送って」と言うと 声だけでメールが送れます。 インテントはアプリが対応する アクションを記述します。 必要なパラメータと 安全な実行タイミングも含みます。 Siriは言語理解を担当します。 アプリはアクションに専念できます。
Siriは画面上のコンテキストも 理解できます。 例えば「このテキストを説明して」 「この商品のレビューを見せて」 などの要求に対応します。 画面のコンテンツを記述する エンティティでビューをアノテートすると Siriはどのコンテンツが 意味あるものかを理解し どのエンティティを表し どのアクションが適用されるかも把握します。 よりコンテキストに応じた 会話体験が得られます。 自然で驚くほど 強力な体験です。
Siriの新機能として コンテンツの検索 アクションの実行 画面上のコンテンツ理解を紹介しました。 これを実際のアプリで 具体化しましょう。
このビデオではUnicornChatという サンプルアプリを使って進めます。
UnicornChatはメッセージングアプリで 架空のユニコーンキャラクターと チャットできます。 BubblesやFlare そしてGlowなどです。 今日のコンセプトを示すのに 十分な機能を備えています。
メッセージングアプリですが 同じアイデアは 多くの他のドメインのアプリにも 適用できます。 Apple Developerウェブサイトから サンプルをダウンロードして 一緒に進められます。 新機能と使用するアプリを 確認したところで これらの機能をアプリに 導入する方法を話しましょう。 App Intentを活用したすべての体験の 中心にある概念は 1つ — App Entitiesです。 AppEntityはアプリ内コンテンツの 構造化された表現です。 具体的に考えると アプリが毎日扱うデータを 思い浮かべてください。
カレンダーアプリなら 各イベントがエンティティです。 メールアプリなら 各メッセージがエンティティです。 フォトアプリなら各写真と 各アルバムがエンティティです。
App Entitiesは3つの重要なことを 記述します。 何であるか 識別方法 そして タイトルなど重要なプロパティです。 日付またはテキストなどです。
新しいデータモデルではありません。 既存のコンテンツを記述するための システムが理解できる方法です。
エンティティのモデリングは 最初のステップですが それだけではSiriが 見つけたり話すには不十分です。 Siriがエンティティとは何か どのカテゴリを表すかを理解するには エンティティはAppSchemaに 準拠する必要があります。
App SchemaはSiriに 共通概念の理解をあらかじめ与えます。 メッセージや連絡先 書類などです。 エンティティがスキーマに準拠すると Siriはすでにその推論方法を 理解しています。
アプリをブラックボックスとして 扱う代わりに Siriはユーザーが話している内容を 理解できます。 UnicornChatのアプリ内の名詞は Contact Conversation Messageです。 3つとも App Schemaに準拠した App Entitiesとしてモデル化されています。
Siriが次のような質問を 理解できる理由です。 「Flareの最後のメッセージを表示」 連絡先の1人ですが 「GlowとUnicornChatを開く」など 別のユニコーンの友達です。
コンテンツをApp Entitiesとして モデル化したら 次の疑問はSiriが正しいものを どう見つけるかです。 エンティティ解決とはSiriがユーザーの 発言を解決するプロセスです。 アプリ内の実際のApp Entitiesに 変換することです。
例えばユーザーが 「GlowとUnicornChatを開く」と言ったとき SiriはGlowが特定のユニコーンを 指すと把握し 一致する連絡先を見つけ エンティティを特定します。 プロパティの値と合わせて 名前や識別子などを含め システムが使用できるようにするためです。 しかし人々は常に 正確な名前で尋ねるわけではありません。 概念や説明で話します。 例えば次のように言うとき 「Carmelの最高のウィンドサーフィン」 完全一致のテキストを 探しているわけではありません。 意味を表現しています。 そのような体験を実現するには Siriは文字列照合以上が必要です。 セマンティック検索が必要です。 まさにそれがIndexedEntityで 実現できます。
エンティティ解決の主な手段は IndexedEntityを採用することです。 採用するとアプリのエンティティは システムのセマンティックインデックスに登録されます。 Siriはテキストだけでなく 意味に基づいてマッチングでき エンティティ間の関係も理解し コンテンツに対する 質問にも答えられます。 例えば「映画についてFlareと やりとりしたメッセージを表示」 これは文字列照合ではありません。 Siriは映画のタイトルを 参照するメッセージを見つけられます。 UnicornChatのインデックス済みメッセージに セマンティッククエリを実行するからです。 その動作を実現するには スキーマ化されたエンティティを IndexedEntityプロトコルに準拠させます。
indexingKeyはSpotlightに メッセージ本文など 検索対象にすべきプロパティを指定します。
インデックス後はSiriがコンテンツを 検索して推論し 単にアイテムを取得するだけでなく 質問への回答にも使えます。
IndexedEntityによりセマンティック マッチングによる最高のSiri体験が実現し フォローアップの質問が減り 自然言語理解が向上します。 ただしすべてがインデックス可能 なわけではありません。 データセットが大きかったり サーバーに存在したり 事前インデックスが難しいほど 頻繁に変化する場合もあります。 そのような場合は EntityStringQueryが使えます。 StringQueryを使うと Siriがユーザーの入力を渡します。 アプリが一致するエンティティを 見つけて返す責任を担います。
セマンティック理解は得られませんが 完全なコントロールが得られます。 アプリのエンティティを どのように検索してマッチングするかを制御できます。
まとめると アプリのコンテンツをApp Entitiesとして モデル化することから始めます。
各エンティティをAppSchemaに準拠させ Siriがどのような種類のものかを 理解できるようにします。 データのインデックスが可能なら IndexedEntityを採用します。 インデックスが難しい場合は EntityStringQueryを使います。 これにより質問への回答など 強力な体験が実現します。 コンテンツの即座な検索も可能です。 エンティティだけでは 単なる情報にすぎません。 エンティティとアクションを組み合わせると 本当に面白くなります。
App Intentはアプリがシステムに アクションを公開する手段です。 ただしすべてのアクションが 同じように扱われるわけではありません。 これを2つに分けて 説明します。
App Intentを定義するとそのアクションは システム全体に表示されます。 ShortcutsやSpotlight Widgetsなど様々な場所です。 Siriがなくてもアプリのアクションを 発見して実行できます。 多くの場所で可能です。
アクションの内容を記述し パラメータを定義して 動作を実装します。 システムがその表示や提案を担当し システム体験への組み込みも行います。 これは非常に強力で 大きなメリットをもたらします。 アプリとユーザーの両方にとってです。 さらにいくつかのステップを踏むことで さらに大きな価値を提供できます。 アクションをSiriに対応させます。
エンティティがApp Schemaを使って 理解されるように アクションもスキーマを使って Siriから実行可能になります。 スキーマをApp Intentの 特化版と考えてください。 依然としてApp Intentですが Siriが処理できる形に整えられています。
スキーマはSiriが理解できる アクションの種類を定義し 期待される構造と アクションが自然言語に 対応する方法を定義します。 これによりSiriが次のような コマンドを確実に処理できます。 「Maryにメッセージを送って」や 「フォーカス用プレイリストを再生して」 個別のスキーマは 個別のアクションを定義しますが アプリは通常セット全体が必要です。 そのためスキーマは AppSchemaドメインにグループ化されます。
各ドメインはタスクの カテゴリを表します。 メール フォト メッセージなどです。 ドメインを統合すると 事前定義されたApp Schemaの セットを実装します。 アプリの機能にマッピングすることで Siriはすぐに そのドメインでアプリについて 話せるようになります。 ドメインはアプリとSiriの間の カテゴリ別コントラクトと考えてください。 アプリでできること 利用可能な アクションをSiriに伝え システムがどう応答すべきかを示します。
App Schemaの詳細については WWDC24のビデオをご覧ください。
一般的なApp Intentと シリーズ固有のApp Schemaの違いを理解したところで これらのドメインを採用して 実際に試してみましょう。 UnicornChatに組み込んで 端から端まで接続します。
前回と同様 すべてはエンティティから始まります。 UnicornChatではメッセージ送信に 必要な2つのものをすでにモデル化しています。
受信者を表すContactと 名前や識別子などの プロパティを公開します。
そしてメッセージ本文や 送信者などを持つMessageです。
これらはApp Entitiesで メッセージの宛先と 送信内容をSiriに伝えます。 これらのエンティティをアクションに 接続する方法を示します。 App Schemaを採用することで実現します。
Xcodeではスキーマ名を 入力することから始めます。 Xcodeは利用可能なすべてのApp Schemaを把握しており ドメイン別にグループ化されています。 Autocompleteで 目的のものを選択できます。
メッセージング機能を 構築しているので messagesドメインから sendMessageスキーマを選択します。
カスタムのインテント構造を 考案する代わりに Siriがすでに理解している スキーマを採用し UnicornChatの既存ロジックに マッピングします。 アクションの内容と必要なパラメータを Siriに伝えます。 受信者やメッセージ内容など 何かが不足している場合に ユーザーを誘導する方法も伝えます。
スキーマパラメータをマッピングする のが私たちの仕事です。 UnicornChatの既存の メッセージングフローにマッピングします。 まずパラメータを処理します。
次にUnicornChatのインターフェースに 渡して 実際にメッセージを送信します。
最後に送信したメッセージを App Entityとしてシステムに返します。
以上です。
このアクションはApp Intentとして 実装されているため システム全体で利用できます。 またmessagesドメインのApp Schemaに 準拠しているため Siriが直接実行できます。 自然言語処理を自分で 実装する必要はありません。 実際に動かしてみましょう。
「UnicornChatでGlowにメッセージを送って 'おすすめの映画は?'と伝えて」
SiriはAppEntityクエリを使って Glowを解決し インテントを起動して送信します。
アプリを開かずにすべて完了します。
これがApp Schemaの力です。 エンティティを用意したら接続します。 明確に定義されたアクションに接続すれば あとはSiriが処理します。
まとめるとApp Intentは システムにアクションを公開します。 App SchemaはそのアクションをSiriが 理解できるようにします。 messagesなどのApp Schemaドメインは スキーマをパッケージ化して 強力なエンドツーエンド体験を提供します。 ドメインを採用するとSiriがアプリの言語を 流暢に話せるようになります。
ここまでSiriがコンテンツを理解し アプリ内でアクションを取る方法を 説明しました。 しかし現実の多くのリクエストは 複数のアプリにまたがります。
あるアプリで始まり 別のアプリで続き 別の場所で完了します。 例えば「Hey Siri BubblesからのこのリプライをメールでWifeに送って」 このような体験は 2つの機能を組み合わせます。 ユーザーが見ているものを理解すること そのコンテンツを別のアプリに 移すことです。
これを2つに分けて説明します。 まずSiriはBubblesからのこのリプライが 何を指しているかを理解する必要があります。 画面認識です。 次にSiriはそのコンテンツを 別のアプリに渡して アクションを実行させる必要があります。 コンテンツ転送です。
それぞれ順に見ていきましょう。 画面認識を有効にするには 画面に表示されているものをアプリが 接続する必要があります。 システムが理解できる 構造化情報にです。 その中心にあるのがApp Entitiesです。 ビューがエンティティに関連付けられると Siriは「このメッセージ」などの 参照を解決できます。 「そのConversation」なども 明示せずに解決します。 画面コンテンツをアノテートするAPIが 2つあります。 それぞれ異なる目的を持ちます。 画面に主要なコンテンツが 1つある場合はUserActivityを使います。 書類の閲覧やメッセージの作成などです。
複数の意味あるアイテムが同時に 表示される場合はViewアノテーションを使います。 Conversationのメッセージや リスト内のアイテムなどです。
実現方法を見てみましょう。 このリストの各行は アプリの実際のデータを表します。 UnicornChatではメッセージです。 各メッセージ行は対応する メッセージエンティティでアノテートされます。 これにより画面上のものとインテントに 使うエンティティを明示的に接続します。 インテントにすでに使用しているものです。 ユーザーはこのように言えます。 「このメッセージを編集」や 「最後のメッセージを転送」など Siriはビューからエンティティを直接解決し 強力なアプリ内体験を実現します。 しかし真の力はアノテーションと コンテンツ転送を組み合わせたときです。
コンテンツ転送により 他のアプリがエンティティに対してアクションを取れます。 TransferableでエンティティをエクスポートしてSiriが コンテンツの表現方法を システムに伝えます。 他のアプリが理解できる形式でです。 例えば「妻にこのConversationをテキストで送って」 「このメッセージを要約して」などです。
TransferableとIntentValueRepresentationを 採用することで実現します。 UnicornChatではContactEntityを IntentPersonとしてエクスポートします。 エクスポート後はシステムがそのコンテンツを 他のアプリのアクションに渡せます。 「この連絡先に電話して」などの ユースケースが実現します。 アプリは次に何が起こるかを 知る必要はありません。 コンテンツを正確に記述するだけで 大丈夫です。
コンテンツがアプリに入る場合 通常2つの可能性があります。 そのコンテンツが既存のものを 参照している場合 または完全に新しいものを 表している場合です。 アプリがどちらのパスを取るかを 決めます。
既存コンテンツとマッチングするなら IntentValueQueryを使います。 新しいものを作成するなら transferRepresentationで importingを使います。
入力コンテンツが既存のApp Entityに 解決されるべき場合はIntentValueQueryを使います。 アプリ内のものです。 概念的にはエンティティクエリと 非常に似ています。 ただしスタンドアロンのエンティティ解決ではなく インテントパラメータを対象とします。
この例ではUnicornChatが別のAppから IntentPersonを受け取り 既存のContactEntityとの マッチングを試みます。 コンテンツがすでにアプリ内に存在する場合や 既存データから選択したい 場合に最適です。 本質的に 「この入力値が自分のどのエンティティを 指しているか?」と言っています。
入力コンテンツでアプリ内に新しいものを 作成すべき場合はIntentValueRepresentation のimportingを使います。 既存エンティティへの解決ではなく 入力値を変換して 全く新しいApp Entityを作成します。 UnicornChatではこれにより 必要に応じてIntentPersonから 新しいユニコーンを作成できます。 ユーザーの視点では コンテンツがそのまま動作します。 しかしアプリはコンテンツの 保存と管理方法を制御し続けます。
つまりコンテンツをインポートする際 コンテンツがすでにアプリに 存在する場合は 解決します。 存在しない場合はインポートします。 インテントとワークフローに応じて 両方を使うアプリも多くあります。
まとめると画面認識によりSiriはユーザーが 見ているものを理解します。 コンテンツ転送によりそのコンテンツを アプリ間で移動できます。 組み合わせることで 強力なマルチステップ体験が実現します。 すべてApp Entitiesを基盤として App IntentとSchemaの上に構築されています。 エンティティ アクション アプリ間連携を カバーしたところで ベストプラクティスを説明します。 動作させること以外にも いくつかのプラクティスがあります。 Siriとアプリをより良く連携させ 長期的な堅牢性を高めます。 個別のスキーマやAPIは 独立して採用できますが 優れたSiri体験はこれらの 組み合わせにかかっています。 良いニュースは 一人で考えなくていいことです。 ツールが途中で サポートしてくれます。 デモで説明します。
Xcodeに戻って 前回の続きから始めましょう。 前回のデモではUnicornChatに sendMessageスキーマを採用しました。 これは正常に動作します。
Siriでメッセージが送れます。 では今度はビルドしてみましょう。
ビルドエラーが発生しました。 XcodeはsendMessageを採用したが 関連するdraftMessageスキーマを 採用していないと通知しています。 一部のSiriシナリオでは 完全な体験を提供するために 複数のスキーマが必要なため重要です。 これは単なるコンパイラエラーではなく 設計のヒントです。 XcodeはアプリがSiriでメッセージを 送れるなら メッセージの下書き方法も 必要だと知っています。 特に確認が必要な場合はです。 実行時に無音で失敗する代わりに ビルドシステムが早期に表示します。
エラーをクリックすると XcodeがFix-itを提示します。
XcodeがdraftMessageスキーマの 採用サンプルを生成します。 インテント定義が得られます。
必要なパラメータ とスタブ実装です。 すべて正しく配線されています。 あとはアプリ固有の部分を 埋めるだけです。 まずインテントを エンティティに接続します。
次に依存関係を注入します。
続いて入力を処理します。
最後にメッセージ作成ビューを 開きます。
このアクションはUIの状態を変更するため @MainActorで実行する必要があります。
再度ビルドすると ビルドが成功します。
スキーマの採用が完了しSiriが メッセージングフロー全体を ユーザーに案内するために 必要なものがすべて揃いました。
重要なことを覚えておいてください。 Siri体験が複数のスキーマに 依存している場合 Xcodeが教えてくれ 不足しているものを示し 残りのステップを 生成するサポートをします。 完全で高品質な統合を より簡単に構築できます。 スキーマを採用したら テストが重要になります。 最初の出発点は AppIntentsTestingです。 インテントを完全に分離して テストできる新しいテストフレームワークです。 Siriなしで実行できます。 Siriは不要です。 インテントを起動して パラメータを渡し 他の統合テストと同様に 結果を検証できます。 開発の早い段階でビジネスロジックを 検証する最速で最も信頼性の高い方法です。 開発初期に活用できます。
"Validate your App Intents adoption with AppIntentsTesting"動画で詳しく学べます。
ロジックが固まったら 次はShortcutsアプリです。 Shortcutsはインテントのための 構造化UIを提供します。 パラメータの確認や 入力の調整ができ アクションがユーザーに どのように表示されるかを理解できます。 インテントの形を 検証する場所です。 何をするかだけでなく 設定と公開方法もです。 次はSpotlightです。 Spotlightはコンテンツ統合を 検証する場所で エンティティが正しくインデックス化され 発見可能でリンク可能かを確認します。 Siriがアクションを試みる前に 適切なデータを見つけられるかを確認します。 アクションを実行する前の確認です。
最後にSiriで完全な体験を テストします。 すべてが統合される場所です。 自然言語 エンティティ解決 画面コンテキスト そしてアプリ間ワークフローです。 エンドツーエンドのテストにより すべてが連携して動作することを確認します。 ユーザーの期待通りに動作します。
ここまでApp Entitiesで コンテンツをモデル化する方法を説明しました。 App IntentとApp Schemaを使って アクションを公開する方法も アプリ間ワークフローを有効にする方法も ツールを使って自信を持って ビルドとテストをする方法もです。 では具体的な次のステップで まとめましょう。
始め方はこちらです。 エンティティをモデル化してSpotlightに インデックス化しSiriがコンテンツを見つけられるようにします。 アプリのコア体験に合った App Schemaドメインを採用します。 Transferableを採用して コンテンツのインポートとエクスポートを有効にします。 AppIntentsTestingで早めに 頻繁にテストを行い 次にShortcuts Spotlight Siriでテストします。 これらのAPIはすべて今日から利用可能で スケールするよう設計されています。 Siriが進化し続けるにつれて アプリと共に成長します。
Siriはより強力でコンテキストに応じ より高機能になっています。 App Intentはそれを可能にする 基盤です。 アプリをSiriに対応させることは 音声サポートを追加するだけではありません。 アプリをより速く よりアクセスしやすくシステム全体で 使いやすくすることです。 ご視聴ありがとうございます 皆さんの作品を楽しみにしています。
-
-
7:59 - Contributing message content to Apple Intelligence
// Contributing message content to Apple Intelligence @AppEntity(schema: .messages.message) struct MessageEntity: IndexedEntity { // The text content of the message @Property(indexingKey: \.textContent) var body: AttributedString? } -
8:36 - An interface that locates entities using arbitrary string input
// An interface that locates entities using arbitrary string input struct ContactQuery: EntityStringQuery { func entities(matching string: String) async throws -> [ContactEntity] { let predicate = #Predicate<Person> { person in person.name.localizedStandardContains(string) } let descriptor = FetchDescriptor<Person>(predicate: predicate) let matches = try modelContext.fetch(descriptor) return matches.map(\.entity) } } -
17:19 - Working across apps - View annotations
// Working across apps - View annotations List { ForEach(messages) { message in MessageRow(message: message) .appEntityIdentifier( EntityIdentifier( for: MessageEntity.self, identifier: message.id ) ) } } -
18:18 - Working across apps - Exporting content to another app
// Working across apps - Exporting content to another app extension ContactEntity: Transferable { static var transferRepresentation: some TransferRepresentation { IntentValueRepresentation( exporting: \.person ) } } -
19:21 - Working across apps - IntentValueQuery
// Working across apps - IntentValueQuery struct ContactEntityQuery: IntentValueQuery { func values(for input: [IntentPerson]) async throws -> [ContactEntity] { let names = input.map(\.displayName) let descriptor = FetchDescriptor<Contact>() let contacts = try model.mainContext.fetch(descriptor) let matches = contacts.filter { contact in names.contains(where: { name in contact.name.localizedStandardContains(name) }) } return matches.map(\.entity) } } -
20:00 - Working across apps - IntentValueRepresentation
// Working across apps - IntentValueRepresentation extension ContactEntity: Transferable { static var transferRepresentation: some TransferRepresentation { IntentValueRepresentation(exporting: \.person, importing: { intentPerson in let contact = Contact(importing: intentPerson) ContactManager.shared.contacts.append(contact) return contact.entity }) } }
-
-
- 0:00 - Introduction
How App Intents bring your app to Siri, made more capable, contextual, and personal by Apple Intelligence in the 27 releases. Previews the agenda: what's new, contributing content, making actions available, working across apps, and best practices.
- 1:06 - What's new in Siri
Siri gains three capabilities built on App Intents: accessing your app's entities, taking action through your intents, and understanding onscreen context. Introduces the UnicornChat sample app used throughout the session.
- 4:06 - Contributing content with App Entities
Model your app's content as App Entities (what a thing is, how it's identified, and which properties matter), then conform them to an App Schema so Siri understands the category of content.
- 6:21 - Entity resolution and IndexedEntity
How Siri resolves spoken references to real entities. Adopt IndexedEntity for semantic search and content Q&A over indexed content, using indexingKey to mark searchable properties, or EntityStringQuery when data can't be indexed ahead of time.
- 9:49 - Making actions available
App Intents expose actions across Shortcuts, Spotlight, and Widgets. Conforming intents to App Schemas, and grouping them into App Schema domains, makes those actions executable by Siri through natural language.
- 12:03 - Adopting a schema domain in UnicornChat
End-to-end walkthrough of adopting the Messages domain's sendMessage schema: mapping schema parameters onto UnicornChat's messaging flow and returning the sent message as an entity, so Siri can send messages without opening the app.
- 15:39 - Moving content across apps
Export entities with Transferable and IntentValueRepresentation so other apps can act on them. On import, use IntentValueQuery to match existing content or IntentValueRepresentation(importing:) to create something new.
- 16:00 - Working across apps: onscreen awareness
Requests that span apps rely on onscreen awareness. Connect views to App Entities, via NSUserActivity for a single primary item or view annotations for multiple visible items, so Siri can resolve references like "this" and "that."
- 21:09 - Best practices
Design for complete Siri conversations by adopting full schema sets. Xcode surfaces missing related schemas (for example draftMessage alongside sendMessage) at build time with Fix-Its.
- 24:18 - Testing your integration
Validate progressively: App Intents Testing for business logic in isolation, then the Shortcuts app for intent shape, Spotlight for content indexing, and finally Siri for the full end-to-end experience.
- 26:21 - Next steps
Model and index entities, adopt the App Schema domains matching your app, enable content transfer with Transferable, and test early with Shortcuts, Spotlight, and Siri.