記事

カスタムインターフェイス用ビューコントローラの設定

独自のビューコントローラを作成して、Siriやマップのデフォルトインターフェイスを置き換え、または拡張します。

概要

ユーザーにレスポンスを表示する際、SiriKitによって、レスポンスのコンテンツを表示するためのデフォルトインターフェイスが提供されます。ユーザーがSiriを通じてAppを操作する方法を完全にカスタマイズしたい場合は、このデフォルトインターフェイスの一部または全部をカスタムビューに置き換えます。別の方法として、単一ビューでデフォルトインターフェイスを拡張し、デフォルトUIのうちAppのコンテンツと重複する部分を非表示にできます。

要件と制限

どのようなカスタマイズでも、提供するビューコントローラのビューに、表示したい情報が含まれるようにしてください。デフォルトインターフェイスを置き換える場合、SiriKitによってビューコントローラのインスタンスが複数作成される場合があり、App側は、表示されるコンテンツのタイプについて各インスタンスを適切に設定する必要があります。デフォルトインターフェイスを拡張する場合は、SiriKitによって単一のビューコントローラのインスタンスが作成されます。

画面上では、ユーザーがSiriやマップを消去しない限り、ビューコントローラはフォアグラウンドのSiriやマップのインターフェイスの一部になっています。必要に応じ、タイマーやその他のプログラム手段を用いてビューコントローラを更新することも可能です。ビューコントローラは、ロード、表示、非表示の操作に対して通常のコールバックを受け取りますが、画面上でタッチイベントやその他のイベントを受け取れず、ジェスチャリコグナイザを追加することもできません。このため、ユーザー操作を要するコントロール部品やビューは組み込まないでください。

デフォルトインターフェイスの一部または全部を置き換える

iOS 11以降では、Siriやマップのデフォルトインターフェイスの一部または全部を置き換えることができます。ユーザーに対してインターフェイスを表示する前に、Siriは、表示したいデータを表すパラメータのリスト、すなわちINParameter(英語)クラスのインスタンスを構築します。各パラメータは、SiriKitが提供するINInteraction(英語)オブジェクトに含まれるIntentオブジェクトまたはresponseオブジェクトのプロパティと同等です。

パラメータのリストを構築した後、SiriKitはビューコントローラのインスタンスを1つまたは複数作成し、それぞれのconfigureView(for:of:interactiveBehavior:context:completion:)(英語)メソッドを呼び出して、特定のパラメータセットを渡します。configureView(for:of:interactiveBehavior:context:completion:)メソッドが呼び出された際、Appは、指定されたパラメータにカスタムインターフェイスを提供するかどうか判断する必要があります。カスタムインターフェイスを提供する場合は、ビューコントローラのルートビューにサブビューを追加し、パラメータのコンテンツでそれらのビューを更新します。

SiriKitは一度に1つのパラメータのみをconfigureView(for:of:interactiveBehavior:context:completion:)メソッドに渡すことが多いですが、任意のパラメータ数のコンテンツを表示するビューを構成できます。メソッドの終了ハンドラを呼び出す際に、SiriKitに、インターフェイスに表示するパラメータセットを提供します。次のパラメータセットで新規ビューコントローラを作成する前に、SiriKitは、すでにそれらのパラメータを表示したかどうかチェックします。すでに表示した場合、SiriKitはAppに再表示を依頼しません。

デフォルトインターフェイスを拡張する

Siriやマップのデフォルトインターフェイスは保持し、カスタムコンテンツで拡張したい場合は、ビューコントローラのconfigure(with:context:completion:)(英語)メソッドを実装します。SiriKitがビューコントローラをインスタンス化し、メソッドを呼び出してビューコントローラのビューを設定します。コンテキストパラメータによってビューコントローラの表示場所が指示され、Siriやマップとは異なる形で情報を表示できます。

図1は、ビューコントローラを設定してデフォルトインターフェイスを拡張する場合の、ビューコントローラのライフサイクルの概要です。システムはビューコントローラを生成し、configure(with:context:completion:)(英語)メソッドを呼び出します。その際、インターフェイスの設定に必要なインタラクションオブジェクトを渡します。設定が完了すると、ビューコントローラがSiriやマップのコンテンツとともに画面上に提示されます。

図1

Intents UI App Extensionのライフサイクル

インターフェイスを設定するための、Intents UI Extensionの読み込みとビューコントローラメソッドの呼び出し。

ユーザーがSiriやマップのインターフェイスを消去すると、システムは、ビューコントローラやIntents UI Extensionへの参照を解放します。ビューコントローラは、情報を表示することしかできません。画面から消える際に、何らかのデータを保存したり、Appと通信しようとしたりしないでください。

ビューコントローラ実装のヒント

Intents UI Extensionのビューコントローラを実装する際に役立つヒントをいくつか示します。

  • インターフェイスにブランド要素を取り入れる。Appの色や画像、その他の設計要素をうまく活用して、Siriやマップのインターフェイス上でも、当該Appが関わっているとわかるようにしてください。

  • アニメーションは、ビューコントローラが可視になっている間のみ表示する。ビューコントローラのviewDidAppear(_:)(英語)メソッドが呼び出されてからアニメーションを開始してください。アニメーションの停止は、ビューコントローラのviewWillDisappear(_:)(英語)メソッドで行います。

  • ビューコントローラのビューはできるだけ迅速に設定して、Siriが表示できるようにする。ビューコントローラは画面に長時間表示されるとは限らないので、ローカルで取得できるリソースを用い、引数として渡されるINInteraction(英語)オブジェクトから必要な情報を得るだけにして、大部分の設定を済ませるようにします。サーバから情報を取得する必要があれば、非同期に行い、後でインターフェイスを更新してください。

  • 渡されるインタラクションオブジェクトのみを使ってIntentを設定する。渡されるINInteraction(英語)オブジェクトには、当初のIntentと、別のプロセスで実行されるIntents Extensionから提供されるレスポンスが保持されています。渡されるインタラクションオブジェクトのみを使うことで、ビューコントローラのインターフェイスが、Intents Extensionから渡される情報を正確に反映したものになることが保証されます。Intents UI App Extensionにより多くの情報を伝えるには、Intents App ExtensionにレスポンスとともにカスタムNSUserActivity(英語)オブジェクトを含め、このオブジェクトのuserInfo(英語)辞書に追加情報を設定します。

  • 広告をインターフェイスに入れない。ブランド要素や有用な情報は入れても構いませんが、広告は禁止です。

  • カスタムインターフェイスを非表示にするには、サイズとして0を返す。ビューコントローラを画面上に表示しない場合は、設定メソッドのハンドラブロックを呼び出す際に、サイズとしてCGRectZero(英語)を指定します。指定したIntentに関して、表示する追加情報が何もない場合は、ビューコントローラを非表示にしてかまいません。

  • ビューコントローラをマップのコンテキストで表示する場合は、マップビューを含めない。コンテキストパラメータがINUIHostedViewContext.mapsCard(英語)に設定されている場合は、ビューコントローラのインターフェイスにMKMapView(英語)を含めないでください。マップにはすでに地図が表示されているため、2枚の地図で互いに類似する情報を表示するとユーザーの混乱を招きます。

  • 表示内容を切り替える必要があれば、子ビューコントローラを使う。Intents UI App Extensionにはイニシャルビューコントローラが1つしかありません。子ビューコントローラを使うと、異なるIntentの動作や1つのIntentの異なるビューを1か所にまとめることができます。イニシャルビューコントローラの設定時に、該当する子ビューコントローラをインスタンス化し、そのビューをインターフェイスにインストールするだけです。

デフォルトインターフェイスの一部を非表示にする

SiriKitでは、INUIHostedViewSiriProviding(英語)プロトコルのプロパティを使って、デフォルトインターフェイスの一部タイプのコンテンツを非表示にできます。カスタムコンテンツを使ってデフォルトインターフェイスを拡張したい場合は、これらのプロパティを使って、Siriやマップで表示されるコンテンツと重複しないようにします。例えば、配車予約Appでデフォルトインターフェイスに地図を追加する場合は、displaysMap(英語)プロパティを実装し、これを使ってデフォルトインターフェイスで地図を非表示にできます。

デフォルトインターフェイスの一部を非表示する方法について詳しくは、INUIHostedViewSiriProviding(英語)を参照してください。

関連項目

設定

Intents UI App Extensionターゲットの設定

Xcodeプロジェクトを設定し、Siriとマップのインターフェイスのカスタマイズに使用するIntents UI App Extensionを含めます。