App Intents に関する2026年のアップデートについて。実装未経験で未知の領域なのだが、アプリコンテンツをシステムが既知のデータ型として与えることが可能になったことでアプリ内の連携がより密になったり、システムによるアプリコンテンツの提案をよりユーザーのコンテクストベースで行えるようになったり、さらに Siri がデバイスまたいで会話継続できるようになったりで、よりアプリのコンテンツがアプリの箱から飛び出して生活に偏在できるようになった感がある。
Discover new capabilities in the App Intents framework
0:00 – Introduction
- App Intents フレームワークの 2026 年アップデート概要
- Siri、Shortcuts、Spotlight、Widgets、Apple Intelligence にわたる制御・柔軟性・開発体験の向上
2:40 – Share entities across apps with ValueRepresentation
ValueRepresentationでアプリのエンティティをシステムが理解できる構造化型に変換して共有- エンティティ自体が
Transferableに準拠していれば、エンティティの情報をValueRepresentationでシステムの理解する構造体に変換してtransferRepresentationとして返すだけ - 例:ランドマークを
GeoToolbox.PlaceDescriptorとして書き出し、Maps でナビゲーション可能にする
- エンティティ自体が
- エンティティにすでに対応プロパティがある場合はキーパスで簡潔に記述可能
ValueRepresentation(exporting: \.placeDescriptor)
3:45 – Register relevant entities with RelevantEntities
- システムに自アプリのコンテンツを登録する方法
- 1. Spotlight にインデックスする:Siriで検索取得させたい場合
- 2. インタラクションドネーション(
IntentDonationManagerAPI):Siriとシステムにユーザーの使い方を学習させたい場合(繰り返しアクション)- → システムがパターンを学習し将来提案するようになる
- 3. 未知のコンテンツの場合は? Spotlight にインデクスされていないし、インタラクションもまだドネートされていない →
ReleavantEntitiesでシステムにヒントを与える
RelevantEntitiesAPI で「いつ、なぜ」のコンテキスト付きでエンティティを提案- 例:ワークアウト開始時に再生中プレイリストを提案
updateEntities(_:for:)でコンテキスト付きエンティティを登録- コンテキスト・エンティティ・全体の 3 段階での削除 API が用意されている
7:05 – Handle entities efficiently with EntityCollection
- 大規模なエンティティセットを効率的に扱うための
EntityCollection型 - パラメータ型を
[PhotoEntity]からEntityCollectionに変更するだけ perform()内ではphotos.identifiersを使うことでフル解決を回避- 1000 枚の写真のタグ付けがほぼ瞬時に完了するほどのパフォーマンス改善
8:55 – Use entities across devices with SyncableEntity
- OS 27 から Siri デバイスを跨いで会話を継続でき、エンティティも共有可能に
- エンティティにはIDが採番されシステムはこれを鍵に特定するが、ローカル生成されたものかもしれない(ローカルID) → デバイス共通のIDが必要(安定ID) →
SyncableEntityプロトコル
- エンティティにはIDが採番されシステムはこれを鍵に特定するが、ローカル生成されたものかもしれない(ローカルID) → デバイス共通のIDが必要(安定ID) →
- エンティティの ID がデバイスをまたいで安定している場合はプロトコル準拠を宣言するだけ
- ローカル ID と安定 ID が異なる場合は
SyncableEntityIdentifierでペアリング- サーバー UUID や Cloud Kit レコード ID などが安定 ID の典型例
11:01 – Richer parameter types
DurationとPersonNameComponentsのネイティブサポートが追加- Siri、Shortcuts、Widgets でピッカー UI とローカライズが自動的に機能
12:38 – Union value parameters
@UnionValue列挙型により 1 つのパラメータが複数の型を受け付けられるようになる- 例:ランドマークコレクションまたはフォトアルバムのどちらかを受け取るパラメータ
- 各ケースの表示名を
caseDisplayRepresentationsで定義すると自動的にピッカーが生成される
13:26 – Extend execution with LongRunningIntent
LongRunningIntentで 30 秒の実行制限を超える処理が可能になる(e.g. アプリを開かずにウィジェット経由で大きな画像をアップロード)performBackgroundTaskブロック内でprogressを更新すると Live Activity として進捗を表示CancellableIntentを組み合わせるとキャンセル処理(クリーンアップ)も実装可能- バックグラウンドでの GPU アクセスもサポート
15:27 – Target the right process with ExecutionTargets
allowedExecutionTargetsでインテントの実行先プロセスを明示的に指定可能.main:書き込み操作など、メインアプリが必要な場合.appIntentsExtension:スタンドアロンのダウンロードなど、エクステンションで完結する場合.widgetKitExtension:表示専用の読み取り操作- 複数指定でシステムに選択を委ねることも可能