SiriKitを試してみた集

SiriKitで実装できること6つを試してみた。
実際のイメージと（SiriKitを初めて触ったので、）基本的なことを記述しました。

試してみた6つのドメイン（以下の機能を持つアプリがSiri連携できる）

- audio-video calling(通話機能のあるアプリ)
- messaging（メッセージ、チャット機能のあるアプリ）
- payments（支払い機能のあるアプリ）
- photo-library（写真のライブラリーを使用するアプリ）
- workout（ワークアウトをするアプリ）
- ride-booking（乗車予約を管理するようなアプリ）

#SiriKitはこんな感じで使える

##Audio-Video calling
Siriから通話アプリの電話をかける。
`INStartAudioCallIntent`
<blockquote class="twitter-video" data-lang="ja"><p lang="no" dir="ltr">INStartAudioCallIntent <a href="https://t.co/9UKchTDVqS">pic.twitter.com/9UKchTDVqS</a></p>&mdash; njcrd (@njc_rd) <a href="https://twitter.com/njc_rd/status/830972205424992256">2017年2月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Audio-Video callingでできること

- 音声通話を開始する
- ビデオ通話を開始する
- ユーザーの通話履歴を検索する

##Messaging
Siriから、チャットアプリでメッセージを友達に送る。
`INSendMessageIntent`
<blockquote class="twitter-video" data-lang="ja"><p lang="no" dir="ltr">INSendMessageImtent <a href="https://t.co/O5zFLadGhl">pic.twitter.com/O5zFLadGhl</a></p>&mdash; njcrd (@njc_rd) <a href="https://twitter.com/njc_rd/status/822239231728717824">2017年1月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Messagingでできること（公式ドキュメントより）

- メッセージを送る
- メッセージを検索する
- メッセージの属性をセットする（既読にするなどのアクション）


##Payments
Siriから、アプリの中の支払処理をする。（ApplePayなど）
`INSendPaymentIntent`
<blockquote class="twitter-video" data-lang="ja"><p lang="en" dir="ltr">INSendPaymentIntent <a href="https://t.co/TYVvFb935w">pic.twitter.com/TYVvFb935w</a></p>&mdash; njcrd (@njc_rd) <a href="https://twitter.com/njc_rd/status/822239964922462209">2017年1月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Paymentsでできること

- 他のユーザーに支払いをする
- 他のユーザーへ支払い要求をする


##Photo-library
Siriからフォトライブラリーの中の写真をある条件（日付）で探す。
`INSearchForPhotosIntent`
<blockquote class="twitter-video" data-lang="ja"><p lang="en" dir="ltr">INSearchForPhotosIntent <a href="https://t.co/sPntN6GGxb">pic.twitter.com/sPntN6GGxb</a></p>&mdash; njcrd (@njc_rd) <a href="https://twitter.com/njc_rd/status/830997039819350016">2017年2月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Photo-Libraryでできること

- 写真を検索する
- 写真のスライドショーを再生する

##Workout
Siriからウォーキングを開始する。
`INStartWorkoutIntent`
<blockquote class="twitter-video" data-lang="ja"><p lang="en" dir="ltr">INStartWorkoutIntent <a href="https://t.co/ix9gdbj7zV">pic.twitter.com/ix9gdbj7zV</a></p>&mdash; njcrd (@njc_rd) <a href="https://twitter.com/njc_rd/status/830994131044282368">2017年2月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Workoutsでできること

- ワークアウトを開始する
- ワークアウトを中断する
- ワークアウトを再開する
- ワークアウトを終了する
- ワークアウトをキャンセルする


##Ride-booking
Siriから、乗車手配をする。（Mapアプリからも行える。）
`INRequestRideIntent`
<blockquote class="twitter-video" data-lang="ja"><p lang="da" dir="ltr">INRideSharingDomainHandling <a href="https://t.co/ZxxpTWtDLy">pic.twitter.com/ZxxpTWtDLy</a></p>&mdash; njcrd (@njc_rd) <a href="https://twitter.com/njc_rd/status/822240549889417216">2017年1月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Ride-bookingでできること

- 利用可能な乗り物のリストを取得する (Mapsアプリのみ)
- 乗車予約する
- 乗車予約のステータスを確認する


#SiriKit基礎まとめ

##SiriKitとは
以下の２つのフレームワークで構成されるAppExtensionの一つ。

