Transferable × App Intents ― エンティティをアプリ間で共有する
Transferableの基礎については先日こちらの記事に書きました:
本記事では、WWDC24の "What’s new in App Intents" (App Intentの新機能)から、Transferableについて解説されているパートを抜粋して紹介します。
TransferableはWWDC22ではドラッグ&ドロップの文脈で紹介されましたが、WWDC24の同セッションではApple Intelligence / App Intents向けの文脈で登場します。
具体的には、Transferableを利用してアプリのエンティティを特定の種類のコンテンツに変換したり、アプリのエンティティとしてドキュメントを直接公開したりできるようにする方法について解説されています。
以下、文章、画像はWWDCの基本的に同セッションからの引用です。適宜要約したり、順序を並び替えたり、見出しを追加したりしています。
サンプルアプリの説明
私の家族はハイキングが大好きです。
そこで お気に入りのトレイルを記録する アプリを開発しています。
エンティティに意味を持たせる
AppEntity
では、トレイルなどアプリの概念を定義して提供できます。
しかし、ほかのアプリはその概念を理解できません。代わりに、PDFのようにどのアプリでも理解できる標準化された形式でエンティティを表現し、Uniform Type Identifierを使用してファイルやデータを特定の型としてラベルづけできないでしょうか。
実は、これを行うことができる API はすでにあります。
Transferable AppEntity
Transferableは、共有やデータ転送のためにモデルのシリアル化と逆シリアル化する方法を宣言的に記述する方法です。これで、アプリのエンティティが転送可能になります。
例えば、Transferableを使って AppEntity
を変換し、次の形式でエクスポートできます。PDF・画像・リッチテキストです。
Transferableを使用すると、Siri とショートカットが AppEntity を変換し、ほかの App Intent に新しい値を渡すことができます。
これにより、コンテンツを添付ファイルとしてメールに渡したり、
画像に変換してフォトライブラリにインポートしたりできます。
実装
私のトレイルアプリでは、完了したアクティビティを記録でき、それらを ActivityStatisticSummary
エンティティとして表現します。
この記録をほかのアプリにとって有用なものにするために、Transferable
のサポートを追加します。
Transferable
でエンティティを拡張します。
静的な transferRepresentation
メソッドを実装します。
Activity Summary をリッチテキストに変換するメソッドはすでにあるので、DataRepresentation
を追加して、
exportedContentType
として .rtf、つまりリッチテキストを指定します。
Activity Summary を PNG ファイルとしてエクスポートするメソッドもあります。
そこで、PNG としてエクスポートされる FileRepresentation
も追加します。
Transferable な表現を定義する順序
Transferable な表現を定義する順序は重要です。
忠実度が最も高いものから最も低いものの順に指定します。例えば、プライベートの Codable な型の表現が最初で、リッチテキストやプレーンテキストなどの、より忠実度の低い形式が続きます。
動作確認
ショートカットで動作を確認しましょう。
Summarize Activities アクションの出力を取得し、Calories Burned プロパティを Activity Log メモに追加するショートカットがすでにあります。
Transferable を実装したので、出力をエンティティ自体に変更したらどうなるか見てみましょう。
ショートカットを実行すると、Summarize Activities の結果が
テキストに変換され、メモに追加されました。
型を画像に変更し、
ショートカットをもう一度実行すると、PNG 表現が使用されることがわかります。
Transferableの制限
現時点では、Transferable API をAppEntity
と組み合わせて使用する上で、いくつか制限があります。
コンパイル時に Xcode が Transferable の表現を理解する必要があるからです。
問題がある場合は、コンパイラがフィードバックを返します。
さらに、ProxyRepresentation
を使用することができるのは@Property
属性を使って AppEntity
のプロパティを参照する場合のみです。
この例では、@Property
属性があるので name
プロパティを使用できます。
description
にはこの属性がないため、使用できません。
Transferable について詳しく知りたい場合は、WWDC22 の「Meet Transferable」で Julia による説明をご確認ください。
IntentFile と Transferable
次は IntentFile
の改善点を使用して、コンテンツにアクセスする方法についてです。
Transferable でエンティティを様々な形式に変換する方法を説明しました。
受信側では、これはどう機能するでしょうか。
先ほど、Activity Summary をメモに追加する様子をお見せしました。AppendToNote
のような App Intent は IntentFile
パラメータを受け取る時、どのコンテンツタイプが利用可能かを確認して必要なタイプをリクエストできます。この場合、App Intent は Transferable 表現を使用してリクエストされたコンテンツの型にエンティティを変換します。
これは AppendToNote
の例です。
attachment
パラメータでサポートするコンテンツの型を宣言しています。
これにより、Siri やショートカットは可能な場合、コンテンツを自動的に変換できます。
IntentFile
のコンテンツにアクセスするには、コンテンツを抽出するいずれかの新しい API を使います。
IntentFile
がどのコンテンツの型を表すか確認できます。
そして、変換を行う URL にアクセスします。
Discussion