【iOS 18】App Intentsの新機能
本記事は、WWDC24の "What’s new in App Intents" (App Intentの新機能)というセッションを記事形式にしたものです。
以下、画像は同セッション動画より引用したものです。適宜要約したりカットしたり、見出しを追加したりしています。
セッション概要
App Intentの改善点と強化点をご紹介し、アプリの機能をSiriやその他の新しい機能と連携させるうえで、このフレームワークがどのように役立つかを説明します。Transferable API、File Representations、Item Providers、Spotlight Indexingを使用してAppleプラットフォームでのエンティティの有用性を高め、Siriやショートカットアプリでパワフルな機能を利用できるようにする方法をご紹介します。URL Representable Entitiesと柔軟なScene APIを利用し、インテントを通じてユーザーとアプリの結び付きを深めましょう。エラー処理、延期されたプロパティ、関連付けされた列挙型のための新しいAPIを使用してエンティティとインテントのモデルを作成する、新しい手法もご紹介します。
アジェンダ
App Intentは ショートカット、Spotlight、ウィジェット、そしてアクションボタンや新しいApple Pencilのスクイーズなど、多くの機能を含む素晴らしい体験をアプリにもたらしました。
そして今年、App IntentはApple Intelligenceとコントロールの体験の構築における中核となります。
App Intentフレームワークは システムがアプリのエンティティを理解して使用するための新しい方法を提供し、App Intentをさらに使いやすくします。
- Spotlight integration
アプリのエンティティを Spotlightにインデックス化する方法、そして Siriがコンテンツを詳細に理解できるようにする方法を説明します。
- Entities and files
アプリのエンティティを 特定の種類のコンテンツに変換したり、アプリのエンティティとして ドキュメントを直接公開したりできます。
- Universal links
App Intentの型を ユニバーサルリンクとして公開することで、デバイス上でアプリ内の必要な場所に 直接移動できます。
- Developer improvements
App Intentをより簡単に利用するためのデベロッパ体験の向上についても説明します。
App Intentを初めて扱う方はまず 「Bring your app’s core features to users with App Intents」をご覧ください。
(訳注)"Bring your app’s core features to users with App Intents" の要約記事です
Spotlight integration
Spotlightは、あなたに関連するコンテンツを見つけるのに最適な場所です。
Spotlightは私がよく使うアプリを把握しており、サジェストとして提供してくれる。
これらのアプリをベースに、一般的なアクションに素早くアクセスできる。
また、現在の天気や最近の検索結果も表示されるかもしれない。
Spotlightには、特定のメモを素早く見つけるなど、探しているものを見つけるのに役立つ強力な検索機能もある。
また、アプリのショートカットやトップヒットは、App Intentsを通じてアプリの便利な機能を簡単に公開することができます。
IndexedEntity
今年は、Spotlightでアプリのエンティティをインデックス化できる新しいAPIを追加し、アプリのエンティティに新しく強力なセマンティック検索をもたらします。新しいIndexedEntity
プロトコルから始めましょう。
CSSearchableIndex
は、CSSearchableItem
を使用して、アプリに関する情報をSpotlightにインデックスすることができます。
CSSearchableItem
には、提供する情報を拡張する属性が設定されています。
新しいIndexedEntity
は、アプリのエンティティに検索可能なインデックスを表示する簡単な方法を提供します。これにより、エンティティの検索結果の表示やSpotlightが可能になり、Siriがエンティティの検索結果を理解しやすくなります。
家族と私はハイキングが大好きなので、私たちが好きなトレイルを記録するアプリを作っています。アプリを開かなくてもSpotlightでトレイルを検索できたら最高だ。これを実現するために、私のTrailEntity
にインデックス化されたエンティティのサポートを追加しようと思います。
まず、私のTrailEntity
に新しいIndexedEntity
・プロトコルへの適合性を追加する。
それから、CSSearchableIndex
の indexAppEntities
を呼び出して、データ・マネージャーのすべてのTrailEntity
をインデックス化する。これで完了だ。
これで、TrailEntity
のコンテンツをspotlightに提供することができた。動作を見てみよう。
まず、アプリを立ち上げて、新しいエンティティ・インデックスのコードを実行する機会を作る。
次に、Spotlightでを検索する。
私のトレイルのコンテンツが検索結果として表示されていることがわかる。
そして、私たちのTrailEntity
をパラメータとして受け入れるトレイル・インテントを開いているので、結果をタップすれば、アプリでそのトレイルに直接アクセスすることができる。
CSSearchableItemAttributeSet
IndexedEntity
のデフォルトの実装では、display representation のみを使用して attribute set を収集します。
しかし、アトリビュートセットを使えば、位置情報やキーワードなど、Spotlightにとって有用なあらゆる情報を指定することができる。
AttributeSetを自分で実装することで、Spotlightにより多くの情報を提供することにしよう。
まず、TrailEntity
にAttributeSetの実装を提供します。AttributeSetをカスタマイズして、トレイルの位置から市町村や州など、私のエンティティに関連しそうなプロパティを含め、キーワードをトレイルがサポートするアクティビティに設定します。
Spotlightにより多くの情報を提供することで、検索と理解がさらに関連性の高い結果を返すことができます。
associateAppEntity
また、アプリケーションが CSSearchableItem
APIを介してすでにSpotlightにコンテンツをインデックスしている場合、新しい associateAppEntity
メソッドを使用して、インデックスする前に AppEntity
を検索可能アイテムに関連付けることができます。これにより、新しいセマンティック検索で AppEntity
に関する情報を見つけることができます。
また、インデックスされたエンティティAPIのいずれかで優先順位を設定できます。値が大きいほど、その項目はより重要です。例えば、お気に入りのアイテムに、お気に入りでないアイテムよりも高い優先順位を与えることができます。
CSSearchableItem
は強力な検索機能を提供しますが、コンテンツに対してアクションを起こすことはできません。アプリのエンティティにインデックスを付けることで、エンティティに関する既存の作業を活用することができ、Siriがエンティティを見つけて、フライトの詳細が記載されたEメールを見つけ、友人に転送するなどのアクションを実行できるようになります。
エンティティとファイル
Transferable AppEntity
Transferableの制限
IntentFile
FileEntity
先に進む前に、コンテンツを表現するもう 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 とショートカットに新しい可能性をもたらします。
ユニバーサルリンク
次に、ユニバーサルリンクと、それをアプリのインテント・タイプでどのように表現できるかについて説明しましょう。
ユニバーサルリンクは、アプリがインストールされているかどうかに関わらず、ユーザーがコンテンツにアクセスするのに役立ちます。My Trailsアプリは、特定のトレイルへのユニバーサルリンクを既にサポートしています。
以下(訳注:↑のスライドにあるURL)は、特定のトレイルの詳細にリンクするURLの例です。1は開くトレイルの識別子を示しています。
あなたのアプリのエンティティ、列挙型、インテントをURLを持つrepresentationとして表現できるようになりました。
これにより、Siriとショートカットがそれらを特定のコンテンツへのリンクのように扱うことができるようになり、URLを開くアクションや共有可能なアクションが可能になります。
Shortcutsから特定のトレイルにディープリンクできるようにしたいので、TrailEntity
を拡張して、URLRepresentableEntity
のサポートを追加します。
私が作成したユニバーサルリンクをテンプレートとして、statc
な URLRepresentation
を提供します。エンティティの識別子を補間値として使っていることに注目してください。URL文字列の補間として、エンティティのIDまたは @property
属性を持つプロパティを使用できます。
TrailEntity
が URLRepresentableEntity
をサポートしたので、これを新しい URLRepresentableIntent
でどのように使用できるか見てみましょう。
TrailEntity
をターゲットにした OpenIntent
に準拠した OpenTrailIntent
を作ってみる。
そして、URLRepresentableIntent
への適合性も追加する。それで終わり。実装も実行も必要ない。App Intentsが既存のURL処理コードを呼び出してくれる。
このApp Intentをショートカットに使うとどうなるか見てみよう。娘と私はサイクリングが大好きなので、地域の近くにあるトレイルを見つけるショートカットを用意し、私たちが走りに行けるようにランダムなトレイルを選んでいる。でも今はトレイルの名前が表示されるだけ。
自分のアプリでトレイルにすぐに行けるともっといい。それでは、OpenTrailインテントを追加しましょう。ShowResultアクションの代わりにOpenTrailアクションを追加します。これでショートカットを実行すると
TrailEntity
の URLRepresentation
は、トレイルの詳細へのディープリンクに使用されます。
App IntentsでURLを使用するもう1つの方法は、パフォーマンスから新しい OpenURLIntent
を返すことです。 App IntentsがSiriやショートカットで実行されると、提供されたURLを開いて、関連するコンテンツにリンクできます。また、トレイルを作成する App Intentsがあれば、新しく作成されたトレイルエンティティでOpenURLインテントを初期化して、ショートカットがアプリを開き、新しく作成されたトレイルに直接ナビゲートできるようにすることもできます。URL representableを採用することで、 App Intentsタイプにユニバーサルリンクを簡単に提供し、既存のURL処理コードを再利用し、コンテンツへのアクセスを支援することができます。
Developer improvements
今年は、開発者エクスペリエンスにもいくつかの改良を加え、App Intentsをより簡単に作成できるようにしました。新しいタイプのパラメータと、App Intentsを定義して再利用する方法の改善について説明します。
UnionValue
まずは UnionValue
だ。
パラメータやプロパティが、いくつかの型のうちの1つで表現できることがあります。私のBuyDayPass
App Intent では TrailEntity
を受け取りますが、1つのトレイルまたは公園全体の1日券を購入するオプションが必要です。そのために新しいUnionValue
マクロを使用します。
まず、列挙型を作成し、2つの購入オプションを定義する、
1つは公園、もう1つは小道のエンティティを取り、新しいユニオンの値マクロを列挙に追加する。
これで、新しいデイパスタイプの列挙を使うようにパラメーターを更新できる。
そして、私のperformメソッドでは、他の列挙型と同じように、pass typeパラメーターにスイッチを使うことができる。
列挙の各ケースは、関連する値を正確に1つ持たなければならないことに注意することが重要である。
関連する値がないケースは無効である。また、関連する値はそれぞれ明確でなければならない。
例えば、私はすでにTrailEntity
のケースを持っているので、他のケースを追加することはできません。
UnionValue
は、既存の型がいくつかあり、そのうちの1つを取りたいときに使う。これはorパラメータと考えることもできる。
Generated titles
App Intentsを使ったことがある人なら、私が書いたApp Intentsの例で、アプリ・パラメータ属性にタイトルがないことに気づいたかもしれません。
Xcode 16 でビルドする場合、アプリのエンティティ・プロパティやアプリのインテント・パラメータにタイトルを指定する必要がなくなりました。
つまり、私が提案するトレイルの意図は、このように凝縮することができる。
Xcodeは、構造体のプロパティ名に基づいて、タイトル文字列をインテリジェントに生成してくれます。しかし、Trail Collectionの場合は、次のようになります、
タイトルを注目のコレクションとして表示させたい。
だから、前と同じように手動でタイトルを指定する。
Framework improvements
そして最後に、フレームワークでApp Intentsを使用する方法を改善しました。
以前は、すべての App Intent タイプが同じモジュールになければならず、フレームワークの 1 つで定義された App Entity を使用してアプリで App Intent を持つことができませんでした。Xcode 16 では、その制限がなくなり、フレームワークで App Entity を定義し、アプリや拡張ターゲットから参照できるようになりました。
今回はフレームワークのみがサポートする。
フレームワーク外のライブラリーはそうではない。
これらは、App Intentsの素晴らしい新機能と改良点のほんの一部です。より深く知りたい方は、App Intentsのドキュメントをご覧ください。
Wrap-up
駆け足で説明してきましたが 全体をまとめます
- Spotlightにアプリのエンティティの インデックスを作成すると Siriの検索と理解が大幅に向上します
- アプリのエンティティの表現の 有用性を高めることで ほかのアプリが コンテンツを理解できるようになります
-
URLRepresentable
と デベロッパ向けの新しい改善点を試して ぜひご意見をお聞かせください
App Intentは デバイス全体で 様々な機能の利用を便利にします
ほかのビデオでも App Intentを使った 各種の魅力的な機能を紹介しています
Discussion