🚀

【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のスクイーズなど、多くの機能を含む素晴らしい体験をアプリにもたらしました。

11

そして今年、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」をご覧ください。

https://zenn.dev/shu223/articles/corefeatures_appintents
(訳注)"Bring your app’s core features to users with App Intents" の要約記事です

Spotlight integration

Spotlightは、あなたに関連するコンテンツを見つけるのに最適な場所です。

15

Spotlightは私がよく使うアプリを把握しており、サジェストとして提供してくれる。

これらのアプリをベースに、一般的なアクションに素早くアクセスできる。

また、現在の天気や最近の検索結果も表示されるかもしれない。

16

Spotlightには、特定のメモを素早く見つけるなど、探しているものを見つけるのに役立つ強力な検索機能もある。

18

また、アプリのショートカットやトップヒットは、App Intentsを通じてアプリの便利な機能を簡単に公開することができます。

IndexedEntity

今年は、Spotlightでアプリのエンティティをインデックス化できる新しいAPIを追加し、アプリのエンティティに新しく強力なセマンティック検索をもたらします。新しいIndexedEntity プロトコルから始めましょう。

22

CSSearchableIndex は、CSSearchableItem を使用して、アプリに関する情報をSpotlightにインデックスすることができます。

CSSearchableItem には、提供する情報を拡張する属性が設定されています。

24

新しいIndexedEntity は、アプリのエンティティに検索可能なインデックスを表示する簡単な方法を提供します。これにより、エンティティの検索結果の表示やSpotlightが可能になり、Siriがエンティティの検索結果を理解しやすくなります。

26

家族と私はハイキングが大好きなので、私たちが好きなトレイルを記録するアプリを作っています。アプリを開かなくてもSpotlightでトレイルを検索できたら最高だ。これを実現するために、私のTrailEntityにインデックス化されたエンティティのサポートを追加しようと思います。

28

まず、私のTrailEntityに新しいIndexedEntity ・プロトコルへの適合性を追加する。

29

それから、CSSearchableIndexindexAppEntities を呼び出して、データ・マネージャーのすべてのTrailEntityをインデックス化する。これで完了だ。

これで、TrailEntityのコンテンツをspotlightに提供することができた。動作を見てみよう。

31

まず、アプリを立ち上げて、新しいエンティティ・インデックスのコードを実行する機会を作る。

次に、Spotlightでを検索する。

33

私のトレイルのコンテンツが検索結果として表示されていることがわかる。

34

そして、私たちのTrailEntityをパラメータとして受け入れるトレイル・インテントを開いているので、結果をタップすれば、アプリでそのトレイルに直接アクセスすることができる。

CSSearchableItemAttributeSet

IndexedEntity のデフォルトの実装では、display representation のみを使用して attribute set を収集します。

しかし、アトリビュートセットを使えば、位置情報やキーワードなど、Spotlightにとって有用なあらゆる情報を指定することができる。

AttributeSetを自分で実装することで、Spotlightにより多くの情報を提供することにしよう。

43

まず、TrailEntity にAttributeSetの実装を提供します。AttributeSetをカスタマイズして、トレイルの位置から市町村や州など、私のエンティティに関連しそうなプロパティを含め、キーワードをトレイルがサポートするアクティビティに設定します。

Spotlightにより多くの情報を提供することで、検索と理解がさらに関連性の高い結果を返すことができます。

associateAppEntity

44

また、アプリケーションが CSSearchableItem APIを介してすでにSpotlightにコンテンツをインデックスしている場合、新しい associateAppEntity メソッドを使用して、インデックスする前に AppEntity を検索可能アイテムに関連付けることができます。これにより、新しいセマンティック検索で AppEntity に関する情報を見つけることができます。

また、インデックスされたエンティティAPIのいずれかで優先順位を設定できます。値が大きいほど、その項目はより重要です。例えば、お気に入りのアイテムに、お気に入りでないアイテムよりも高い優先順位を与えることができます。

