アプリにSiriKitを導入する
iPhoneには音声アシスタント “Siri” がデフォルトで搭載されていますが、年々カスタマイズ性が増してきています。iOS13からは新たに対話型のショートカットが追加されたり、メディア再生が扱いやすくなる変更が入ります。ここで改めて、SiriKitについて理解していきましょう。
SiriKitについて
Siriによる操作を可能にするためには、SiriKitを使ってExtensionを作成する必要があります。iOS13の時点でSiriKitでできることは以下の12個です。
- メッセージ
- ToDoリストとメモ
- ワークアウト
- 送金
- 通話
- QRコード
- 写真の検索
- 配車予約
- カーコマンド(車の施錠など)
- CarPlay
- レストランの予約
- メディアの再生(iOS13より)
これらはDomainと呼ばれ、それぞれがいくつかのIntentを持っています。Intentとは音声操作によって実行できる具体的なアクションです。例えば、メッセージの送信やToDoリストの追加などがあります
SiriKitの実装
それでは実際にSiriKitを実装してみましょう。SiriKitの実装は、以下の3ステップです。
- アプリ設定にてSiriを有効にする
- SiriKitの実装に必要なExtensionの追加
- 取り扱うIntentsの指定
- Siriの利用許可要求の実装
- Intentsを受け取るHandlerを実装
1. アプリ設定にてSiriを有効にする
Targets
のCapabilities
からSiri
の項目をオンにします。
2. SiriKitの実装に必要なExtensionの追加
Siriによる音声操作はアプリを立ち上げずバックグラウンドで処理するため、Extensionに処理を実装します。SiriKitに関連するExtensionは以下の2つです。
Intents Extension
Intents UI Extension
(任意)
Intents Extensionでは、Siriから受け取ったコマンドの処理を行います。Intents UI Extensionでは、Siriの応答画面上に表示される処理結果の表示をカスタマイズすることができます。こちらのExtensionの実装は任意です。
ExtensionはTargetsの下にある+
ボタンから追加できます。Intents Extensionの名前を入力するダイアログにてInclude UI Extension
のチェックを入れると、同名でIntents UI Extensionも作成してくれます。
Extensionを作るとActivateするかどうか尋ねるダイアログが表示されるので、必ずActivateしましょう。
3. 取り扱うIntentの指定
次に、アプリでサポートするIntentsを指定します。先ほど作成したIntents Extensionの中に含まれるInfo.plistにて、NSExtension
> NSExtensionAttributes
> IntentsSupported
内にサポートするIntentを追加します。Intentの種類は公式ドキュメントから確認できます。デフォルトで追加されているIntentが3つありますが、必要がなければ消してしまいましょう。
4. Siriの利用許可要求の実装
カメラやマイクを扱う時と同じように、Siriを利用する際にもユーザに許可をもらう必要があります。アプリのInfo.plist内にNSSiriUsageDescription
を追加し、権限要求時のアラートに表示される文字列を入力します。
次に、この権限要求アラートを出すコードを実装します。AppDelegateや適切なViewControllerなどで表示しましょう。
5. Intentsを受け取るHandlerを実装
あとは、Siriから受け取ったIntentsを処理するHandlerを実装するだけです。Intents Extension内のIntentHandler.swift
に、サポートするIntentsの分だけHandlerを追加します。<Intent名>Handling
というプロトコルが用意されているので、それを継承しhandle(intent:completion:)
メソッドを宣言します。引数にSiriから受け取ったIntentが渡ってくるので、ここからユーザが発したフレーズなどを取り出し、処理を行います。
Intentにより取り出せる情報は異なりますが、例えばINCreateNoteIntent
からは、ノートのタイトルとなるtitle
, ノートの内容となるcontent
が取り出せます。各Intentの詳細はドキュメントを参考にしてください。
Extensionはアプリ本体とは離れた存在なので、UserDefaults.standard
を使ったりすることができません。内容を端末に保存する場合には、App Groups
を有効化して、そのグループで共有される別のUserDefaultsを扱う必要があります。少し長くなるので、本記事では割愛いたします。
SiriKitのテスト
以上で、SiriKitの実装は完了です。Siriからアプリを動かしてみましょう。SiriKitのテストを行うには、ビルドするスキーマにIntents Extensionを選択して実行します。Extensionを走らせるアプリを聞かれるので、Siriを選択しましょう。ビルドが完了するとSiriの応答画面が表示されるので、サポートしたIntentが対応するフレーズを話しかけましょう。例えばINAddTasksIntent
では、「(<アプリ名>で)買い物リストに牛乳を追加して」のようなフレーズに対応しています。こちらも各Intentの詳細はドキュメントに載っています。
テスト時に1つ注意しなければいけない点があります。Intents Extension内でエラーが発生した場合、Extensionはバックグラウンドで実行されているため、Xcode上でエラーがキャッチされません。代わりに、Siriから「その操作を実行することはできません」と返ってきます。Intentの登録やプロトコルの実装がきちんとされている場合は、Handler内の処理を確認してみてください。
リクエストの処理方法
Siriで受け取ったリクエストをどのように処理しているかを、少し詳しく見ていきましょう。Siriがリクエストを認識すると、Intents Extensionが立ち上がります。Extensionにて、認識したリクエストをResolve, Confirm, Handleの3ステップで処理します。この3ステップは、先ほどHandlerの実装で出てきた<Intent名>Handling
が対応するメソッドを提供しています。
Resolveでは、Siriから受け取ったIntentが処理可能かどうかを判定します。例えば「再生して」と言われた曲が見つからなかったりした場合には、この時点でエラーを返すことができます。
Confirmでは、リクエストされた処理を実行する前に、ユーザに確認することができます。例えば送金リクエストなど、大きなアクションが起こる場合に利用します。
Handleでは、リクエストに対する処理を実行します。ResolveとConfirmの実装は任意ですが、Handleを行うメソッドは実装が必須です。
以上でSiriKitの解説と実装方法についての解説を終わります。音声アシスタントの利用はどんどん増加していますので、この機会にアプリに導入してみてはいかがでしょうか 🎤
参考文献