- **Intents Extension**: Siriでユーザーが行いたいことを判断し、処理する（必須）
- **IntentsUI Extension**: Siri, Mapsアプリのインターフェースをカスタマイズできる（オプショナル）

6種類の機能を含むアプリをSiriから会話を通して処理を行うよう機能拡張できる。

- audio-video calling　(通話機能のあるアプリ)
- messaging　（メッセージ、チャット機能のあるアプリ）
- payments　（支払い機能のあるアプリ）
- photo-library　（写真のライブラリーを使用するアプリ）
- workout　（ワークアウトをするアプリ）
- ride-booking　（乗車予約を管理するようなアプリ）

例えば、自分で音楽アプリを開発していて、「Siriから気分に合わせて、音楽を再生させたい！」など、自由なことはできない。（今のところ）

##Siriがどう動くか
![スクリーンショット 2017-01-19 9.20.38.png](https://qiita-image-store.s3.amazonaws.com/0/68056/a6328efc-6e7d-c778-949a-e22c4d37248c.png)

**処理の流れ**

1. ユーザーがSiriに話しかけた内容を理解する(audio→text変換)。
2. ユーザーが言ったことから、その意図(**intent**)を理解する。
3. ユーザーがしてほしいことを処理するためのアクションを行う。
4. 視覚、会話の両方でレスポンスを提供する。

**アプリ側で用意するもの**

- **Vocaburaly**(語彙)：各フェーズで用意しなければならないのは、Siriがユーザーの意図を理解するために必要（1、2）
- **App Logic**(アプリのロジックの実装)：ユーザーの意図する処理を行うために必要（3）
- **UI Design**(デザイン)：アクションのレスポンスをSiri上に表示するために必要(4)

##SiriKit用語
###ドメイン(domain)
Siriはドメインというアイディアの中で全てを考える。

> *"At a high level, Siri thinks about everything in the idea of a domain."*
> (Introduction to SiriKit @WWDC2016)

ドメインは、具体的には、SiriKitで実装できる機能のこと。
現在は、SiriKitが実装できるのは以下の6つ。

- audio-video calling(通話機能)
- messaging（メッセージ、チャット機能）
- payments（支払い機能）
- photo-library（写真のライブラリーを使用）
- workout（ワークアウト）
- ride-booking（乗車予約管理）

この他、CarPlayとRestaurant Reservationが用意されているが、使用に制限あり。（詳しくは、Appleの[SiriKit公式ドキュメント](https://developer.apple.com/library/content/documentation/Intents/Conceptual/SiriIntegrationGuide/)）

###インテント(intent)
英訳すると、「意図」、「趣旨」といった意味。
インテントとは、Siriが理解、アプリとやりとりできるアクションのこと。
> "An intent describes a known action that Siri understands and can communicate to your app."
> (Introduction to SiriKit @WWDC2016)

各ドメイン毎にいくつかのインテントが存在し、Siriはユーザーが言ったことからどのインテントを使用するか判断する。

###パラメーター(parameters)
全てのインテントにはパラメーターが含まれている。
実際に処理を行う際に用いる、値のこと。

例えばSiriに以下のように尋ねてみる。
*「Hey Siri、**UnicornPay**で**Buttercup**に**rainbow polish**の代金**$85**を送って」*

SiriはPaymentsドメインの中の支払いを行うためのインテントだと理解し、内容から処理に必要なパラメーターを取得する。

＜上の文章から取得できるパラメーター＞
**UnicornPay** →　アプリ名
**Buttercup** →　お店の名前
**rainbow polish** →　支払うサービスの名前
**$85** →　USドル

##インテントをどう扱うか
Siriは、データを集め、それらを処理するintentsオブジェクトに変化させることでユーザーのリクエストを操作する。
ユーザーが喋った内容から、どのインテントで処理するかの判断はSiriが行うが、Siriを通して実行したい処理は実装する必要がある。
使用するインテント毎に、Resolve、Confirm、Handleメソッドが用意されている。

- **Resolve（解決）**: ユーザーの意味することを理解する段階。
- **Confirm（確認）**： アプリがユーザーがリクエストするインテントを処理することができるか確認する段階
- **Handle（処理）**： ユーザーがリクエストする特定のアクションを処理する段階

使用するインテント毎に、Resolve、Confirm、Handleメソッドが用意されている。
**Handleメソッドは必ず実装しなければならないが、Resolve、Confirmは必須ではない。（実装が強く推奨されている）**