iOS 11 の SiriKit の更新プログラム
SiriKit は iOS 10 で導入され、さまざまなサービス ドメイン (トレーニング、乗車予約、通話など) を持ちます。 SiriKit の概念と、アプリで SiriKit を実装する方法については、SiriKit セクションを参照してください。
iOS 11 の SiriKit では、次の新しい意図ドメインと更新された意図ドメインが追加されます。
- リストとメモ - 新機能 アプリがタスクとメモを処理するための API を提供します。
- ビジュアル コード – 新機能 Siri は、連絡先情報を共有したり、支払いトランザクションに参加したりするための QR コードを表示できます。
- 支払い – 支払い操作に対する検索の意図と転送の意図が追加されました。
- 乗車予約 – 乗車のキャンセルの意図とフィードバックの意図を追加しました。
その他に次の新機能があります。
- 代替アプリ名 – 顧客が別の名前/発音を提供してアプリをターゲットにするように Siri に指示するのに役立つエイリアスを提供します。
- トレーニングの開始 – バックグラウンドでトレーニングを開始する機能を提供します。
これらの機能の一部を以下に説明します。 その他の詳細については、Apple の SiriKit ドキュメントを参照してください。
リストとメモ
新しいリストとメモのドメインには、アプリが Siri 音声要求を介してタスクとメモを処理するための API が用意されています。
タスク
- タイトルと完了状態を持ちます。
- 必要に応じて、期限と場所が含まれます。
ノート
- タイトルとコンテンツ フィールドがあります。
タスクとメモは両方ともグループに編成できます。
SiriKit 要求を処理する方法
次の手順に従って SiriKit 要求を処理します。
- Resolve – パラメーターを検証し、ユーザーに詳細情報を要求します (必要な場合)。
- Confirm – 要求を処理できることの最終的な検証と確認を行います。
- Handle – 操作を実行します (データの更新またはネットワーク操作の実行)。
最初の 2 つの手順は省略可能であり (推奨されますが)、最後の手順は必須です。 SiriKit セクションでは、より詳細な手順が記載されています。
Resolve メソッドと Confirm メソッド
これらの省略可能なメソッドを使用すると、コードで検証を実行したり、既定値を選択したり、ユーザーに追加情報を要求したりすることができます。
たとえば、IINCreateTaskListIntent
インターフェイスの場合、必要なメソッドは HandleCreateTaskList
です。 Siri の操作をより詳細に制御できる 4 つの省略可能な方法があります。
ResolveTitle
– タイトルの検証、既定のタイトルの設定 (適切な場合)、またはデータが不要であることを通知します。ResolveTaskTitles
– ユーザーが読み上げたタスクの一覧を検証します。ResolveGroupName
– グループ名を検証し、既定のグループを選択するか、データが不要であることを通知します。ConfirmCreateTaskList
– コードが要求された操作を実行できることを検証しますが、実行しません (データの変更はHandle*
メソッドのみが行います)。
意図を処理する
リストとメモのドメインには 6 つの意図があります。タスクには 3 つ、メモには 3 つです。 これらの意図を処理するために実装する必要があるメソッドは次のとおりです。
- タスクの場合:
HandleAddTasks
HandleCreateTaskList
HandleSetTaskAttribute
- メモの場合:
HandleCreateNote
HandleAppendToNote
HandleSearchForNotebookItems
各メソッドには、特定の種類の意図が渡されています。これには、Siri がユーザーの要求から解析したすべての情報が含まれます (さらに場合によっては、Resolve*
メソッドと Confirm*
メソッドで更新されています)。
アプリでは、提供されたデータを解析してから、データを保存または処理するためのいくつかのアクションを実行し、Siri が話してユーザーに表示する結果を返す必要があります。
応答コード
必須の Handle*
メソッドと省略可能な Confirm*
メソッドは、完了ハンドラーに渡すオブジェクトに値を設定することで、応答コードを示します。 応答は INCreateTaskListIntentResponseCode
列挙型から取得されます。
Ready
– 確認フェーズ中に返されます (つまり、Confirm*
メソッドからは返されますが、Handle*
メソッドからは返されません)。InProgress
– 実行時間の長いタスク (ネットワーク/サーバー操作など) に使用されます。Success
– 成功した操作の詳細 (Handle*
メソッドからのみ) で応答します。Failure
– エラーが発生し、操作を完了できなかったことを意味します。RequiringAppLaunch
– 意図で処理することはできませんが、アプリで操作を実行できます。Unspecified
– 使用不可。エラー メッセージがユーザーに表示されます。
これらのメソッドと応答の詳細については、Apple の SiriKit のリストとメモのドキュメントを参照してください。
リストとメモの実装
まず、SiriKit のサポートを追加するには、iOS アプリの次の手順に従います。
- Entitlements.plist で SiriKit をチェックします。
- Info.plist に Privacy – Siri Usage Description キーと、顧客向けのメッセージを追加します。
- アプリで
INPreferences.RequestSiriAuthorization
メソッドを呼び出して、Siri の操作を許可するようにユーザーに求めます。 - 開発者ポータルで SiriKit をアプリ ID に追加し、プロビジョニング プロファイルを再作成して新しいエンタイトルメントを含めます。
次に、Siri 要求を処理する新しい拡張機能プロジェクトをアプリに追加します。
- ソリューションを右クリックし、[追加] > [新規プロジェクト...] を選択します。
- [iOS] > [拡張] > [意図拡張] テンプレートを選択します。
- Intent と IntentUI という 2 つの新しいプロジェクトが追加されます。 UI のカスタマイズは省略可能であるため、サンプルには意図プロジェクトのコードのみが含まれます。
拡張プロジェクトでは、すべての SiriKit 要求が処理されます。 これは独立した拡張であり、メイン アプリと自動的に通信する方法はありません。このことは通常、アプリ グループを使用して共有ファイル ストレージを実装することで解決されます。
IntentHandler を構成する
IntentHandler
クラスは Siri 要求のエントリ ポイントです。すべての意図が GetHandler
メソッドに渡され、要求を処理できるオブジェクトが返されます。
次のコードは、単純な実装を示しています。
[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
protected IntentHandler(IntPtr handle) : base(handle)
{}
public override NSObject GetHandler(INIntent intent)
{
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return this;
}
// add intent handlers here!
}
このクラスは、INExtension
を継承する必要があります。また、このクラスはリストとメモの意図を処理するため、IINNotebookDomainHandling
の実装も行います。
Note
- .NET には、大文字
I
でプレフィックスを付けるインターフェイスに関する規則があります。 Xamarin は iOS SDK からプロトコルをバインドする際にはこれに準拠しています。 - Xamarin では iOS の型名も保持されます。Apple では、型が属するフレームワークを反映するために型名の最初の 2 文字を使用します。
Intents
フレームワークの場合、型のプレフィックスはIN*
です (例:INExtension
)。しかし、これらはインターフェイスではありません。- また、これによりプロトコル (C#のインターフェイスとなるもの) は、
IINAddTasksIntentHandling
のように 2 つのI
となります。
意図の処理
各意図 (タスクの追加、タスク属性の設定など) は、次に示すような単一のメソッドで実装されます。 このメソッドは、次の 3 つの主要な機能を実行する必要があります。
- 意図を処理する – Siri によって解析されたデータは、意図の種類に固有の
intent
オブジェクトで使用できるようになります。 アプリでは、オプションのResolve*
メソッドを使用してそのデータを検証した可能性があります。 - データ ストアの検証と更新 – (メインの iOS アプリがアクセスできるようにアプリ グループを使用して) ファイル システムにデータを保存するか、ネットワーク要求を介して保存します。
- 応答を提供する –
completion
ハンドラーを使用して Siri に応答を送信し、ユーザーに対して読み取り/表示を行います。
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
var list = TaskList.FromIntent(intent);
// TODO: have to create the list and tasks... in your app data store
var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
{
CreatedTaskList = list
};
completion(response);
}
null
が、応答に対し 2 番目のパラメーターとして渡されることに注意してください。これはユーザー アクティビティ パラメーターであり、指定されていない場合は既定値が使用されます。
カスタム アクティビティの種類は、iOS アプリで Info.plist の NSUserActivityTypes
キーを使用してサポートされている限り設定できます。 その後、アプリを開いたときにこのケースを処理し、特定の操作 (関連するビュー コントローラーを開いたり、Siri 操作からデータを読み込むなど) を実行したりできます。
この例では Success
結果もハードコードされますが、実際のシナリオでは、適切なエラー報告を追加する必要があります。
テスト フレーズ
サンプル アプリでは、次のテスト フレーズが機能します。
- "TasksNotes でリンゴ、バナナ、梨という食料品リストを作成する"
- "TasksNotes にタスク WWDC を追加する"
- "TasksNotes のトレーニング リストにタスク WWDC を追加する"
- "TasksNotes で WWDC 参加を完了済みとマークする"
- "TasksNotes で、帰宅したら iPhone を買うことを自分にリマインドする"
- "TasksNotes で iPhone の購入を完了済みとマークする"
- "TasksNotes で、午前 8 時に家を出ることをリマインドする"
Note
iOS 11 シミュレーターでは (以前のバージョンとは異なり)、Siri でのテストがサポートされています。
実際のデバイスでテストする場合は、SiriKit サポート用にアプリ ID とプロビジョニング プロファイルを構成することを忘れないでください。
別名
この新しい iOS 11 機能は、ユーザーがアプリの別名を構成して Siri で正しくトリガーするようにできることを意味します。 iOS アプリ プロジェクトの Info.plist ファイルに次のキーを追加します。
これらのアプリの別名を設定すると、サンプル アプリ (実際には TasksNotes という名前) で次の語句も機能するようになります。
- "MonkeyNotes でリンゴ、バナナ、梨という食料品リストを作る"
- "MonkeyTodo にタスク WWDC を追加する"
トラブルシューティング
サンプルの実行中または独自のアプリケーションへ SiriKit を追加中に発生する可能性のあるエラーには次があります。
NSInternalInconsistencyException
Objective-C 例外がスローされます。 名前: NSInternalInconsistencyException 理由: クラス<INPreferences: 0x60400082ff00> をアプリから使用するには、エンタイトルメント com.apple.developer.siri が必要です。 Xcode プロジェクトで Siri 機能を有効にしましたか?
SiriKit が Entitlements.plist でオンになって (チェックが付いて) います。
Entitlements.plist は、[プロジェクト オプション] > [ビルド] > [iOS バンドル署名] で構成します。
(デバイスの展開用) アプリ ID で SiriKit が有効になっており、プロビジョニング プロファイルがダウンロードされています。