この記事は現段階(2016/7/18)で一般に公開されている情報を元に作成しています
SiriKit
iOS10からサードパーティのアプリでもSiriを使うことができるようになりました。
ただし開放されたと言ってもなんでもできるようになったわけではなく、できるようになったことは意外と少なく、大きく分けると6種類、細かく分けると16個です。
Intents Domain
以下が今回アプリがSiriに提供できるカテゴリの一覧です。先ほど6種類と書いたものがこちらです。
- VoIP Calling
- Messaging
- Photo Search
- Payments
- Workouts
- Ride booking
これらはIntents Domainと呼ばれ、Siriを使って提供できるサービスのカテゴリを表しています。アプリごとに1つだけではなく複数提供することができるようになっています。どれを提供するかはInfo.plistに記載します。
今回発表されたSiriKitではここに挙げられているDomain以外のことはできません。
なのでSiriをアプリに組み込もう!と思っても上記に該当するサービスを適切な形でアプリが提供できなければSiriとの連携はできないと考えて良いでしょう(工夫次第だと思います)。
User intention
User intentionは直訳すると"ユーザーの意図"ですが、Intents DomainごとにUser intentionが定義されています。以下がその一覧です。こちらが資料。
| Intents Domain | User intention | 概要 | 
|---|---|---|
| VoIP Calling | Start an audio call | 音声通話の開始 | 
| Start a video call | ビデオ通話の開始 | |
| Search the user’s call history | 通話履歴の検索 | |
| Messaging | Send a message | メッセージの送信 | 
| Search for messages | メッセージの検索 | |
| Photo Search | Search for photos | 写真の検索 | 
| Play a photo slideshow | スライドショーの再生 | |
| Payments | Send a payment to another user | 他のユーザーへの支払い | 
| Request a payment from another user | 他のユーザーへの支払い要求 | |
| Workouts | Start a workout | ワークアウトの開始 | 
| Pause a workout | ワークアウトの一時停止 | |
| Resume a workout | ワークアウト再開 | |
| End a workout | ワークアウト終了 | |
| Cancel a workout | キャンセル | |
| Ride booking | Book a ride | 乗車予約 | 
| Get the status of a booked ride | 乗車の予約状況 | 
おそらく将来的にはできることが増えるのでしょうが、現在はこの16個のみとなっています。
LINEなどのメッセージアプリはVoIPによる音声/ビデオ通話の開始、メッセージの送信などが対応可能になるのではないでしょうか。ワークアウト系のアプリは基本的にSiriで操作ができるようになりそうですね。
ただし上記に当てはまらない機能、例えばカメラアプリをSiriで起動してセルフィーを撮ってもらう、とかは今のところできません。
実装方法
上に挙げたUser intentionごとにHandler, Intent, Responseクラスが定義されています。
1. ターゲットの追加
まずはターゲットの追加ですが、ExtensionテンプレートにIntents Extensionというものが追加されているので、これを追加すればOKです。
2. Info.plistの編集
次にInfo.plistの編集を行います。
 
追加したターゲットのInfo.plistにNSExtension > NSExtensionAttributes > IntentsSupportedにサポートするIntentのクラス名を記載します。
例えばワークアウトの開始をSiriでサポートする場合はINStartWorkoutIntentを追加します。
IntentsRestrictedWhileLockedはデバイスがロックされている最中に操作を行えないようにする場合に指定します。
3. Extensionの実装
Siriからの入力を受けとってSiriに結果を返す際の流れは以下のようになっています。

画像はこちらより引用
上記の図の流れとしては、
- 
Resolveでパラメータの解決
- 
Confirmで最終確認
- 
Handleでタスクの実行
という流れになります。
ConfirmとHandleでResponseを返していますが、Siriはこれを使って結果の表示を行います。ResponseにはNSUserActivityオブジェクトが含まれており、これを使ってアプリへ状態を引き継ぐことができます。
実装方法
実装については[UnicornChat](* https://developer.apple.com/library/prerelease/content/samplecode/UnicornChat/Introduction/Intro.html#//apple_ref/doc/uid/TP40017332
)というApple公式のサンプルコードがあるので、それを参考にすると良いです(ベータのため環境によっては動作しないことがあります)。
以下がSiriからのリクエストを処理する際の主要なクラス及びプロトコルについてはこちらにまとまっています。
全ては説明しきれないので、ワークアウトを開始するためのIntentを例に挙げてみます。
SiriKitによるワークアウト開始に必要なオブジェクト
SiriKitを使ってワークアウトを開始する際に必要になるオブジェクトです。
| Start a workout | Objects | 
|---|---|
| Intent | INStartWorkoutIntent | 
| Response | INStartWorkoutIntentResponse | 
| Handler | INStartWorkoutIntentHandlingprotocol | 
INStartWorkoutIntent
IntentのINStartWorkoutIntentはSiriがユーザーの言葉を解釈して変換してくれるオブジェクトです。プロパティにworkoutNameなどが用意されており、ワークアウトを開始するために必要な情報がここに入ってきます。
INStartWorkoutIntentResponse
INStartWorkoutIntentResponseはINStartWorkoutIntentHandling内で処理結果をSiriに伝えるために使用するオブジェクトです。
INStartWorkoutIntentHandling
INStartWorkoutIntentHandlingでINStartWorkoutIntent, INStartWorkoutIntentResponseを使ったパラメータの解決や処理の実行を行います。
まとめ
ざっくりとまとめると以下のようになります。
- 6種類のIntents Domainをサポート
- 全部で16のことができる
- 逆にそれ以外のことはできない
 
- 実装したいドメインのプロトコルの実装を行う
- Resolveでパラメータのバリデーション, Confirmで確認, Handleでタスクの実行
- ユーザーの入力をSiriが解釈してIntentオブジェクトに変換してくれる
 
なお、アプリでSiriを使った機能を有効にするには、カメラへのアクセス等と同様にユーザーの許可が必要になります。許可の取得にはINPreferencesのrequestSiriAuthorization(_:)を使用します。
対応するドメインが少ないですが、今回のSiriKitはiOS10の目玉機能とも言えるので是非ともアプリに組み込みたいですね!!
SiriKitを触ってみた感想としては、周りに人がいると独り言を言っているみたいでSiriKitの動作確認はとてもやりづらいです。なるべく密室で一人で行うことをオススメします😎
資料
スライド
iOS/Android開発Tips共有会であるpotatotips #30でSiriKitについて発表した際のスライドです。
UTの書き方、Embedded frameworkを使用した実装のTipsについても記載しています。
ドキュメント
- https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/index.html
- https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/SiriDomains.html#//apple_ref/doc/uid/TP40016875-CH9-SW2
- https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/SpecifyingCustomVocabulary.html#//apple_ref/doc/uid/TP40016875-CH6-SW1
APIリファレンス
WWDC Sessions
- https://developer.apple.com/videos/play/wwdc2016/217/
- https://developer.apple.com/videos/play/wwdc2016/225/

