Skip to content

Instantly share code, notes, and snippets.

@niwatako
Created June 20, 2018 11:35
Show Gist options
  • Save niwatako/c4e2029cb7056d2601b2e864415e2d38 to your computer and use it in GitHub Desktop.
Save niwatako/c4e2029cb7056d2601b2e864415e2d38 to your computer and use it in GitHub Desktop.
『音楽サービス開発者から見たSiri Shortcuts』 #CodePiece #ca_swift
CA.swift #6 WWDC18 報告会 - connpass
https://cyberagent.connpass.com/event/88328/
## 『音楽サービス開発者から見たSiri Shortcuts』
岐部 龍太
`iOS12ではSiriがSpotifyなど他社音楽アプリをサポートできる、デベロッパのやる気次第で`
どこまでできるのか?
Apple Musicのようにアプリを起動していない状態から音楽を再生するのをゴールに設定してやってみた。
Siriに「XXX(アーティスト名)を再生して」というと再生してくれる。
beryu/SiriShortcutsSample
https://github.com/beryu/SiriShortcutsSample
SiriShortcutsにはNSUserActivityとIntentを使う方法がある
### NSUserActivity を使う方法
INShortcutを定義してINShortcutをMyShortcutに登録する。そのためにNSUserActivityを作る。これは今までどおり。
NSUserActivitiのuserInfoに好きな値をセットできるので曲名やURLをセットします。
新しいのは NSUserActivityの .isEligibleForPrediction と .suggestedInfocationPhrase(せっていしなくてもいいけどユーザーの混乱をさける)プロパティ。
このActivityをINShortcutに渡して内包するような形になる。
INUIAddVoiceShortcutViewController に INShortcut を渡すと、あとはOSお任せで、登録できる機能が提供される。
shortcut渡して生成して、Delegateして表示。delegateは登録完了とキャンセルをさばく、つまりそれぞれでdismissするだけ。
呼び出されたら
SiriからMyShortcutを呼び出すとアプリが呼ばれる。このフローはやることがない。
AppDelegateで待っておいて、そこで音楽を再生する処理を書いておけば良い。
目的のアクティビティが来たら、情報を取り出して再生する。
#### Demo
"ヒカリを再生して" で登録して、宇多田ヒカルが再生できるかな?
回線が混んでいてSiriの解析に時間がかかる。仕方がないので設定で手入力を有効にしてみる。
アプリが起動して、再生されました!成功!
でも、AppleMusicではアプリは起動しないですね
NSUserActivityではアプリが起動してしまう。
### Intent
IntentでのSiri制御は用意されてるIntentしか使えないけれど、iOS12から。メディア再生のIntent INPlayMediaIntentが登場したのでできるようになった。
INShortcutをつくるのはさっきとほとんど同じ。
INMediaItemを作ってIMPlayMediaIntentにいれて、それでINShortcutを作る。
このINShortcutをINUIAddVoiceShortcutViewControllerにわたす。
Siriから呼び出される先がAppDelegateではなくてIntentHandlerになるのがIntentの特徴。
Intentの種類ごとに適切なIntentHandlerを返す。INPlayMediaIntentHandlingを実装する。
返すHandlerには、さっき定義したIntentが渡ってきてハンドリングを求められる。
ここはSiri表示中に実行されるところ。
メソッドの最後にcompletionにResponseとして処理が成功したことなどを渡してあげることでSiriがユーザーに応答できる。
回線混雑のためSiri利用できず。
UIも作成して表示することができる。操作も受け付けられる。
### 補足
今回は用意されたIntentを使いましたが、
独自のIntentを定義することもできる。Intent Definition。
ある程度特殊な業務アプリなんかにも利用できそうです。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment