記事

Intentを適切なhandlerオブジェクトに振り分ける

SiriKitに、特定のIntentを処理できるオブジェクトを提供します。

概要

ユーザーがSiriまたはマップを使ってAppのリクエストを行うと、SiriKitによってIntents App Extensionがロードされ、そのINExtension(英語)サブクラスのインスタンスが作成されます。Extensionオブジェクトの役割は、特定のIntentを処理するために使用するhandlerオブジェクトをSiriKitに提供することです。これらのオブジェクトを、Extensionオブジェクトのhandler(for:)(英語)メソッドから提供します。

handler(for:)(英語)メソッドの構成はすべてのIntents App Extensionで同じであり、このメソッドは、Intents App ExtensionがサポートするすべてのIntentについて有効な新しいオブジェクトを返す必要があります。リスト1では、このメソッドが「メッセージ」ドメインと「VoIP通話」ドメインのIntentをサポートしています。提供されるIntentオブジェクトのタイプをチェックした後、メソッドは、そのIntentを処理できるオブジェクトを作成して返します。

リスト1

SiriKitにhandlerオブジェクトを提供する

override func handler(for intent: INIntent) -> Any {
   switch intent {
   case is INSendMessageIntent,
            is INSearchForMessagesIntent,
            is INSetMessageAttributeIntent:
      return MyMessageHandler()
            
   case is INStartAudioCallIntent:
      return MyAudioCallHandler()
            
   case is INStartVideoCallIntent:
      return MyVideoCallHandler()
            
   default:
      // The app extension should only be called for intents it knows about.
      fatalError()
   }
}

handler(for:)(英語)メソッドから返されるオブジェクトは、対応するIntentの処理に必要な特定のプロトコルを実装する必要があります。各Intentオブジェクトには関連プロトコルがあり、その名前はIntent名に基づいています。例えば、INStartAudioCallIntent(英語)オブジェクトを処理する場合、INStartAudioCallIntentHandling(英語)プロトコルを実装するオブジェクトを提供します。Intentパラメータをリゾルブし、そのIntentをどのように処理したかをSiriKitに知らせるには、プロトコルによって定義されるメソッドをオブジェクトに実装する必要があります。

SiriKitは通常、単一のIntentオブジェクトを処理する際にhandlerオブジェクトのコピーを複数作成し、各オブジェクトで1つのメソッドのみを呼び出します。キャッシュした状態の情報は以降のメソッド呼び出し時には存在しないため、handlerオブジェクトに保存しないでください。各メソッドから必要とされるデータを取得するには、常に新たにリクエストを行ってください。

関連項目

Siri Intents

Intents App Extensionの開発

XcodeプロジェクトでIntents App Extensionを追加および構成します。

App Extensionをサポートするためのコード構成

バックエンドサービスをプライベートフレームワークに移動し、AppとApp Extensionがサービスを使用できるようにします。

Intentのリゾルブとハンドル

Appのサービスに対するユーザーリクエストをリゾルブ、コンファーム、ハンドルします。

protocol INIntentHandlerProviding(英語)

Intentを処理するカスタムオブジェクトにIntentを振り分けるインターフェイスです。

Extension関連のクラス(英語)

Intents Extensionのビルドに使用するクラスについて説明します。