AppIntent: その概要、SiriインテントモデルとSwift

著者: IT Sectr 公開日: 2026-06-16 読了時間: 8 分

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は、iOS 16以降でSiri、Shortcuts、Spotlightのインテントを作成するためのAppleの宣言的フレームワークです。
  • AppIntentプロトコルは主要な構成要素です。名前、説明、パラメータ、perform()メソッドがコマンドのロジックを定義します。
  • AppEntityは、インテントが操作するエンティティ(プロジェクト、タスク、連絡先、ファイル)を記述するためのプロトコルです。
  • AppEnumはパラメータの宣言的列挙であり、Shortcutsで選択用のUIを自動生成します。
  • 非同期 — インテントはasync/await、プログレスバー、ユーザーとの対話のためのIntentDialogをサポートします。

AppIntentとは何か、なぜ必要か?

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個のインテントを実行しています。

AppIntentの使用箇所

  • Siri — 音声コマンド: 「Hey Siri、MyAppにタスクを追加して」
  • Shortcuts — パラメータ構成によるショートカットアプリでの自動化
  • Spotlight — 検索バーからの直接検索とコマンド実行
  • Control Center — iOS 18+のクイックアクションボタン
  • Action Button — iPhone 15 Pro以降のボタンへのアクション割り当て

AppIntent vs Intents framework: 主な違い

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 frameworkAppIntent
コード量インテントあたり100〜300行30〜60行
必要なファイル.intentdefinition、Extension、Config1つのSwiftファイル
コード生成必須(Xcode -> ObjC)不要
非同期completion handlerのみasync/await + 進捗
IntentDialogなし組み込みSiriダイアログ

主要プロトコル: AppIntent、AppEntity、AppEnum

AppIntentはインテントを定義する中心的なプロトコルです。title(Siri用の名前)、description(Shortcutsでの説明)、パラメータ(@Parameter経由)、およびIntentResultを返すperform()メソッドが含まれます。結果はIntentDialog(Siriとの対話)、Shortcutsに返す値、またはエラーのいずれかになります。各インテントはsuggestedInvocationPhrase(音声呼び出し用のフレーズ)も提供できます。

AppEntityはインテントが操作するエンティティを記述します。たとえば、アプリがプロジェクトを管理する場合、AppEntity Projectにはid、displayRepresentation(UIでのエンティティの表示方法)、defaultQuery(エンティティの検索方法)が含まれます。AppEnumは選択パラメータ用の列挙であり、Shortcutsでピッカー要素を持つUIを自動生成します。パラメータリストを手動で作成する代わりに、AppEnumに準拠するenumを宣言するだけで十分です。

AppEnumとパラメータの例

swift
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の音声シナリオで特に役立ちます。

検証付きパラメータ

swift
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!")
    }
}

Swiftでのインテント作成: 例

アプリでメモを検索するためのインテントの完全な例は、AppEntityおよびEntityQueryとの連携を示しています。SearchNotesIntentは検索文字列を受け取り、見つかったメモのリストを返します。AppEntity Noteはメモの構造を記述し、EntityQueryはストレージ全体の検索を実装します。結果はエンティティの配列を持つIntentResultを介して返され、Shortcutsがユーザーに表示します。

swift
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)
    }
}

ShortcutsとSiriとの統合

AppIntentを宣言すると、ShortcutsおよびSiriとの統合が自動的に行われます。ShortcutsアプリはインストールされたアプリからすべてのAppIntentをスキャンし、利用可能なアクションのリストに表示します。ユーザーはインテントをショートカットに追加し、そのパラメータを構成し、他のアクションと組み合わせることができます。Siriの場合、インテントは開発者による追加設定なしで音声コマンドとして表示されます。

開発者はsuggestedInvocationPhrase(音声呼び出し用の推奨フレーズ)を追加することで統合を改善できます。たとえば、タスク追加インテントの場合: suggestedInvocationPhrase = "Add new task"。Siriはこのフレーズを分析し、音声コマンドを学習する際にユーザーに提案します。categories(create、view、search、edit)も指定でき、Shortcutsがアクションを意味ごとにグループ化するのに役立ちます。

Shortcuts用のインテントカテゴリ

カテゴリShortcutsでの動作
.createCreateTaskIntent他の作成アクションとグループ化
.viewViewWeatherIntent「表示」カテゴリに表示
.searchSearchNotesIntent検索アクションとしてマーク
.editUpdateTaskIntent編集アクションとグループ化

よくある質問

AppIntentに個別のIntents Extensionを作成する必要がありますか?

いいえ。AppIntentは個別のIntents Extensionを必要としません。インテントはメインアプリケーションに直接コンパイルされ、アーキテクチャを簡素化し、プロセス間通信の必要性を排除します。

AppIntentは古いバージョンのiOSで動作しますか?

AppIntentはiOS 16+、iPadOS 16+、macOS 13+、watchOS 9+で利用可能です。iOS 15以前の場合は、Intents frameworkを使用する必要があります。幅広いデバイスをカバーするには、両方のAPIをサポートすることをお勧めします。

インテントからどのようなデータ型を返せますか?

IntentsResultはString、Int、Double、Bool、AppEntity配列、IntentDialog、およびカスタム型をサポートします。複雑なデータ構造はEntityQueryを介して返され、Shortcuts UIと自動的に統合されます。

AppIntentはサーバー上で実行できますか?

はい。AppIntentsPackageを介して可能です。これはサーバー側でインテントを実行できるパッケージです。ローカルでは利用できないデータにアクセスする必要があるサーバーロジックを持つアプリに役立ちます。

物理デバイスなしでAppIntentをデバッグするには?

Shortcutsアプリと共にiOS 16+シミュレーターを使用してください。シミュレーターでShortcutsコマンドにインテントを追加して実行します。Siriシナリオでは物理デバイスが必要です。シミュレーターは音声入力をサポートしていません。

まとめ

  • AppIntentはSiri、Shortcuts、Spotlightのインテントを作成するためのAppleの宣言的フレームワークであり、iOS 16でIntents frameworkの後継として導入されました。
  • AppIntentプロトコルはコマンドを記述します。title、パラメータ(@Parameter)、async/awaitを備えたperform()メソッドがIntentResultを返します。
  • AppEntityAppEnumはエンティティと列挙を宣言的に記述するためのプロトコルであり、ShortcutsでUIを自動生成します。
  • パラメータ検証はvalidate()メソッドを介して、インテント実行前にデータをチェックし、Siriダイアログを返すことができます。
  • 統合はインテント宣言後、ShortcutsおよびSiriと自動的に行われます。suggestedInvocationPhraseは音声認識を向上させます。
  • AppIntentsPackageにより、リモートデータとロジックにアクセスするためにサーバー上でインテントを実行できます。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください