SiriKit の概念の理解
この記事では、Xamarin.iOS アプリで SiriKit を操作するために必要な主要な概念について説明します。
iOS 10 の新機能である SiriKit を使用すると、Xamarin.iOS アプリは、iOS デバイス上の Siri と Maps アプリを使用してユーザーがアクセスできるサービスを提供できます。 この機能は、新しい Intents と Intents UI の各フレームワークを使用して、1 つ以上の App Extension で提供されます。
SiriKit を使うと、iOS アプリは、App Extension と新しい Intents フレームワークおよび Intents UI フレームワークを使って、ユーザーが iOS デバイス上の Siri と Maps アプリを使ってアクセスできるサービスを提供できます。
Siri は、関連するタスクの認識アクションのグループであるドメインの概念と連携します。 アプリが Siri とやり取りする各対話は、次のように既知のサービス ドメインのいずれかに分類される必要があります。
- 音声通話またはビデオ通話。
- 乗車予約。
- トレーニングの管理。
- メッセージング。
- 写真の検索。
- 支払いの送受信。
ユーザーが Siri に App Extension のサービスのいずれかが関与する要求を行うと、SiriKit は拡張機能に、サポート データと共にユーザーの要求を説明する Intent オブジェクトを送信します。 その後、App Extension は、指定された Intent に対して適切な Response オブジェクトを生成し、ここに拡張機能が要求を処理する方法を詳しく説明します。
Intents と Intents UI Extension
Siri と Maps アプリの両方が、2 種類の App Extension を介してアプリのサービスと対話します。
- Intents Extension - Siri と Maps にアプリのコンテンツを提供し、サポートされている Intents を満たすために必要なタスクを実行します。
- Intents UI Extension - Siri または Maps のいずれかのアプリのコンテンツに対して表示されるカスタム UI を提供します。
アプリは SiriKit をサポートするために Intents Extension を提供する必要があり、Siri と Maps がユーザーに提示できる情報を提供し、Intents を処理する役割を担います。
通常は、Siri ですべてのユーザーの対話が処理され、サポートされている各ドメインに情報を表示するための標準の組み込み UI は Siri が持っているため、Intents UI Extension の作成は省略できます。 Intents UI Extension を提供することで、アプリは Intent UI フレームワークを使用して、アプリのブランド化と追加情報を特徴とする豊富なカスタム ユーザー インターフェイスを提示できます。
Siri と Maps アプリの役割
ユーザーの音声による要求は、Siri によって言語処理され、意味的に分析されます。この要求は、Intent Extension が処理できる実行可能な Intents に変換されます。
Maps では、アプリの Intent Extension を使用して、ユーザーのアクションに応答してマップ インターフェイスに情報を表示します。 近くのレストランを尋ねる、アプリのレストラン レビューを取得するなどです。
Siri と Maps はどちらも、標準のシステム インターフェイスを使用して、ユーザーのすべての対話を管理し、結果を表示します。 App Extension の主な役割は、表示されるデータを提供することです。 必要に応じて、アプリは Intents UI Extension を提供し、既定のシステム インターフェイスを強化するためのカスタム UI を提示できます。
SiriKit を介した Siri との対話
このセクションでは、SiriKit を使用してユーザーがアプリと対話できるようにする方法の概要について説明します。 この例では、架空の MonkeyChat アプリを使用します。
MonkeyChat は、このアプリ専用のユーザーの友人の連絡帳を保持し、各友人が画面名 (Bobo など) と関連付けられ、ユーザーが画面名で各友人にテキスト チャットを送信できるようにします。
ユーザーがアプリとの対話を開始する方法は多数あり、さまざまなユーザーがさまざまな形式で同じ要求を行う可能性があります。
たとえば、ユーザーが友人の Bobo にメッセージを送信する場合、Siri との間で次のような会話が交わされます。
ユーザー: Hey Siri、MonkeyChat メッセージを送信してください。
Siri: 誰宛に送りますか
ユーザー: Bobo。
Siri: Bobo に何と言いますか
ユーザー: バナナをもっと送ってください。
別のユーザーが、別の会話で同じ要求を行う場合があります。
ユーザー: MonkeyChat で Bobo にメッセージを送信してください。
Siri: Bobo に何と言いますか
ユーザー: バナナをもっと送ってください。
また、別のユーザーがさらに短い言葉で要求を行う場合があります。
ユーザー: MonkeyChat Bobo バナナをもっと送ってください。
Siri: OK、「バナナをもっと送ってください」というメッセージを Monkeychat の Bobo に送信しています。
または、別の言語で同じ要求を行うこともあります。
ユーザー: MonkeyChat Bobo s’il vous plaît envoyer plus de bananes.
Siri: Oui, envoi message s’il vous plaît envoyer plus de bananes à Bobo sur Monkeychat.
さらに別のユーザーが、より言葉数が多い会話で要求を行う場合があります。
ユーザー: Hey Siri、お願い聞いて。MonkeyChat アプリを起動して、もっとバナナを送ってくださいというメッセージでテキストを送信してください。
Siri: 誰宛に送りますか
ユーザー: 私の最高の友人 Bobo。
さらに、Siri が要求に応答する方法は多数あり、その一部は、要求がどのようにされたかに基づきます。
- ホーム ボタンを押して実行 - Siri は言語的フィードバックを限定し、より視覚的な応答を提供します。
- 「Hey Siri」で実行 - Siri はより言語的に応答し、視覚的な応答は少なくなります。
Siri は、ユーザーのアクセシビリティ ニーズを満たすように調整されており、それらのニーズに基づいて対話して応答します。
ユーザーの要求方法や Siri が要求に応答する方法に関係なく、Siri はユーザーとの会話を処理し、(Extension を介して) アプリが機能を提供します。
ユーザーが Siri の言語での要求を行う場合、Siri が従う手順は次のとおりです。
- まず、Siri はユーザーの音声のオーディオを受け取り、テキストに変換します。
- 次に、そのテキストが Intent (ユーザーの要求の構造化表現) に変換されます。
- この Intent に基づいて、Siri はユーザーの要求を実行するためのアクションを実行します。
- 最後に、Siri は、実行されたアクションに基づいて、ユーザーに応答 (ビジュアルと言語の両方) を提供します。
アプリがユーザーの Siri との会話に参加できる主な方法は次の 3 種類です。
- ボキャブラリ - これは、Siri がアプリと対話するために知る必要がある単語を、アプリが Siri に伝える方法です。
- アプリ ロジック - これらは、提供された Intents に基づいてアプリが実行するアクションと応答です。
- ユーザー インターフェイス - これは、アプリが応答を提供できるオプションのカスタム ユーザー インターフェイスです。
例
上記の情報を前提とし、次の会話が MonkeyChat アプリとどのように対話するかを調べます。
ユーザー: Hey Siri、MonkeyChat で Bobo にメッセージを送信して。
Siri: Bobo に何と言いますか
ユーザー: バナナをもっと送ってください。
アプリがこの会話で最初に担う役割は、Siri がユーザーの音声を理解するのを手伝うことです。
Siri のデータベースに "Bobo" という名前はありませんが、アプリにはあり、この情報をボキャブラリを介して Siri と共有しました。 アプリは、Bobo が受信者であることを Siri が認識するのも手伝います。アプリは、Bobo を連絡先として Siri に指定したためです。
Siri は、メッセージを送信するには、受信者以外にも必要な情報があることを認識しているため、メッセージにコンテンツが必要かどうかを App Extension ですばやく確認します。 MonkeyChat に必要なので、Siri はユーザーに「Bobo に何と言いますか」という質問で応答します。
上記の例では、ユーザーは「バナナをもっと送ってください」と応答しました。Siri はこれを構造化された Intent にバンドルします。
構造化された Intent には、次の情報が含まれます。
- ドメイン: メッセージ
- Intent: sendMessage
- 受信者: Bobo
- コンテンツ: バナナをもっと送ってください
すべてのドメインに、その中で実行できる一連の知っているアクションがあり、このドメインとアクションに基づいて、アプリに送信される Intent に、ゼロから多数のパラメーターが含まれる可能性があります。
その後、処理のために Intent が App Extension に送信されます。 Intent を処理した結果、アプリは IntentResponse を生成します。これが Intent にバンドルされ、ここにアプリが Intent で行った操作を説明するパラメータが含まれます。
各 IntentResponse には、アプリが要求を完了できたかどうかを Siri に通知する応答コードも含まれます。 ドメインによっては、送信できる非常に具体的なエラー応答コードを持つものがあります。
最後に、IntentResponse に NSUserActivity
(ハンド オフをサポートするために使用されるものと同様) が含まれます。 NSUserActivity
は、応答を完了するには、Siri 環境を離れ、アプリに入って完了する必要がある場合に、アプリを起動するために使用されます。
Siri は、アプリを起動し、ユーザーが Siri 環境で中断した場所をピックアップするための適切な NSUserActivity
を自動的に構築します。 ただし、アプリは必要に応じて、独自の NSUserActivity
にカスタマイズされた情報を提供できます。
アプリが Intent を処理し、Siri に応答を返した後、結果をユーザーに示します (音声とビジュアルの両方)。
Siri には、アプリで使用できる各ドメインに対して、いくつかの組み込みの応答ユーザー インターフェイスがあります。 ただし、MonkeyChat はオプションの Intent UI Extension を提供しているため、上記の例では、会話の結果をユーザーに表示するためにこの機能が使用されます。
Intent のライフサイクル
Intents を処理するときに App Extension が実行する必要がある主なタスクに次の 3 つがあります。
- アプリは、イベントのすべてのパラメーターを解決する必要があります。 その結果、アプリは解決を複数回 (各パラメーターごとに 1 回) 呼び出し、アプリとユーザーが要求内容に同意するまで、同じパラメーターで複数回呼び出されることがあります。
- アプリは、要求された Intent を処理できることを確認し、予期される結果について Siri に通知する必要があります。
- 最後に、アプリは Intent を処理し、要求された結果を達成するための手順を実行する必要があります。
解決ステージ
解決ステージは、ユーザーが指定した値を Siri が理解するのに役立ち、ユーザーが実際に意図したことが、Intent がアプリによって処理されるときに起きることであるのを確認します。
このステージでは、ユーザーとの会話中にアプリが Siri の動作に影響を与える機会も提供されます。 これを行うには、アプリは解決応答を提供します。 Siri が理解する各種データに対し、さまざまな定義済みの応答があります。
アプリからの最もよくある解決応答は成功です。これは、アプリがパラメータ (ユーザー画面名など) の特定のデータをアプリが認識する情報と照合したことを意味します。
特定の要求が、アプリが認識する正しい情報と一致することをアプリが確認する必要がある場合があります。 このような場合、ConfirmationRequired 応答を送信し、ユーザーに対し、「Bobo the Great にメッセージを送信しますか」などの「はい」または「いいえ」を尋ねる質問をします。
その他に、アプリがユーザーにオプションの短い一覧から選択することを求める場合があります。 この場合、アプリは、ユーザーが選択できる次のような 2 から 10 個のオプションの一覧を含む Disambiguation 応答を提供します。
Who do you want to message?
* Bobo the Great
* Bobo Jr.
* Little Bobo
Siri は、音声で、または Siri UI と対話して選択を行うユーザーを処理し、結果がアプリに送り返されます。
また、アプリがパラメーターを解決するのに十分な情報がない場合や、あいまいさ回避を使用して解決するには一致が多すぎる場合があります (名前に Bobo を持つユーザーが 80 人など)。 この場合、アプリは NeedsMoreDetails 応答を送信し、Siri はユーザーにより具体的な応答を求めます。
ユーザーが Intent を処理するために必要な値を指定しなかった場合は、NeedsValue 応答を送信して、Siri がユーザに対して値の入力を求めるよう指示できます。
特定のパラメータに対してユーザーが指定した値をアプリがサポートしていない場合、アプリは UnsupportedWithReason 応答を送信して、値がサポートされなかった理由を提供できます。 その後、Siri はユーザーにまったく新しい値の入力を求め、その値が必要な理由をユーザーに提供します。
最後に、NotRequired 応答を使用して、アプリが特定のパラメータの値を必要としないことを Siri に伝えます。 それでもユーザーが提供した場合、Siri は無視します。
確認ステージ
確認ステージには、次の 2 つの目的があります。
- Intent を処理した場合に予期される結果を Siri に通知し、これから何が起きるかを Siri がユーザーに通知できるようにします。
- 要求された支払いを行うのに十分なお金が銀行にあるなど、ユーザーが提示した要求を完了するためにアプリが必要とする可能性がある、要求された状態を確認する機会を提供します。
アプリは、確認ステップからの Intent の応答を提供します。これには、Siri がユーザーと効果的にコミュニケーションできるように、アプリが用意可能ななるべく多くの情報が含まれている必要があります。
Siri は、ドメインとアクションの種類に基づいて、支払いの送金や乗車予約の前などに、ユーザーに確認を求める場合があります。
ハンドル ステージ
ハンドル ステージは、Intent を操作する際に最も重要な部分です。これは、要求されたタスクを実行してアプリがユーザーの要求を満たすポイントであるためです。
確認ステージと同様に、Siri がユーザーに関連付けられるように、アプリは結果に関するできるだけ多くの情報を提供する必要があります。 この情報は視覚的に表示される場合と、Siri がユーザーに対して単に読み上げる場合があります。
ネットワーク呼び出しの遅延や、ライブ ユーザーが要求を満たす必要がある場合 (注文の完了と発送、ユーザーの場所への車の運転など) などに、アプリで特定の要求の処理に余分な時間が必要になる場合があります。 Siri がアプリからの応答を待機すると、アプリが要求を処理中であることをユーザーに通知する待機 UI が表示されます。
理想的には、アプリは最大で 2 から 3 秒以内に Siri への応答を提供する必要があります。 特定の応答の処理に時間がかかることがアプリでわかっている場合は、InProgress 応答コードを Siri に送信する必要があります。 その後、Siri は、アプリがバックグラウンドで要求を処理していることをユーザーに通知し、ユーザー Siri 環境を離れた場合でも引き続き実行します。
SiriKit のアプリへの追加
iOS 10 の SiriKit では、Apple は 2 つの新しい Extension ポイントを作成しました。
- Intents Extension - Siri にアプリのコンテンツを提供し、サポートされている意図を満たすために必要なタスクを実行します。
- Intents UI Extension - Siri 内のアプリ コンテンツに対して表示されるカスタム UI を提供します。
次の形式で認識を支援するために、Siri に単語や語句を提供する API もあります。
- アプリ ボキャブラリ - アプリのすべてのユーザーに共通する単語と語句。
- ユーザー ボキャブラリ - 特定のアプリ ユーザーに固有の単語と語句。
Intents Extension
Intents Extension は、アプリと Siri の間の主な対話を次のように処理する役割を担います。
Intent Extension は 1 つ以上の Intents をサポートできます。アプリで SiriKit を実装する方法を決定するのは開発者の判断です。 開発者は、処理する必要がある Intent ごとに個別の Intent Extension を追加することもできます。 しかし、Apple は、Siri がアプリに対して複数のプロセスを開かないように、開発者に Intent Extension の数を制限するよう要請しています。これは、複数のプロセスがあると、処理に必要なメモリと時間が増えるためです。
開発者は、Siri がアクティブな間、Intent Extension がバックグラウンドで実行されることにも注意する必要があります。 これにより、Siri は拡張機能と通信しながらも、ユーザーとの会話をアクティブに交わし、要求に関する情報を処理できます。
プライバシーとセキュリティに関する考慮事項
Apple は、Siri を操作するとき、ユーザーの個人情報が安全であることを確認するための対策を十分に講じてきました。そのため、ユーザーが iOS デバイスにログインする必要がある対話がいくつかあります。 たとえば、乗車依頼や支払いの実行時です。
さらに、アプリがデバイスにログイン中のユーザーに制限する必要がある特定の動作もあります。 このような状況では、アプリはロック中の制限動作を要求できます。 これは、Info.plist
ファイル内の設定を使用して行われます。
ローカル認証フレームワークは Intent Extension で使用できるため、デバイスが既にロック解除されている場合でも、アプリはユーザーに追加の認証情報を要求できます。
最後に、Apple Pay は Intent Extension で使用できるため、アプリは Apple Pay を使用してトランザクションを完了でき、組み込みの Apple Pay シートが Siri インターフェイスの上に表示されます。
さらに、Apple は、ユーザーがサード パーティのアプリに情報を送信するときは、ユーザーがそれを確実に認識することを求めています。そのため、ユーザーは要求を行うときに、アプリの特定の名前 (アプリのバンドル表示名で指定) を言う必要があります。
Apple は、ユーザーとの自然で流暢な会話を実行するように Siri を設計しました。このため、アプリのバンドル名は、ユーザーの要求に自然に収まる場所であれば、音声の多くの部分で使用できます。
ユーザーが行う一般的な操作の 1 つは、アプリの名前を "動詞化" することです。つまり、アプリ名を取得し、それを要求の動詞として使用します。 例: 「MonkeyChat Bobo したバナナは最高でした」
Intents UI Extension
Intents UI Extension は、アプリの UI とブランドを Siri エクスペリエンスに持ち込み、ユーザーがアプリと繋がっていると感じさせる機会を提供します。 この拡張機能を使用すると、アプリはブランドだけでなく、ビジュアルやその他の情報をトランスクリプトに取り込むことができます。
Intents UI Extension は常に UIViewController
を返し、アプリは、最初の応答の後まで続く追加情報を表示するなど、ビュー コントローラー内に何でも追加できます。 Intents UI では、ライドシェア車がユーザーの場所に到達するまでの所要時間など、ユーザーに実行時間の長いイベントの状態の更新情報を提供することもできます。
Intents UI Extension は、UI の上部にあるアプリ アイコンや名前などの他の Siri コンテンツと共に常に表示されるか、Intent に基づいてボタン ([送信] や [キャンセル] など) が下部に表示されます。
Siri が既定でユーザーに表示しているメッセージングやマップなどの情報を、アプリが置き換えられる場合がいくつかあります。この場合、アプリは、既定のエクスペリエンスをそのアプリに合わせて調整されたエクスペリエンスに置き換えられます。
重要
UIButtons
や UITextFields
などの対話型要素は、Intent UI Extension の UIViewController
に追加できますが、非対話型での Intent UI は厳密に禁止されており、ユーザーはそれらを操作できません。
Siri には Intent の種類ごとに既定の UI セットが含まれるため、アプリで Intent UI Extension を提供するかどうかは任意に決められます。 さらに、Intents UI インターフェイスは、Apple がユーザーにとって役に立つと判断した特定の Intents でのみ使用できます。
SiriKit ボキャブラリの追加
SiriKit を実装する最後の部分は、アプリ内に関することで、必要なボキャブラリの提供です。 多くのアプリには、ユーザーに情報を記述する固有の方法と、ユーザーがアプリに情報を提供する固有の方法があります。
このため、Siri がアプリに固有の単語やフレーズを理解するために、アプリの支援を必要とします。 すべてのユーザーがこれらのフレーズを知って理解できるように、これらのフレーズの一部はアプリの一部となります。 ただし、他のフレーズはアプリの特定のユーザーに固有です。
アプリ固有のボキャブラリ
アプリ固有のボキャブラリは、車両の種類やトレーニング名など、アプリのすべてのユーザーに知られる特定の単語とフレーズを定義します。 これらはそのアプリケーションの一部であるため、メイン アプリ バンドルの一部として AppIntentVocabulary.plist
ファイルで定義されます。 さらに、これらの単語と語句はローカライズする必要があります。
ボキャブラリ AppIntentVocabulary.plist
ファイルにはいくつかの部分があります。
- アプリの使用例 - ユーザーがアプリを理解できる要求の一般的なユース ケースのセットを提供します。 例: 「MonkeyFit でワークアウトを開始する。」
- パラメータ - これらは、アプリに固有の一連の標準以外のパラメータ型を提供します。 たとえば、MonkeyFit アプリのワークアウト名などです。 これらは次で構成されます。
- 語句 - アプリでアプリの一意の用語を定義できるようにします。 例: MonkeyFit アプリの "Bananarific" ワークアウトの種類。
- 発音 - 特定の語句の単純な発音のつづりとして、Siri に発音のヒントを提供します。 たとえば、「バ ナナ リ フィク」などです。
- 例 - アプリで指定された語句を使用する例を提供します。 たとえば、「MonkeyFit で Bananarific を開始する」などです。
詳細については、Apple のアプリ ボキャブラリ ファイル形式リファレンスを参照してください。
ユーザー固有のボキャブラリ
ユーザー固有のボキャブラリは、アプリの個々のユーザーに固有の単語または語句を提供します。 これらは、実行時に App Extension でなくメイン アプリから、ユーザーにとって最も重要な使用優先順位で並べ替えられた一連の用語として、最も重要な用語が一覧の先頭に表示された状態で提供されます。
上記の MonkeyChat アプリの例を見てみましょう。 MonkeyChat は、ユーザー固有のボキャブラリを介して Siri に送信されるすべてのユーザーの連絡先の一覧を保持します。 また、ユーザーがメッセージを送信した 10 件の最新の連絡先の一覧が保持され、各ユーザーに対して一連のお気に入りの連絡先が表示されます。 この例では、お気に入りの連絡先がユーザー固有のボキャブラリの先頭にあり、その後に最近の連絡先、その他のユーザーの連絡先の順である必要があります。
ユーザー固有のボキャブラリでは、次の種類の情報がサポートされています。
- 連絡先の名前。
- ワークアウト名。
- フォト アルバム名。
- 写真のキーワード。
アプリが iOS アドレス帳に依存している場合、この情報は Siri で既に利用されているため、アプリは何も実行する必要はありません。 アプリが連絡先の独自の一意のデータベースを持っている場合にのみ、アプリは連絡先名を提供する必要があります。
ボキャブラリを設計するときは、ユーザーが知っており、関心がある必要な値のみを提供します。 電話番号やメール アドレスなどの情報を提供しないでください。
また、ユーザー固有のボキャブラリが変更されたときは、アプリは Siri に迅速に更新情報を伝える必要があります。 ユーザーは、iOS デバイスに追加された瞬間に、Siri に情報を要求することに慣れています。 たとえば、ユーザーがアプリに新しい連絡先を追加する場合は、ユーザーが保存するとすぐにその情報を Siri に送信します。
さらに重要なのは、ユーザーが情報の一部を削除しても、Siri が数時間または数日後にその情報を認識した場合に、ユーザーが混乱する可能性があるため、アプリは Siri ボキャブラリから情報をすぐに削除する必要があります。
重要
ユーザーがアプリのリセットを選択した場合、またはログアウトした場合、アプリは Siri からすべてのユーザー固有のボキャブラリを削除する必要があります。
SiriKit のアクセス許可
SiriKit の最後の部分は、アクセス許可に関することです。 iOS の他の機能 (写真、カメラ、連絡先など) を使用する場合と同様に、アプリが Siri と通信するための明示的なアクセス許可をユーザーが与える必要があります。
アプリは、Siri に提供する情報を定義する文字列を提供し、ユーザーがこのアクセス許可を付与する必要がある理由を示します。
Apple は、ユーザーが iOS 10 にアップグレードした後、初めてアプリを開いたときに、アプリは Siri を使用するためのアクセス許可をユーザーに要求する必要があることを提案しています。 これは、ユーザーが最初の要求を行う前に、Siri 統合について知り、事前に承認された使用方法を実施できるようにするためです。
SiriKit と Maps
SiriKit は iOS の不可欠な部分であり、iOS 10 に追加されたより大きな Intents フレームワークを利用します。 Intents フレームワークは、一般的および共有のアクションと意図をシステムの他の部分と共有するように設計されています。
Intents フレームワークは、Siri 統合だけでなく、アプリが特定の連絡先の既定のテレフォニーまたはメッセージング アプリになる可能性がある連絡先統合などの他の機能を提供します。 また、Intents は CallKit と緊密に統合され、可能な限り最高の VOIP エクスペリエンスをユーザーに提供します。
iOS 10 の Maps アプリには、ユーザーが Maps UI 内で直接乗車を予約できるライドシェアなどの機能が追加されています。 SiriKit は Maps に共通の拡張ポイントを提供するため、Siri と Maps の間でライドシェアやその他の Intents を共有できます。
つまり、アプリが SiriKit 拡張機能を採用している場合は、Maps 統合も無料で取得できます。
優れた Siri エクスペリエンスの設計
アプリを Siri に統合するときの優れたユーザー エクスペリエンスの設計は、優れたアプリのユーザー インターフェイスの設計とは異なります。 ユーザーが画面上で直接アプリを操作する通常の状況とは異なり、Siri を使用すると、ビジュアル インターフェイスがまったく表示されない場面が多くなります。 たとえば、ユーザーが会話を「Hey Siri」で開始した場合です。
Siri が開発者にどのように役立つか
アプリと Siri の対話を設計する場合、アプリは会話的インターフェイスを構築します。つまり、コンテキストは、Siri がアプリの代わりにユーザーと行う会話から派生します。
ビジュアルでの参照がない場合、ユーザーは自分の頭の中の情報をたどる必要があります。 このため、Siri は、ユーザーが実行するタスクを達成するために必要な最小限の情報を提示します。
会話インターフェイスは、会話中にユーザーと Siri の両方からの質問と応答によって形成されます。 そのため、このインターフェイスを設計する際は、Siri が質問し応答する方法について考えるのが重要です。
ユーザーがメッセージを作成している次の例を考えてみましょう。Siri は質問に「送信準備できましたか?」と応答する場合があります。 ユーザーは、「送って」、「キャンセル」などと答えるか、この質問とはまったく関係のない何かを答えるなど、さまざまな方法で応答する可能性があります。 会話の進み方がどうであっても、Siri はアプリのために会話に対応し、関連情報が使用可能になったときにのみ、アプリに関連情報を送信します。
ユーザーが Siri との会話を開始する方法はいくつかあります。
- デバイスを選択し、[ホーム] ボタンを押します。 この状況では、Siri はビジュアル インターフェイスを増やし、言語応答を減らします。
- 「Hey Siri」と言うことで、ハンズ フリーの会話を開始します。 この状況では、Siri はビジュアルが少なく、言語が多くなります。
- 特別なニーズを持つユーザー向けに UI を調整する Bluetooth 対応の聴覚補助などのアクセシビリティ機能を使用します。
- ユーザーの気が散る事柄を最小限に抑え、運転に集中し続ける必要がある CarPlay を使用します。
開発者が Siri を支援する方法
アプリを Siri と統合する場合、開発者はこの統合を頻繁にテストし、同じ情報またはタスクの要求をできるだけ多くの異なる方法で実施することで、多くの異なる要求を行っていることを保証する必要があります。
2 人の人が同じように考えることはないため、開発者は可能な限り多くの異なるベータ テスト担当者を集め、Siri の統合を微調整するのが重要です。 ユーザーが情報を求める、または何かを要求する方法は、開発者が及びもつかないものであることがあり、この微調整は、最も広範なユーザー グループが Siri でアプリを使用する優れたエクスペリエンスを確保するのに役立ちます。
テストはさまざまな状況や環境で行います。 可能なすべての方法で Siri との会話を開始して、これらの会話が流暢で自然な状態を保ちます。 混雑したジムなど、ユーザーがアプリを使用しそうな場所でテストします。
Siri が要求と結果を適切に表すために必要なすべての情報を、アプリがユーザーに提供していることを確認します。 これは、ハンズ フリーの状況で Siri を使用する場合に特に当てはまります。
Siri の設計ガイドライン
Siri がアプリの代わりにユーザーと会話していることを常に覚えておいてください。 開発者は、この会話が可能な限り流暢で自然な状態を保つことを保証したいと考えます。
重要な会話と同様に、開発者は次のことを確認する必要があります。
- アプリが会話に備えていること。
- アプリが、ユーザーが達成しようとしている内容を正確に把握すること。
- アプリが適切な質問を適時にすること。
- アプリがユーザーが探している情報を使用して要求に応答すること。
会話の準備
最初に覚えておくべき点は、アプリのユーザーは、開発者が思うようにはならないことです。 ユーザーは異なる背景を持ち、異なる言語を話し、アプリを操作するときに特別なニーズを持っている可能性があります。
さらに、開発者はアプリを設計して構築したため、アプリとその内部動作と、一般的なユーザーは持たない機能の両方について、深く詳細な知識を持っています。 そのため、開発者は通常のユーザーとは異なる方法で Siri に要求を尋ねる可能性があります。
これが、可能な限り多くの異なるユーザーが Siri を介してアプリと対話するのが重要な理由です。 ユーザーは、開発者に及びもつかない方法、または開発者が考慮しなかった方法で、Siri を介してアプリに要求を行う可能性があります。
アプリがよいリスナーであることを確認する
開発者は、アプリがよいリスナーであり、ユーザーの期待に応える会話の詳細を把握していることを確認する必要があります。 ただし、要求されたタスクを達成するためにアプリが必要とするすべての情報を提供していない可能性もあります。
アプリでこの状況を処理するには、いくつかの方法があります。
- 不足値のために適切な既定値を選択する - たとえば、ライドシェア アプリは、ユーザーが乗車位置を指定しなかった場合、既定でユーザーの現在の場所に設定するのが適しています。
- 学習に基づく推測を行う - アプリがユーザーに関して収集した特定の情報を使用して、アプリは不足した情報に関して単に推測する、または学習に基づいて推測できる場合があります。不足している携帯電話番号情報をユーザーの連絡先情報から埋めるなどです。 ただし、最も高価なオプションを選ぶなど、ユーザーにとって不適切な選択肢は避けるよう注意する必要があります。
- 詳細情報の入力を求める - アプリは、Siri がユーザに対して不足した値の入力を求めるよう指示できます。 しかし、ここで重要なのは、会話をシンプルに保つことです。 要求を達成するために、複数の質問に答える必要がある場合、ユーザーはすぐにイライラし始めます。
- 誤った情報を適切に処理する - ユーザーは、アプリが予期していなかった値、または特定のコンテキストで処理できない値を提供する可能性があります。 アプリは、この状況をユーザーがわかりやすく簡単に修正できる方法で、ユーザーに関連付けます。
問題の 1 つの値がアプリに提示される場合、これを処理する推奨される方法は、Siri にユーザーの確認を求めさせることです。 たとえば、「Bobo the Great ですか?」のように、ユーザーが単純な「はい」、「いいえ」で答えられる質問です。
1 つの値に対して複数の選択肢が正しい可能性がある場合は、あいまいさ回避が処理方法として適しています。 この状況では、Siri は最大 10 個のオプションから選択するようにユーザーに求められます。 次に例を示します。
Who do you want to send the message to?
* Bobo the Great!
* Bobo Jr.
* Little Bobo
それでも問題が解決されない場合は、Siri がユーザーに対し、特定の値に対するまったく新しい、より具体的な回答を提供することを求めるよう指示します。
最終確認を要求する
アプリがユーザーの要求を満たすタスクを実際に実行する前に、Siri は App Extension を確認して、すべてが適切に配置されていることを確認します。 たとえば、ユーザーは、要求された支払いを行うために十分なお金を口座に持っているでしょうか。
さらに、アプリは、Siri がユーザーに提示できるように、可能なすべての情報を Siri に提供していることを確認し、実行されるタスクがユーザーの期待値を満たしていることを確認する必要があります。
ユーザーが要求を確認し、アプリが要求を実行したら、アプリは、すべての結果が Siri に返されたことを確認して、それらをユーザーに関連付けられるようにする必要があります。
要求への応答
Siri には、認識しているドメインとアクションごとに、いくつかの組み込みのユーザー インターフェイスがあります。 ただし、必要に応じて、アプリはカスタムの Intent UI Extension を提供して、アプリのブランド化と UI、または要求に存在していた以上の情報を提示することで、ユーザー エクスペリエンスを強化できます。
そうは言っても、Siri 用のカスタム インターフェイスを設計するときは、制約を使用する必要があります。 通常、ユーザーはできるだけ早く特定のタスクを済ませたいと考えます。また、不要な情報で過剰になるのを望みません。
また、ユーザーがデバイスを持っているか使用している可能性があるさまざまな iOS デバイスと方向で、カスタム UI が正しく表示され、応答するように注意する必要があります。
必要に応じて、SiriKit API を使用して、既定の Siri UI に既に存在する冗長な情報を非表示にします。 ただし、アプリが Siri に情報を提供し、ハンズ フリーの状況で音声で提供できることを確認します。
ユーザーが要求した写真の提示など、ユーザーの要求を満たすために Siri がアプリを起動する場合があります。 このような状況では、ユーザーを驚かさないでください。 中間ステップやそれ以上の対話を必要とせずに、予想される情報を表示します。 情報を表示したり、ユーザーが予期していないタスクを実行したりしないでください。
デザインの洗練
Apple が会話的インターフェイスの設計を洗練させることを推奨するいくつかの手順があります。 まず、明確で簡潔なボキャブラリとユース ケースの例を Siri に提供します。
ユーザーがアプリを見つける方法の 1 つは、Siri との会話を開始し、「何ができますか」と尋ねることです。Siri は、開発者のアプリや、plist
ファイルを介して提供されたヒーロー ユース ケースの例など、Siri が実行できる何種類かの操作を表示します。
適切なユース ケースの例を記述する方法:
- 例にアプリ名が含まれるようにします。
- 例は短く簡潔にします。
- アプリがサポートする Intents ごとに複数の例を提供します。
- アプリの最も一般的なユース ケースに基づいて、Intents とその中の例の両方に優先順位を付けます。
- アプリがローカライズされた例を提供していることを確認します。
- 指定された各例がアプリ内で期待どおりに動作することを確認します。
- Siri を呼び出さないように、例の中に「Hey Siri」のようなテキストは含めないでください。
- 「お願い」や「ありがとう」などの不要な社交辞令は避けてください。
適切な時間を取って、Siri がユーザーに代わって行っている会話をアプリがどのように形成できるかを調べて実験します。 アプリとの対話やアプリの期待が時間の経過と共に変化する可能性があるため、プロセス全体を通して典型的なユーザーとの対話を試してください。
Siri との会話を呼び出すため、常にさまざまな状況やさまざまな方法でアプリをテストします。 ユーザーがオフィスやデスクから離れ、アプリを使用している可能性がある実際の場所でテストします。
Siri (アプリの代理) との会話が、流暢で自然であり、"ちょうど良いと感じる" ように努めます。
まとめ
この記事では、SiriKit を使用するために必要な主要な概念について説明し、Xamarin.iOS アプリと対話して、iOS デバイス上で Siri と Maps アプリを使用してユーザーがアクセスできるサービスを提供できることを示しました。