CSSearchableItem は強力な検索機能を提供しますが、コンテンツに対してアクションを起こすことはできません。アプリのエンティティにインデックスを付けることで、エンティティに関する既存の作業を活用することができ、Siriがエンティティを見つけて、フライトの詳細が記載されたEメールを見つけ、友人に転送するなどのアクションを実行できるようになります。

エンティティとファイル

Transferable AppEntity

Transferableの制限

IntentFile

FileEntity

先に進む前に、コンテンツを表現するもう 1 つの方法について説明します。

FileEntity API は、ドキュメントやファイルを扱うアプリに最適です。

Transferable で AppEntity をファイルやデータに変換できることを説明しました。

124

これは、エンティティがデータベースやサーバにあるオブジェクトを表している場合に最適です。

エンティティ自体がテキストドキュメントや、画像のようなファイルである場合はどうでしょうか。

このような場合、そのファイルはエンティティの標準的なバージョンとなります。

具体例

別のアプリで PhotoEntity を使っています。

131

PhotoEntity はディスク上の画像ファイルを表します。私のアプリは SetFavoritePhoto インテントなどの App Intent 内のエンティティを理解し使用できますが、ほかのアプリは私のエンティティを認識できず、App Intent で使用できません。しかし、先ほど説明したように、ほかのアプリは IntentFile を通じてファイルを理解しアクセスできます。

FileEntity を使用することで、Siri やショートカットでほかのアプリのファイルへの安全なアクセスが容易になり、そのファイルに直接アクセスできます。例えば、別のアプリの RotateImageIntent

133

PhotoEntity に対応するファイルに安全にアクセスして、その場で回転させます。

実装

次に、FileEntity を実装する例です。

他の AppEntity と同様に機能しますが、追加要件としてサポートされているコンテンツタイプのリストを提供し、

136

識別子を FileEntityIdentifier にする必要があります。

138

FileEntityIdentifier は URL を使用して作成できます。

139

ファイルがまだ存在しない場合は、ドラフト識別子として作成できます。FileEntityIdentifier は URL のブックマークデータを使用するので、ファイルの移動や名前変更が行われてもエンティティは引き続き有効です。

私のアプリは PhotoEntity 項目をグリッドに表示します。

140

ここで、最近追加した 2 つの項目がグリッドの最下部で間違った向きで表示されることに気づきました。これをショートカットで解決します。PhotoEntity に対してクエリを実行し、

141

今日追加された画像をフィルタリングします。

142

さらに、内蔵のショートカットである回転アクションを使用して、

143

クエリの結果に 90 度回転を適用します。

145

ショートカットを実行すると、アプリ内の画像ファイルを回転できました。

146

アプリに戻ると、ファイルの変更が検出され UI が更新されます。

147

これらの新しい API は強力です。

自分のアプリのエンティティがほかのアプリで有用なものになり、ほかのアプリのエンティティが自分のアプリで有用なものになるため、Siri とショートカットに新しい可能性をもたらします。

ユニバーサルリンク

次に、ユニバーサルリンクと、それをアプリのインテント・タイプでどのように表現できるかについて説明しましょう。

136

ユニバーサルリンクは、アプリがインストールされているかどうかに関わらず、ユーザーがコンテンツにアクセスするのに役立ちます。My Trailsアプリは、特定のトレイルへのユニバーサルリンクを既にサポートしています。

以下(訳注:↑のスライドにあるURL)は、特定のトレイルの詳細にリンクするURLの例です。1は開くトレイルの識別子を示しています。

138

あなたのアプリのエンティティ、列挙型、インテントをURLを持つrepresentationとして表現できるようになりました。

これにより、Siriとショートカットがそれらを特定のコンテンツへのリンクのように扱うことができるようになり、URLを開くアクションや共有可能なアクションが可能になります。

141

Shortcutsから特定のトレイルにディープリンクできるようにしたいので、TrailEntity を拡張して、URLRepresentableEntity のサポートを追加します。

私が作成したユニバーサルリンクをテンプレートとして、statcURLRepresentation を提供します。エンティティの識別子を補間値として使っていることに注目してください。URL文字列の補間として、エンティティのIDまたは @property 属性を持つプロパティを使用できます。

