ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
App Intentの新機能
App Intentの改善点と強化点をご紹介し、アプリの機能をSiriやその他の新しい機能と連携させるうえで、このフレームワークがどのように役立つかを説明します。Transferable API、File Representations、Item Providers、Spotlight Indexingを使用してAppleプラットフォームでのエンティティの有用性を高め、Siriやショートカットアプリでパワフルな機能を利用できるようにする方法をご紹介します。URL Representable Entitiesと柔軟なScene APIを利用し、インテントを通じてユーザーとアプリの結び付きを深めましょう。エラー処理、延期されたプロパティ、関連付けされた列挙型のための新しいAPIを使用してエンティティとインテントのモデルを作成する、新しい手法もご紹介します。
関連する章
- 0:00 - Introduction
- 1:16 - Spotlight integration
- 5:00 - Entities and files
- 11:41 - Universal links
- 14:24 - Developer improvements
リソース
- Accelerating app interactions with App Intents
- App Intents
- Forum: Machine Learning and AI
- Making actions and content discoverable and widely available
関連ビデオ
WWDC24
WWDC23
WWDC22
WWDC21
-
ダウンロード
App Intentチームのエンジニア Kennyです
App Intentは ショートカット Spotlight ウィジェット そして アクションボタンや 新しいApple Pencilのスクイーズなど 多くの機能を含む素晴らしい体験を アプリにもたらしました
そして今年 App Intentは Apple Intelligenceと コントロールの体験の構築における 中核となります
App Intentフレームワークは システムがアプリのエンティティを 理解して使用するための 新しい方法を提供し App Intentをさらに使いやすくします
広範な内容を説明しますので 早速始めましょう アプリのエンティティを Spotlightにインデックス化する方法 そして Siriがコンテンツを詳細に 理解できるようにする方法を説明します
アプリのエンティティを 特定の種類のコンテンツに変換したり アプリのエンティティとして ドキュメントを直接公開したりできます
App Intentの型を ユニバーサルリンクとして公開することで デバイス上でアプリ内の必要な場所に 直接移動できます
App Intentをより簡単に利用するための デベロッパ体験の向上についても説明します App Intentを初めて扱う方は まず 「Bring your app's core features to users with App Intents」をご覧ください
Spotlightは関連するコンテンツを見つける 最適な場所です Spotlightは ユーザーがよく使用する アプリを認識し 候補として提案します それらのアプリに基づき よく使用する アクションへ迅速にアクセスできます
現在の天気や 最近の検索結果を表示することもあります
Spotlightには強力な検索機能もあり 特定のメモなどを すばやく見つけることができます
トップヒットのアプリショートカットでは アプリの便利な機能を App Intentを通じて簡単に提供できます
今年追加される新しいAPIを使用すると Spotlightに アプリのエンティティの インデックスを作成し 新しい強力なセマンティック検索を アプリのエンティティに導入できます 新しいIndexedEntityプロトコルから 始めましょう CSSearchableIndexでは CSSearchableItemにより Spotlightに アプリの情報のインデックスを作成できます CSSearchableItemには 指定した情報を 拡張する属性が設定されています
新しいIndexedEntityでは アプリのエンティティのインデックスを CSSearchableIndexに簡単に作成し 属性セットを カスタマイズすることもできます これにより エンティティが Spotlightの検索結果に表示され Siriによるエンティティ理解と 検索が向上します
私の家族はハイキングが大好きです そこで お気に入りのトレイルを記録する アプリを開発しています アプリを開かずに Spotlightでトレイルを 検索できたらとても便利でしょう そこで IndexedEntityのサポートを TrailEntityに追加します
まず 新しいIndexedEntityプロトコルへの 準拠をTrailEntityに追加します
次に アプリのinitメソッドで CSSearchableIndexの indexAppEntitiesを呼び出して データマネージャからすべての Trailエンティティをインデックスします これで TrailEntityのコンテンツを Spotlightに提供できます 動作を確認しましょう まず アプリを起動します エンティティのインデックスを作成する 新しいコードが実行されます
次に Spotlightで お気に入りのトレイルを検索します トレイルのコンテンツが 検索結果に表示されました
TrailEntityをパラメータとして受け取る OpenTrailIntentがあるので 結果をタップしてアプリ内のをのトレイルに 直接移動できます これについては あとで詳しく説明します
IndexedEntityのデフォルトの実装では DisplayRepresentationのみを使用して 属性セットを設定しますが 属性セットでは Spotlightで役立つ 様々な情報を指定できます 例えば位置情報やキーワードなどです attributeSetを実装して Spotlightに もう少し情報を提供します
まず attributeSetの実装を TrailEntityに提供します
attributeSetをカスタマイズして エンティティに関連する可能性がある プロパティを追加します トレイルの所在する都市や州などです
トレイルでサポートされるアクティビティに キーワードを設定します
より多くの情報をSpotlightに提供すると 検索や理解が向上し より関連性の高い結果が返されます すでに CSSearchableItem APIを使って Spotlightにアプリのコンテンツの インデックスを作成している場合 新しいassociateAppEntityメソッドで インデックスの作成前に AppEntityを 検索可能な項目に関連づけできます これにより 新しいセマンティック検索で AppEntityに関する情報を検索できます
インデックス作成のIndexedEntity APIで 優先順位を設定することもできます 値が大きいほど重要な項目です 例えば これを 使用してお気に入りの項目に ほかよりも高い優先順位を設定できます
CSSearchableItemは単独で 強力な検索機能を提供しますが コンテンツにアクションを実行することは できません アプリのエンティティをインデックス化 することで エンティティに関する 既存の作業結果を活用でき Siriによるエンティティの検索と アクション実行を向上させられます 例えば フライト情報を含むEメールを 検索して 友だちに転送できます 次に デバイスにおけるエンティティの 有用性を高める方法を説明します
AppEntityでは トレイルなど アプリの概念を定義して提供できます
しかし ほかのアプリは その概念を理解できません 代わりに PDFのように どのアプリでも 理解できる標準化された形式で エンティティを表現し Uniform Type Identifierを使用して
ファイルやデータを特定の型として ラベルづけできないでしょうか
実は これを行うことができるAPIは すでにあります Transferableは 共有やデータ転送のために モデルのシリアル化と逆シリアル化する方法を 宣言的に記述する方法です これで アプリのエンティティが転送可能になります
例えば Transferableを使ってAppEntityを 変換し 次の形式でエクスポートできます PDF 画像 リッチテキストです Transferableを使用すると SiriとショートカットがAppEntityを変換し ほかのApp Intentに 新しい値を渡すことができます
これにより コンテンツを 添付ファイルとしてメールに渡したり 画像に変換してフォトライブラリに インポートしたりできます
私のトレイルアプリでは 完了したアクティビティを記録でき それらをActivityStatisticSummary エンティティとして表現します この記録を ほかのアプリにとって 有用なものにするために Transferableのサポートを追加します
Transferableでエンティティを拡張します 静的なtransferRepresentationメソッドを 実装します
Activity Summaryをリッチテキストに 変換するメソッドはすでにあるので DataRepresentationを追加して exportedContentTypeとして .rtf つまりリッチテキストを指定します
Activity SummaryをPNGファイルとして エクスポートするメソッドもあります そこで PNGとしてエクスポートされる FileRepresentationも追加します
Transferableな表現を 定義する順序は重要です 忠実度が最も高いものから 最も低いものの順に指定します 例えば プライベートの Codableな型の表現が最初で リッチテキストやプレーンテキストなどの より忠実度の低い形式が続きます ショートカットで動作を確認しましょう Summarize Activitiesアクションの出力を 取得し Calories Burnedプロパティを Activity Logメモに追加する ショートカットがすでにあります
Transferableを実装したので 出力をエンティティ自体に変更したら どうなるか見てみましょう ショートカットを実行すると Summarize Activitiesの結果が テキストに変換され メモに追加されました
型を画像に変更し
ショートカットをもう一度実行すると PNG表現が使用されることがわかります 見てください 私はデザインチームでも活躍できそうです 現時点では Transferable APIを AppEntityと組み合わせて使用する上で いくつか制限があります コンパイル時に XcodeがTransferableの表現を 理解する必要があるからです 問題がある場合は コンパイラがフィードバックを返します さらに ProxyRepresentationを 使用することができるのは @Property属性を使って AppEntityの プロパティを参照する場合のみです この例では @Property属性があるので nameプロパティを使用できます
descriptionには この属性がないため 使用できません
Transferableについて 詳しく知りたい場合は WWDC22の「Meet Transferable」で Juliaによる説明をご確認ください
次は IntentFileの改善点を使用して コンテンツにアクセスする方法についてです Transferableでエンティティを 様々な形式に変換する方法を説明しました 受信側では これはどう機能するでしょうか 先ほど Activity Summaryを メモに追加する様子をお見せしました AppendToNoteのようなApp Intentは IntentFileパラメータを受け取る時 どのコンテンツタイプが 利用可能かを確認して 必要なタイプをリクエストできます この場合 App Intentは Transferable表現を使用して リクエストされたコンテンツの型に エンティティを変換します これはAppendToNoteの例です attachmentパラメータで サポートするコンテンツの 型を宣言しています これにより Siriやショートカットは 可能な場合 コンテンツを自動的に変換できます
IntentFileのコンテンツに アクセスするには コンテンツを抽出する いずれかの新しいAPIを使います IntentFileがどのコンテンツの型を表すか 確認できます そして 変換を行うURLにアクセスします 先に進む前に コンテンツを表現する もう1つの方法について説明します FileEntity APIは ドキュメントや ファイルを扱うアプリに最適です
TransferableでAppEntityを ファイルやデータに 変換できることを説明しました これは エンティティが データベースやサーバにあるオブジェクトを 表している場合に最適です エンティティ自体がテキストドキュメントや 画像のようなファイルである場合は どうでしょうか このような場合 そのファイルは エンティティの標準的なバージョンとなります 別のアプリでPhotoEntityを使っています PhotoEntityは ディスク上の画像ファイルを表します 私のアプリは SetFavoritePhoto インテントなどの App Intent内の エンティティを理解し使用できますが ほかのアプリは私のエンティティを 認識できず App Intentで使用できません しかし 先ほど説明したように ほかのアプリはIntentFileを通じて ファイルを理解しアクセスできます
FileEntityを使用することで Siriやショートカットで ほかのアプリの ファイルへの安全なアクセスが容易になり そのファイルに直接アクセスできます 例えば 別のアプリの RotateImageIntentは PhotoEntityに対応するファイルに 安全にアクセスしてその場で回転させます
次に FileEntityを実装する例です 他のAppEntityと同様に機能しますが 追加要件として サポートされている コンテンツタイプのリストを提供し
識別子をFileEntityIdentifierに する必要があります
FileEntityIdentifierは URLを 使用して作成できます ファイルがまだ存在しない場合は ドラフト識別子として作成できます FileEntityIdentifierは URLのブックマークデータを使用するので ファイルの移動や名前変更が行われても エンティティは引き続き有効です 私のアプリはPhotoEntity項目を グリッドに表示します ここで 最近追加した2つの項目が グリッドの最下部で 間違った向きで 表示されることに気づきました これをショートカットで解決します PhotoEntityに対してクエリを実行し 今日追加された画像を フィルタリングします さらに 内蔵のショートカットである 回転アクションを使用して クエリの結果に90度回転を適用します ショートカットを実行すると アプリ内の画像ファイルを回転できました アプリに戻ると ファイルの変更が検出され UIが更新されます
これらの新しいAPIは強力です 自分のアプリのエンティティが ほかのアプリで有用なものになり ほかのアプリのエンティティが 自分のアプリで有用なものになるため Siriとショートカットに 新しい可能性をもたらします
次は ユニバーサルリンクについてです App Intentの型と組み合わせて 表現する方法を説明します ユニバーサルリンクを使用すると アプリのインストールの有無を問わず そのアプリのコンテンツにアクセスできます 私のトレイルアプリでは トレイルを開く ユニバーサルリンクをサポートしています これは 特定のトレイルの詳細情報に リンクするURLの例です 「1」は開くトレイルの識別子を示します
これで URLRepresentationが設定された AppEntity AppEnum AppIntent を表現できます これにより Siriやショートカットで それらを特定のコンテンツへの リンクのように扱うことができ アクションでURLを開いたり 共有したりできます ショートカットから特定のトレイルへの ディープリンクを作成したいと思います TrailEntityを拡張して URLRepresentableEntityのサポートを追加し
ユニバーサルリンクをテンプレートとして 静的なURLRepresentationを指定します
エンティティのIDを挿入値として 使用していることに注意してください エンティティの識別子 または@Property属性を持つプロパティを URL文字列への挿入値として使えます
URLRepresentableEntityを TrailEntityでサポートできたので これを新しいURLRepresentableIntentと 組み合わせて使用する方法を説明します TrailEntityを対象とするOpenIntentに 準拠する OpenTrailIntentを作成し
URLRepresentableIntentへの 準拠も追加します
これでperformの実装も不要です App Intentが 既存の URL処理コードの呼び出しを行います
ショートカットから このApp Intentを使ってみましょう 娘と私はサイクリング好きなので ショートカットを使用して 近くのトレイルを探し 楽しんでいます しかし 現在できることは トレイルの名前を表示するだけです アプリ内のトレイルを直接開くことができれば より便利です そこでOpenTrailIntentを追加します
Show Resultアクションの代わりに Open Trailアクションを追加します
ショートカットを実行すると TrailEntityのURL表現を 使用して トレイルの詳細にディープリンクします App IntentでURLを使用する もう1つの方法は performから 新しいOpenURLIntentを返すことです Siriとショートカットによって App Intentが実行された時 関連コンテンツにリンクするための 指定されたURLを開くことができます
「CreateTrail」App Intentがあれば 新しく作成したTrailEntityで OpenURLIntentを初期化して ショートカットからアプリを開き 新しく作成されたトレイルに 直接移動できます
URLRepresentableを採用することで App Intentの型のユニバーサルリンクを 提供しやすくなり 既存のURL処理コードを再利用して コンテンツへのアクセスを容易にできます 今年はデベロッパ体験にも いくつかの改善が行われていて App Intentを より簡単に作成できるようになります 新しい種類のパラメータについて説明し App Intentを定義し再利用する方法の 改善点を紹介します
まず UnionValueです パラメータやプロパティを 一連の型の1つで表せる場合があります 「BuyDayPass」App Intentは TrailEntityを受け入れますが 1回のトレイルか公園全体のいずれかの 1日パスを購入するオプションを 提供したいと思います そのために 新しいUnionValueマクロを使います
まず 列挙型を作成し 2つの購入オプションを定義します 1つはParkEntityで もう1つはTrailEntityです
新しいUnionValueマクロを 列挙型に追加します
新しいDayPassType列挙型を 使用するように パラメータを更新します
performメソッドでは 他の列挙型と同様に passTypeパラメータの switchを使います
重要なことは 列挙型の各ケースに 関連値が必ず1つあることです
関連値がないケースは無効です
また 関連値は それぞれ異なる必要があります TrailEntityを持つケースがすでにあるので 同じ値のケースは追加できません 既存の型が複数あり いずれかを 使用したい時は UnionValueを使います これは「or」パラメータのようなものと 考えることができます
App Intentを使ったことがある方は App Intentの例の中に @Parameter属性のタイトルが ないものがあることに 気がついたことでしょう Xcode 16.0でビルドする場合 AppEntityプロパティや AppIntentパラメータに タイトルを指定する必要がなくなりました
そのため SuggestedTrailsインテントは このように
簡略化できます Xcodeは 構造体のプロパティ名に基づき タイトル文字列を インテリジェントな方法で生成します
しかし trailCollectionの場合 「Featured Collection」を タイトルにしたいので
先ほどのように手動でタイトルを指定します
もう1つ重要なのが フレームワークでApp Intentを使用する 方法の改善です これまでは すべてのApp Intentの型が 同じモジュール内にある必要がありました アプリのAppIntentでは いずれかのフレームワークで定義した AppEntityを使用できませんでした そのAppIntentも 同じフレームワークに 存在する必要がありました Xcode 16では この制限を廃止し アプリのエンティティを フレームワーク内で定義して アプリやExtensionターゲットで 参照できるようになりました
現時点では フレームワークのみがサポートされており フレームワーク外のライブラリは 未サポートです
これらは App Intentの 優れた新機能と改善点のほんの一部です 詳しくは App Intentのドキュメントをご覧ください
駆け足で説明してきましたが 全体をまとめます Spotlightにアプリのエンティティの インデックスを作成すると Siriの検索と理解が大幅に向上します アプリのエンティティの表現の 有用性を高めることで ほかのアプリが コンテンツを理解できるようになります URLRepresentableと デベロッパ向けの新しい改善点を試して ぜひご意見をお聞かせください App Intentは デバイス全体で 様々な機能の利用を便利にします ほかのビデオでも App Intentを使った 各種の魅力的な機能を紹介しています
みなさんのアプリで App Intentをぜひ活用してください ご視聴ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。