Intents Extensionは、サードパーティアプリがSiriの音声コマンドを処理し、SiriKitを通じてシステムサービスと対話できるようにするiOS拡張機能です。アプリはIntents.intentdefinitionで独自のインテントを定義し、INIntentHandlerに基づくハンドラを実装し、音声フレーズ認識のためにそれらを登録します。Apple Developer Documentation(2025)によると、SiriKitは20以上のインテントドメイン(メッセージング、支払い、ワークアウト、予約など)をサポートしており、iOS 14以降はIntentsExtensionを通じてカスタムインテントのサポートが追加されました。
重要なポイント
Intents Extensionは、Siri、Shortcuts、およびその他のシステムサービスが、標準化されたINIntentHandlerプロトコルを通じてアプリの機能を呼び出せるようにするアプリ拡張機能です。ユーザーが「Hey Siri、Messenger Xでメッセージを送って」と言うと、Siriは対応する拡張機能を起動し、リクエストパラメータを渡し、音声出力の結果を受け取ります。
他のタイプの拡張機能とは異なり、Intents Extensionは表示可能なインターフェースなしでバックグラウンドで動作します。Siriは音声またはテキストカードで応答を表示します。拡張機能はオプションでINUIHostedViewProvidingを通じてカスタムUIを提供でき、確認のためにコマンド実行前にSiri内に表示されます。
拡張機能はデバイスの画面にアクセスできず、自分でアクションを開始することはできません。SiriまたはShortcutsからのリクエストに応答するだけです。これによりセキュリティが確保されます。ユーザーはアプリが音声コマンドを通じて実行するアクションを常に制御できます。
SiriKitは、iOS 10で導入されたSiri統合のためのAppleのフレームワークです。これは、Siriが処理できるアクションのカテゴリ(メッセージ、電話、支払い、リスト、リマインダー、写真、ワークアウト、予約など)であるドメインを定義します。各ドメインには、固定のインテントと応答のセットがあります。
INSendMessageIntent — メッセージの送信。INStartWorkoutIntent — ワークアウトの開始。INSearchForPhotosIntent — 写真の検索。INRequestRideIntent — ライドの予約。各ドメインは、Siriが音声リクエストから抽出する必須およびオプションのパラメータを定義します。Appleによると、標準ドメインにはintentdefinitionファイルは不要で、対応するハンドラを実装するだけで十分です。
標準ドメインに適合しないアプリのために、iOS 14ではカスタムインテントを使用する機能が導入されました。アプリはIntents.intentdefinitionを通じて独自のコマンドタイプとそのパラメータを定義し、Siriは開発者が提供するサンプルに基づいて対応するフレーズを認識することを学習します。
Intents Extensionは、Info.plistのIntentsSupportedキーを介して登録され、拡張機能が処理するすべてのインテントクラスがリストされます。Siriはこのリストを使用して、音声コマンドを認識する際に適切な拡張機能を選択します。複数の拡張機能が同じインテントをサポートしている場合、Siriはユーザーに選択を促します。
class MessageIntentHandler: NSObject,
INSendMessageIntentHandling {
func handle(
intent: INSendMessageIntent,
completion: @escaping
(INSendMessageIntentResponse) -> Void
) {
let response = INSendMessageIntentResponse(
code: .success, userActivity: nil)
completion(response)
}
}
INIntentHandlerは、インテント処理の各段階(パラメータ解決、確認、実行)を処理するメソッドを定義するプロトコルです。拡張機能は、サポートする各インテントタイプに対してこれらのメソッドを実装します。
resolve — インテントパラメータの検証と明確化。Siriは各パラメータに対してこのメソッドを呼び出します。パラメータが欠落しているか不正な場合、拡張機能は明確化リクエストを返し、Siriはユーザーに追加の質問をします。confirm — 意図の確認。拡張機能は現在のコンテキストでインテントを実行できるかどうかを確認します。handle — 操作の実際の実行と結果の返却。
3段階の分離は音声UXにとって重要です。パラメータが認識されない場合、Siriはアクションを実行せず、明確化を求めます。たとえば、ユーザーが「Alexにメッセージを送って」と言ったが、連絡先に3人のAlexがいる場合、拡張機能は明確化リクエストとともにresolveを返し、Siriは「どのAlexですか?」と尋ねます。
INIntentResponseは、インテント実行後に拡張機能が完了ハンドラで返すオブジェクトです。応答には、結果コード(success、failure、requiresAuthentication、inProgress)と、Siriが音声出力するためのオプションデータが含まれます。コードはSiriの応答方法を決定します。success — 音声確認、failure — エラーメッセージ、inProgress — 長時間操作の表示。
func resolve(
for intent: INSendMessageIntent,
with completion: @escaping
(INStringResolutionResult) -> Void
) {
if let text = intent.content, !text.isEmpty {
completion(.success(with: text))
} else {
completion(.needsValue())
}
}
iOS 14以降、開発者は標準のSiriKitドメインの外でカスタムインテントを定義できるようになりました。カスタムインテントはIntents.intentdefinitionファイル(パラメータと応答を持つ新しいコマンドタイプを作成するXcode内のビジュアルエディタ)で記述されます。
各カスタムインテントは、INIntent(リクエスト定義)とINIntentResponse(応答定義)で構成されます。INIntentには、String、Integer、CurrencyAmount、見つかったオブジェクトなどのデータ型を持つパラメータが含まれます。INIntentResponseには、結果を返すためのプロパティと応答コードの配列が含まれます。Xcodeはこの定義に基づいてSwiftクラスを自動生成します。
Appleはカスタムインテントに5つ以下のパラメータを含めることを推奨しています。パラメータが多すぎると音声認識が低下し、ユーザーエクスペリエンスが複雑になります。各パラメータについて、Siriが正しく認識できるようにAssistant Dialogにサンプルフレーズを提供することをお勧めします。
Intents.intentdefinitionでは、各インテントに対してサンプル文(ユーザーがインテントをアクティブ化するためにSiriに話しかけるフレーズ)を指定できます。例:「マイアプリでコーヒーを注文して」「マイアプリにピザのレシピを探してもらって」。Siriはこれらのフレーズを認識トレーニングに使用し、Shortcutsの設定時にユーザーに提案します。
// Intents.intentdefinition(ビジュアルエディタ)
Intent: OrderCoffeeIntent
Parameters:
- beverage (String)
- size (String)
- quantity (Integer)
Response:
- orderNumber (String)
- price (CurrencyAmount)
Phrases:
- "Order coffee in MyApp"
- "Get a latte from MyApp"
INUIHostedViewProvidingは、コマンド実行前にIntents ExtensionがSiri内にカスタムインターフェースを表示できるようにするプロトコルです。たとえば、ライドを予約する際に、拡張機能はルートと料金を含む地図を表示でき、ユーザーはタップしてアクションを確認します。
このプロトコルはメソッドconfigure(with:for:completion:)を定義し、拡張機能はインテントを受け取り、Siriに埋め込まれるUIViewControllerを返します。コントローラのサイズには制限があり、最大高さは200ポイントです。金額、時間、住所などの主要情報を含むコンパクトなカードを使用することをお勧めします。
カスタムインターフェースはオプションです。拡張機能がINUIHostedViewProvidingを実装しない場合、Siriはインテントタイプとアプリ名を含む標準カードを表示します。ほとんどのインテントでは標準UIで十分であり、Appleは理解を真に向上させる場合(ルートの表示や支払いの確認など)にのみカスタムインターフェースを追加することを推奨しています。
金融や個人データに関連するインテントでは、認証が必要です。INIntentResponseはrequiresAuthenticationコードをサポートしており、実行前にSiriにFace IDまたはTouch IDを要求させます。認証後、拡張機能は別のhandle呼び出しを通じて確認を受け取り、認証ステータスがチェックされます。
Appleは特に強調しています。Intents Extensionは独自のパスワードや生体認証を要求してはならず、システム認証が使用されます。アプリと拡張機能の間で共有アクセスを持つKeychainにアクセストークンを保存することは、長期セッションの標準的なプラクティスです。
class IntentViewController: UIViewController {
func configure(
with intent: INIntent,
completion: @escaping
(UIViewController?) -> Void
) {
let cardView = ConfirmationCardView()
let hostingController =
UIHostingController(rootView: cardView)
completion(hostingController)
}
}
よくある質問
はい、拡張機能は音声入力なしでShortcutsアプリからのインテントを処理できます。ユーザーは提案されたアクションからショートカットを作成し、拡張機能はSiriの関与なしでそれを実行します。
カスタムインテントはiOS 14以降で利用できます。iOS 10〜13では、標準のSiriKitドメインのみが利用可能です。カスタムインテントにはIntents.intentdefinitionとSwiftクラスの生成が必要です。
Siriは拡張機能からの応答を約15秒待機します。制限を超えると、Siriはアクションを完了できなかったことをユーザーに通知します。長時間の操作には、inProgress応答コードを使用してください。
メインアプリと拡張機能の間でアクセスグループを介して共有アクセスを持つKeychainを使用します。App Group共有UserDefaultsも代替手段ですが、セキュリティ面でKeychainに劣ります。
Intents Extensionはロジック(resolve、confirm、handle)を処理します。Intents UI Extensionは、INUIHostedViewProvidingを通じてSiri内に表示するカスタムインターフェースを提供します。両方とも連携して動作できます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。