TrailEntityURLRepresentableEntity をサポートしたので、これを新しい URLRepresentableIntent でどのように使用できるか見てみましょう。

TrailEntity をターゲットにした OpenIntent に準拠した OpenTrailIntent を作ってみる。

そして、URLRepresentableIntent への適合性も追加する。それで終わり。実装も実行も必要ない。App Intentsが既存のURL処理コードを呼び出してくれる。

146

このApp Intentをショートカットに使うとどうなるか見てみよう。娘と私はサイクリングが大好きなので、地域の近くにあるトレイルを見つけるショートカットを用意し、私たちが走りに行けるようにランダムなトレイルを選んでいる。でも今はトレイルの名前が表示されるだけ。

150

自分のアプリでトレイルにすぐに行けるともっといい。それでは、OpenTrailインテントを追加しましょう。ShowResultアクションの代わりにOpenTrailアクションを追加します。これでショートカットを実行すると

153

TrailEntityURLRepresentation は、トレイルの詳細へのディープリンクに使用されます。

155

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 だ。

158

パラメータやプロパティが、いくつかの型のうちの1つで表現できることがあります。私のBuyDayPass App Intent では TrailEntity を受け取りますが、1つのトレイルまたは公園全体の1日券を購入するオプションが必要です。そのために新しいUnionValue マクロを使用します。

159

まず、列挙型を作成し、2つの購入オプションを定義する、

164

1つは公園、もう1つは小道のエンティティを取り、新しいユニオンの値マクロを列挙に追加する。

165

これで、新しいデイパスタイプの列挙を使うようにパラメーターを更新できる。

167

そして、私のperformメソッドでは、他の列挙型と同じように、pass typeパラメーターにスイッチを使うことができる。

169

列挙の各ケースは、関連する値を正確に1つ持たなければならないことに注意することが重要である。

関連する値がないケースは無効である。また、関連する値はそれぞれ明確でなければならない。

170

例えば、私はすでにTrailEntityのケースを持っているので、他のケースを追加することはできません。

UnionValue は、既存の型がいくつかあり、そのうちの1つを取りたいときに使う。これはorパラメータと考えることもできる。

Generated titles

App Intentsを使ったことがある人なら、私が書いたApp Intentsの例で、アプリ・パラメータ属性にタイトルがないことに気づいたかもしれません。

172

Xcode 16 でビルドする場合、アプリのエンティティ・プロパティやアプリのインテント・パラメータにタイトルを指定する必要がなくなりました。

173

つまり、私が提案するトレイルの意図は、このように凝縮することができる。

174

Xcodeは、構造体のプロパティ名に基づいて、タイトル文字列をインテリジェントに生成してくれます。しかし、Trail Collectionの場合は、次のようになります、

176

タイトルを注目のコレクションとして表示させたい。

177

だから、前と同じように手動でタイトルを指定する。

Framework improvements

そして最後に、フレームワークでApp Intentsを使用する方法を改善しました。

179

以前は、すべての App Intent タイプが同じモジュールになければならず、フレームワークの 1 つで定義された App Entity を使用してアプリで App Intent を持つことができませんでした。Xcode 16 では、その制限がなくなり、フレームワークで App Entity を定義し、アプリや拡張ターゲットから参照できるようになりました。

今回はフレームワークのみがサポートする。

181

フレームワーク外のライブラリーはそうではない。

183

これらは、App Intentsの素晴らしい新機能と改良点のほんの一部です。より深く知りたい方は、App Intentsのドキュメントをご覧ください。

Wrap-up

駆け足で説明してきましたが 全体をまとめます

  • Spotlightにアプリのエンティティの インデックスを作成すると Siriの検索と理解が大幅に向上します
  • アプリのエンティティの表現の 有用性を高めることで ほかのアプリが コンテンツを理解できるようになります
  • URLRepresentableと デベロッパ向けの新しい改善点を試して ぜひご意見をお聞かせください

App Intentは デバイス全体で 様々な機能の利用を便利にします

ほかのビデオでも App Intentを使った 各種の魅力的な機能を紹介しています

Discussion