SiriKit組み込んでみた

### はじめに
歌と踊りが大好きな Titaniumer の皆様、今年も一年お疲れ様でした。
早いですね。もう Advent Calendar な時期ですか。

今年も盛り沢山な一年でした。
短期ですが @yagi_ さんのお手伝いをさせていただきました。
私が抜けた後のコミットっぷりを見ていると、まだまだ自分の力量不足を痛感しております。
精進しないと。
その際に @shinout さんの faster-titanium にはお世話になりました。
この場を借りて御礼申し上げます。
（便利だからみんな使ってみましょう！）

### SiriKitについて
iOS10 にて SiriKit が公開されました。
詳細はこちら ー＞ https://developer.apple.com/sirikit/
Siri ちゃんと自分のアプリが連携できます。
話しかけるだけでコンテンツやサービス等、アプリケーションの挙動を制御できるのです。

SiriKitのサポート機能はドメインに分かれています。
アプリに組み込むためには、以下のいずれかのドメインに対処する必要がある、とのことです。

- VoIP通話
- メッセージ交換
- 決済
- 写真
- ワークアウト
- 配車予約
- CarPlay（自動車製造会社のみ）
- レストラン予約（Appleからの追加サポートが必要）

で、各ドメインにはアプリが実行可能なタスクが定義されています。
ユーザが何をしたいかという「意図」を表すもので、Intent と呼びます。
例えばメッセージ交換であれば以下の Intent があります。

- メッセージを送る　「（アプリ）で（太郎に）メッセージ送信」
- メッセージを検索する　「（アプリ）で（太郎の）メッセージを探して」
- メッセージの属性を設定する　「・・・・？」

今回はメッセージ交換の組み込み手順を書いてみようと思います。
注：コードは書いてません。

### Titanium プロジェクト作成
なにはともあれまずは Titanium のプロジェクトを作成します。
名前は sirichan にしておきます。

```bash
$ ti create --id dev.kurom96.sirichan --name sirichan --platforms ios --type app --workspace-dir .
```

### XCode で空のプロジェクトを作成
プロジェクトのルートディレクトリに extensions ディレクトリを作成します。

XCode を起動して、新規に空プロジェクトを作成します。
File > New > Project

![スクリーンショット 2016-12-02 16.57.45.png](https://qiita-image-store.s3.amazonaws.com/0/86201/e80e45b3-e146-ff80-cd0a-aec4c275b0fd.png)
名前は sirichan にします。
先ほど作成した extensions ディレクトリ配下にプロジェクトを格納します。

### エクステンションの作成
File > New > Target
iOS > Application Extension > Intents Extension

![スクリーンショット 2016-12-09 11.06.55.png](https://qiita-image-store.s3.amazonaws.com/0/86201/aa696acb-c520-1178-7293-85f332cefe3e.png)

バンドルIDが `dev.kurom96.sirichan.sirichan` となるようにしています。
アクティベートのダイアログが表示されますが、ここではキャンセルします。

sirichan の「Automatically manage signing」のチェックを外しておきましょう。
![スクリーンショット 2016-12-09 11.11.47.png](https://qiita-image-store.s3.amazonaws.com/0/86201/ec46f2c5-6949-38bf-b448-36a13b97abae.png)

### プロビジョニングプロファイルの作成
[apple のデベロッパーサイト](https://developer.apple.com/account/)にて、プロビジョニングプロファイルを作成します。
ここで作成するのは、Siriにアクセスするエクステンション用のプロビジョニングプロファイルです。
アプリの実機インストール用は別途ご用意ください。

まずは APP IDs の登録

ワイルドカードで登録しておきます。
com.kurom96.sirichan.*

App Services にて **SiriKit** にチェックして作成します。
![スクリーンショット 2016-12-09 13.39.33.png](https://qiita-image-store.s3.amazonaws.com/0/86201/bcc67830-0590-be9f-9bb1-3b8113ff5820.png)

上記アプリのプロビジョニングプロファイルを作成します。
（作成方法はここでは割愛します）

作成し終わったらダウンロードしておきましょう。

### tiapp.xml に extension を追加

tiapp.xml の `<ios>` セクションに以下を追加します。
`<provisioning-profiles><device>` に先ほど作成したプロビジョニングプロファイルのIDを指定します。

```xml:tiapp.xml
<extensions>
	<extension projectPath="extensions/sirichan/sirichan.xcodeproj">
		<target name="sirichan">
			<provisioning-profiles>
				<device>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</device>
				<dist-appstore/>
				<dist-adhoc/>
			</provisioning-profiles>
		</target>
	</extension>
</extensions>
```

`<ios><plist><dict>` に以下のキーセットを追記します。

```xml:tiapp.xml
<key>NSSiriUsageDescription</key>
<string>アプリでSiriを使っても良いですか？</string>
```

### entitlements の作成

プロジェクトのルートディレクトリに sirichan.entitlements ファイルを作成しアプリから siri へのアクセスを許可します。

```xml:sirichan.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.siri</key>
    <true/>
</dict>
</plist>
```

### ビルドして端末にインストールしてみよう！

```bash
$ ti build -p ios -T device
```

デバイスへのインストールが完了したら Siri ちゃんに話しかけてみましょう！

> sirichan でメッセージを送信（照

![IMG_4307.jpg](https://qiita-image-store.s3.amazonaws.com/0/86201/0e0eb3b1-7e66-0992-428f-96d5eabc8cd9.jpeg)

・・・あれ？

アプリ名に Siri とかの文言を含んでいると、自意識が高い Siri ちゃんは自分のことだと勘違いしちゃうようで。。。
メッセージをタップして `Siriちゃん` を `sirichan` に編集すると、アプリへのアクセス許可を求めてきてくれました。

![IMG_4308.jpg](https://qiita-image-store.s3.amazonaws.com/0/86201/a8e4e056-c6a0-12eb-48a4-36670eb451d0.jpeg)

「アプリでSiriを使ってもいいですか？」は、先ほど tiapp.xml の NSSiriUsageDescription に設定した文言ですね。
もちろん「はい」です。

宛先やらメッセージやらを回答すると、、、
![IMG_4309.jpg](https://qiita-image-store.s3.amazonaws.com/0/86201/40f86e0e-b5d5-70ee-9126-c9dcf0e54cbb.jpeg)

このようにメッセージを作ってくれました。
送信すると「送信しました」と言ってくれますが何も起こりませんw
Hyperloop か ネイティブコードで Intent のハンドラを設定して応答を処理することができます。

そっちはまた今度。

### アプリ名を変えて声だけでちゃんとやりとりする

声でアプリ名を認識してもらうにはアプリ名を日本語にするのが良いです。

```xml:i18n/ja/app.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
	<string name="appname">シリリン</string>
</resources>
```

> シリリンでメッセージを探して
>>Sarahさんからメッセージが１件届いています。
「I am so excited about SiriKit!」 
（あいあむそーえきさいてっどあばうとしりきっと、と日本語読みしてくれるw）
返信しますか？

> ちょっと待っててください。
>> すみません、よくわかりません。

### 参考
* https://developer.apple.com/jp/documentation/Intents/Conceptual/SiriIntegrationGuide/index.html
* https://wiki.appcelerator.org/display/guides2/Creating+iOS+Extensions%3A+Siri+Intents
* https://jira.appcelerator.org/browse/TIMOB-23511