AppIntentは、iOS 16で導入されたAppleのフレームワークであり、従来のIntents frameworkに代わるものです。Siri、Shortcuts、Spotlightとのアプリ統合のための宣言的APIを提供します。個別のIntent Definition FileとObjCコード生成が必要だった旧来のアプローチとは異なり、AppIntentはAppIntentおよびAppEnumプロトコルを使用した純粋なSwiftを使用します。Apple Developerドキュメント、2026によると、AppIntentはIntents frameworkと比較して1つのインテントを作成するためのコード量を平均60%削減し、Siriコマンドの統合時間は数日から数時間に短縮されます。
主要ポイント
AppIntentは、アプリがSiri、Shortcuts、Spotlight、Control Center、Action Buttonの要求に応じて実行できるコマンドを宣言的に記述するためのAppleのフレームワークです。その基盤はAppIntentプロトコルであり、開発者はインテントの名前、そのパラメータ、およびperform()メソッド(実行可能なロジック)を記述します。フレームワークは自動的にShortcutsアプリでパラメータを構成するためのユーザーインターフェースとSiri用の音声フレーズを生成します。
AppIntent以前は、開発者はIntents frameworkを使用していました。これはIntents Definition Fileに基づくシステムで、Objective-Cコードを生成し、個別のIntents Extensionの設定が必要でした。このプロセスは煩雑で、単純なインテントでも最大5つの設定ファイルが必要でした。AppIntentはこの複雑さを排除します。インテントは1つのSwiftファイルで記述され、システムはSiriおよびShortcutsとの統合に必要なすべてを自動生成します。
WWDC 2024セッション「Dive deeper into App Intents」によると、AppleはAppIntentを従来のUIを超えてアプリの機能を拡張するための中心的なメカニズムと見なしています。iOS 18のリリース時点で、App Storeトップ100のアプリの70%以上がShortcutsおよびSiriとの統合にAppIntentを既に使用しており、平均的なiOS 18ユーザーは音声コマンドまたはウィジェットを介して1日あたり4〜6個のインテントを実行しています。
Intents framework(iOS 10–15)では、.intentdefinitionファイルの作成、XcodeによるObjC/Swiftクラスの生成、Intents ExtensionとApp Intent Configurationの設定が必要でした。AppIntent(iOS 16+)は、生成、拡張、追加構成なしで、純粋なSwiftコードでこのパイプラインを完全に置き換えます。これにより、SiriKitを学習することなく、平均的なiOS開発者がインテント作成プロセスを利用できるようになります。
AppIntentの主な利点は宣言性です。開発者はインテントが何を行うかを記述し、システムとどのように統合するかは記述しません。フレームワーク自体がSiriの対話シナリオ、Shortcutsでのパラメータ表示、インテント間のコンテキスト受け渡しを処理します。旧来のIntents frameworkでは、インテントUIを表示するためのINUIHostedViewを含め、統合のすべての側面を手動でコーディングする必要がありました。
| 特性 | Intents framework | AppIntent |
|---|---|---|
| コード量 | インテントあたり100〜300行 | 30〜60行 |
| 必要なファイル | .intentdefinition、Extension、Config | 1つのSwiftファイル |
| コード生成 | 必須(Xcode -> ObjC) | 不要 |
| 非同期 | completion handlerのみ | async/await + 進捗 |
| IntentDialog | なし | 組み込みSiriダイアログ |
AppIntentはインテントを定義する中心的なプロトコルです。title(Siri用の名前)、description(Shortcutsでの説明)、パラメータ(@Parameter経由)、およびIntentResultを返すperform()メソッドが含まれます。結果はIntentDialog(Siriとの対話)、Shortcutsに返す値、またはエラーのいずれかになります。各インテントはsuggestedInvocationPhrase(音声呼び出し用のフレーズ)も提供できます。
AppEntityはインテントが操作するエンティティを記述します。たとえば、アプリがプロジェクトを管理する場合、AppEntity Projectにはid、displayRepresentation(UIでのエンティティの表示方法)、defaultQuery(エンティティの検索方法)が含まれます。AppEnumは選択パラメータ用の列挙であり、Shortcutsでピッカー要素を持つUIを自動生成します。パラメータリストを手動で作成する代わりに、AppEnumに準拠するenumを宣言するだけで十分です。
enum TaskPriority: String, AppEnum {
case low, medium, high
static var typeDisplayRepresentation: TypeDisplayRepresentation =
"Priority"
var displayRepresentation: DisplayRepresentation {
switch self {
case .low: "Low"
case .medium: "Medium"
case .high: "High"
}
}
}
struct CreateTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Create Task"
@Parameter(title: "Task Name")
var taskName: String
@Parameter(title: "Priority")
var priority: TaskPriority
func perform() async throws -> some IntentResult {
try await TaskManager.shared
.createTask(name: taskName, priority: priority)
return .result(dialog: "Task created")
}
}
AppIntentのパラメータは@Parameterプロパティラッパーを介して宣言され、Shortcuts UIおよびSiriの音声要求と自動的に統合されます。各パラメータにはtitle(Shortcutsに表示される)があり、説明、デフォルト値、制約を含めることができます。AppIntentは標準タイプ(String、Int、Double、Bool)に加えて、AppEntityおよびAppEnumを介したカスタムタイプをサポートします。
パラメータの検証は、ロジックを実行する前にperform()メソッドで実行されます。パラメータが無効な場合、インテントはIntentErrorを介してエラーを返します。複雑な検証の場合、perform()の前に呼び出されるvalidate()メソッドを実装でき、コマンドを実行する前でもIntentDialogを介してユーザーにフィードバックを提供できます。これは、誤ったコマンドを実行するよりもユーザーに再度質問する方が簡単なSiriの音声シナリオで特に役立ちます。
struct SendMessageIntent: AppIntent {
static var title: LocalizedStringResource = "Send Message"
@Parameter(title: "Recipient")
var recipient: String
@Parameter(title: "Message")
var message: String
func validate() throws {
guard message.count >= 1 else {
throw IntentError.invalidMessage
}
}
func perform() async throws -> some IntentResult {
try await Messenger.shared
.send(recipient: recipient, text: message)
return .result(dialog: "Sent!")
}
}
アプリでメモを検索するためのインテントの完全な例は、AppEntityおよびEntityQueryとの連携を示しています。SearchNotesIntentは検索文字列を受け取り、見つかったメモのリストを返します。AppEntity Noteはメモの構造を記述し、EntityQueryはストレージ全体の検索を実装します。結果はエンティティの配列を持つIntentResultを介して返され、Shortcutsがユーザーに表示します。
struct Note: AppEntity {
let id: UUID
let title: String
let content: String
static var typeDisplayRepresentation: TypeDisplayRepresentation =
"Note"
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(title: "(title)")
}
}
struct SearchNotesIntent: AppIntent {
static var title: LocalizedStringResource = "Search Notes"
@Parameter(title: "Query")
var query: String
func perform() async throws -> some IntentResult {
let results = await NoteStore.shared
.search(query)
.map { $0.toEntity() }
return .result(value: results)
}
}
AppIntentを宣言すると、ShortcutsおよびSiriとの統合が自動的に行われます。ShortcutsアプリはインストールされたアプリからすべてのAppIntentをスキャンし、利用可能なアクションのリストに表示します。ユーザーはインテントをショートカットに追加し、そのパラメータを構成し、他のアクションと組み合わせることができます。Siriの場合、インテントは開発者による追加設定なしで音声コマンドとして表示されます。
開発者はsuggestedInvocationPhrase(音声呼び出し用の推奨フレーズ)を追加することで統合を改善できます。たとえば、タスク追加インテントの場合: suggestedInvocationPhrase = "Add new task"。Siriはこのフレーズを分析し、音声コマンドを学習する際にユーザーに提案します。categories(create、view、search、edit)も指定でき、Shortcutsがアクションを意味ごとにグループ化するのに役立ちます。
| カテゴリ | 例 | Shortcutsでの動作 |
|---|---|---|
| .create | CreateTaskIntent | 他の作成アクションとグループ化 |
| .view | ViewWeatherIntent | 「表示」カテゴリに表示 |
| .search | SearchNotesIntent | 検索アクションとしてマーク |
| .edit | UpdateTaskIntent | 編集アクションとグループ化 |
よくある質問
いいえ。AppIntentは個別のIntents Extensionを必要としません。インテントはメインアプリケーションに直接コンパイルされ、アーキテクチャを簡素化し、プロセス間通信の必要性を排除します。
AppIntentはiOS 16+、iPadOS 16+、macOS 13+、watchOS 9+で利用可能です。iOS 15以前の場合は、Intents frameworkを使用する必要があります。幅広いデバイスをカバーするには、両方のAPIをサポートすることをお勧めします。
IntentsResultはString、Int、Double、Bool、AppEntity配列、IntentDialog、およびカスタム型をサポートします。複雑なデータ構造はEntityQueryを介して返され、Shortcuts UIと自動的に統合されます。
はい。AppIntentsPackageを介して可能です。これはサーバー側でインテントを実行できるパッケージです。ローカルでは利用できないデータにアクセスする必要があるサーバーロジックを持つアプリに役立ちます。
Shortcutsアプリと共にiOS 16+シミュレーターを使用してください。シミュレーターでShortcutsコマンドにインテントを追加して実行します。Siriシナリオでは物理デバイスが必要です。シミュレーターは音声入力をサポートしていません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。