SiriKit and Me | iOSDC Japan 2017

去年発表されたSiriKit。Siriにしゃべるだけでアプリが動かせる?と話題になりましたが、実際には使える機能が限定されているので、なかなか使う機会が多くないと思います。 その上、実際にプロダクトにいれようとすると、SiriKitは通常のアプリ開発ではあまり出会わないような困難がいろいろと待ち受けています。 ここでは、実際のプロダクト開発の経験とをもとに、それをうまくのりこえる方法をお教えします。 WWDCAppleのエンジニアに聞いてきた裏技もお伝えします。

f:id:niwatako:20170915173820j:plain

f:id:niwatako:20170915173825j:plain

スタッフと兼ねています、皆さん来てくださってありがとうございます、前夜祭なので食べたり飲んだりしながら楽しんで下さい。

フリーランスiOSエンジニアです。 ボルダリングなどしています。

f:id:niwatako:20170915173912j:plain

SiriKitは1年半ぐらい前に出ました。

アプリの特定の機能を呼び出すことができます。

使っている人は少ないかもしれません。実装した人、手を挙げる人は少ないのではないでしょうか。

逆にユーザーとして、タクシーを呼んだりした人はいますか

3名。。。

みなさんもデベロッパーならぜひ使ってみてくださいね?

f:id:niwatako:20170915174021j:plain

f:id:niwatako:20170915174026j:plain

タクシーの配車をしてみましょう

f:id:niwatako:20170915174108j:plain

f:id:niwatako:20170915174111j:plain

f:id:niwatako:20170915174115j:plain

日本交通さんから使えます。

LineはMessageに対応しています。

f:id:niwatako:20170915174133j:plain

f:id:niwatako:20170915174139j:plain

f:id:niwatako:20170915174213j:plain

これ以外にもレストランをマップで開いて予約したりできます。

OpenTableが対応しています。

f:id:niwatako:20170915174246j:plain

SiriKitを対応する理由

システムのアプリケーションから自分のアプリケ0ションへの導線を確保することができます。

Accessibilityの面でも。

f:id:niwatako:20170915174319j:plain

目が見えない方でも使いやすくなります。

f:id:niwatako:20170915174342j:plain

ピクシブさんの連載漫画、腐男子社長の漫画で、目が見えなくなった主人公がSiriに電話をかけてもらいます。このような役立ち方は良いと思います。

f:id:niwatako:20170915174419j:plain

f:id:niwatako:20170915174429j:plain

HomePod、スマートスピーカーは競争が激しいので、私は次のWWDCでHomePodにSiriKit対応アプリが載ると予想しています。

f:id:niwatako:20170915174506j:plain

SiriKitについて説明します。Frameworkではありません。Intents, Intents UIという2つのフレームワークから実現されます。

f:id:niwatako:20170915174536j:plain

ターゲットとして追加します。

f:id:niwatako:20170915174550j:plain

フレームワーウを追加すると、サンプルコードが最初にあるので、そのまま使ってみることができます。

Intentsを実装する上で

f:id:niwatako:20170915174626j:plain

機能はシンプルですが引っかかるポイントは多いです。

f:id:niwatako:20170915174645j:plain

システムのアプリ上に機能を提供するのがAppExtensionです。

iOS11では23種類位あります。

f:id:niwatako:20170915174714j:plain

配布する時はHostのアプリと一緒にバンドルしてストアに出しますが、実際にユーザーが実行するときには別々のプロセスとして動きます。

f:id:niwatako:20170915174750j:plain

f:id:niwatako:20170915174806j:plain

ポインタのアドレスを片方のターゲットで記録して、別のアプリから同じメモリポインタを呼んでも、中身が0になります。

同じバンドルのターゲット間でも同様です。

f:id:niwatako:20170915174905j:plain

Intentsから本体アプリのメモリは読めません。

f:id:niwatako:20170915174936j:plain

どうやって情報を共有したら良いでしょうか。

ファイルストレージもサンドボックスという仕組みで別々になっています。

f:id:niwatako:20170915174953j:plain

そこで同じデベロッパーの別のアプリ間でデータを共有するAppGroupを使います。

f:id:niwatako:20170915175011j:plain

それから、SiriKitではユーザーからの問い合わせに自然に答えなければなりません。回答まで時間がかかるとタイム・アウトしてしまうので必要なデータのキャッシュなど工夫が必要です。

f:id:niwatako:20170915175038j:plain

またエラーの情報が乏しいです。

f:id:niwatako:20170915175125j:plain

開発スピードも早いので動かなくなることがよくあります。

f:id:niwatako:20170915175150j:plain

スクリーンショットで記録を残しておいたほうがいいです。

英語だと正しく動くが日本語だと動かない、その逆もあります。各言語で試しましょう。

f:id:niwatako:20170915175231j:plain

f:id:niwatako:20170915175259j:plain

f:id:niwatako:20170915175306j:plain

10年ぐらいiOSやっていますがSiriKitは一番苦しかったです。でも絶対HomePodがあると信じています。 皆さんも是非SiriKitやってみて下さい。

QA

  • 一つ一番デバッグで苦しんだことを教えて下さい
    • 同じコードを書いているのに動作が違うのが苦しくて、先週と今週で動作が違う。なんでですかねーって…
      • 差し支えなければどのようなケースか…
        • 差し支えるので申し訳ありませんが…