apple watch 間通信

88
Apple Watch 間通信 修一 @shu223 2015.5.27 Apple Watch meetup

Upload: shuichi-tsutsumi

Post on 22-Jul-2015

4.129 views

Category:

Technology


3 download

TRANSCRIPT

Apple Watch 間通信堤 修一 @shu223 2015.5.27 Apple Watch meetup

• 堤 修一(つつみ しゅういち)

• iOS専業フリーランス

• ブログ『Over&Out その後』

• 著書『iOS×BLE Core Bluetoothプログラミング』『iOSアプリ開発 達人のレシピ100』

自己紹介

お手伝いしたプロダクト(BLE関連)

Music for the Deaf

お手伝いしたプロダクト(WatchKit関連)

お手伝いしたプロダクト(WatchKit関連)

WatchMe(Pocket Supernova) Watch に最適化されたビデオメッセージングアプリ。ウォッチで動画メッセージのプレビュー、素早い返信ができる

※お手伝いしたのは開発の初期、ウォッチ側

お手伝いしたプロダクト(WatchKit関連)

よしだっち(DLE)

鷹の爪団の吉田君を育成するアプリ

WatchMe(Pocket Supernova) Watch に最適化されたビデオメッセージングアプリ。ウォッチで動画メッセージのプレビュー、素早い返信ができる

※お手伝いしたのは開発の初期、ウォッチ側

お手伝いしたプロダクト(WatchKit関連)

よしだっち(DLE)

鷹の爪団の吉田君を育成するアプリ

WatchMe(Pocket Supernova) Watch に最適化されたビデオメッセージングアプリ。ウォッチで動画メッセージのプレビュー、素早い返信ができる

※お手伝いしたのは開発の初期、ウォッチ側

メール、Facebookメッセージ、TwitterのDM等を一元管理するアプリ

Swingmail(BHI)

※ウォッチ機能は現在開発中

今日話すこと

Apple Watch 同士で通信する方法を探る

標準で入ってる “Digital Touch” 機能

Apple Watch 同士で通信する方法を探る

標準で入ってる “Digital Touch” 機能

- タップ、心拍、手書きスケッチを相手に送れる

Apple Watch 同士で通信する方法を探る

標準で入ってる “Digital Touch” 機能

- タップ、心拍、手書きスケッチを相手に送れる

Apple Watch 同士で通信する方法を探る

標準で入ってる “Digital Touch” 機能

- タップ、心拍、手書きスケッチを相手に送れる

Apple Watch 同士で通信する方法を探る

標準で入ってる “Digital Touch” 機能

- タップ、心拍、手書きスケッチを相手に送れる

WatchKitにそういうAPIはない

Apple Watch 同士で通信する方法を探る

標準で入ってる “Digital Touch” 機能

- タップ、心拍、手書きスケッチを相手に送れる

WatchKitにそういうAPIはない

→ サードパーティ製アプリで同様のことをやるには?

Apple Watch 同士で通信する方法を探る

この構成で同様のことはできそう

この構成で同様のことはできそう

自分

parent

この構成で同様のことはできそう

自分

parent

相手

parent

この構成で同様のことはできそう

自分

parent

相手

parent

バックグラウンド通信

この構成で同様のことはできそう

通信してる感

自分

parent

相手

parent

バックグラウンド通信

この構成で同様のことはできそう→ つくってみたらうまくいった

通信してる感

自分

parent

相手

parent

バックグラウンド通信

通信処理の流れ

自分 相手

メッセージを送りたい

自分 相手

メッセージを送りたい

openParentApplication:reply:

でメッセージを渡す

バックグラウンドで送信 (Core Bluetooth)

自分 相手

メッセージを送りたい

openParentApplication:reply:

でメッセージを渡す

バックグラウンドで送信 (Core Bluetooth)

自分 相手

メッセージを送りたい

ローカル通知

openParentApplication:reply:

でメッセージを渡す

ポイント

Point 1:

Core Bluetooth を用いた通信

Point 1:

Core Bluetooth を用いた通信

Point 1:

Core Bluetooth を用いた通信• BLE(Bluetooth Low Energy) を利用

Point 1:

Core Bluetooth を用いた通信• BLE(Bluetooth Low Energy) を利用

- WiFi等のインフラなしで通信可能

Point 1:

Core Bluetooth を用いた通信• BLE(Bluetooth Low Energy) を利用

- WiFi等のインフラなしで通信可能

• ステータス確認・スキャン・アドバタイズ・接続確立・データのやり取り等、ほぼすべての機能がバックグラウンドで利用可能

Point 1:

Core Bluetooth を用いた通信• BLE(Bluetooth Low Energy) を利用

- WiFi等のインフラなしで通信可能

• ステータス確認・スキャン・アドバタイズ・接続確立・データのやり取り等、ほぼすべての機能がバックグラウンドで利用可能

- UX的にはparent appでの処理と悟られない

Point 1:

Core Bluetooth を用いた通信• BLE(Bluetooth Low Energy) を利用

- WiFi等のインフラなしで通信可能

• ステータス確認・スキャン・アドバタイズ・接続確立・データのやり取り等、ほぼすべての機能がバックグラウンドで利用可能

- UX的にはparent appでの処理と悟られない

- 1度接続すれば、あとは接続が切れてもバックグラウンドで勝手に再接続される

Point 1:

Core Bluetooth を用いた通信• BLE(Bluetooth Low Energy) を利用

- WiFi等のインフラなしで通信可能

• ステータス確認・スキャン・アドバタイズ・接続確立・データのやり取り等、ほぼすべての機能がバックグラウンドで利用可能

- UX的にはparent appでの処理と悟られない

- 1度接続すれば、あとは接続が切れてもバックグラウンドで勝手に再接続される

- プロセスが死んでてもゾンビのように復活して繋がってくれる

Point 1:

Core Bluetooth を用いた通信• BLE(Bluetooth Low Energy) を利用

- WiFi等のインフラなしで通信可能

• ステータス確認・スキャン・アドバタイズ・接続確立・データのやり取り等、ほぼすべての機能がバックグラウンドで利用可能

- UX的にはparent appでの処理と悟られない

- 1度接続すれば、あとは接続が切れてもバックグラウンドで勝手に再接続される

- プロセスが死んでてもゾンビのように復活して繋がってくれる

• 詳細はこちら: 『殺しても死なないアプリ』(potatotips #17 での発表)

Point 2:

openParent~による非同期処理実行

Point 2:

openParent~による非同期処理実行

Point 2:

openParent~による非同期処理実行• Core Bluetooth は非同期でレスポンスが返ってくる処理ばかり

Point 2:

openParent~による非同期処理実行• Core Bluetooth は非同期でレスポンスが返ってくる処理ばかり

• openParent~は親アプリからのレスポンスを受け取れるが、同期処理なので非同期処理の結果は受け取れない

Point 2:

openParent~による非同期処理実行• Core Bluetooth は非同期でレスポンスが返ってくる処理ばかり

• openParent~は親アプリからのレスポンスを受け取れるが、同期処理なので非同期処理の結果は受け取れない

→ WatchKit Extension側から結果を受け取れるまでポーリングする

- 詳細:『WatchKit もろもろ実機検証』(実装コードあり)

Point 3:

ローカル通知

Point 3:

ローカル通知

Point 3:

ローカル通知• openParent~はあるけど

openChild 的なAPIはない

Point 3:

ローカル通知• openParent~はあるけど

openChild 的なAPIはない

→ parent app からローカル通知を発行してウォッチ側で受け取ってもらう

Point 3:

ローカル通知• openParent~はあるけど

openChild 的なAPIはない

→ parent app からローカル通知を発行してウォッチ側で受け取ってもらう

Watchのローカル通知に対する挙動:『WatchKit もろもろ実機検証』(実装コードあり)

心拍を送るには?

心拍を送るには?WatchKit では直接心拍センサの値に

アクセスするAPIはない

HealthKit を利用

心拍を送りたい

自分 相手

HealthKit を利用

心拍を送りたい

自分 相手

①心拍数計測 (HealthKitに自動保存)

HealthKit を利用

心拍を送りたい

自分 相手

①心拍数計測 (HealthKitに自動保存)

②openParent~ で心拍を送りたい旨だけ伝える

HealthKit を利用

心拍を送りたい

自分 相手

①心拍数計測 (HealthKitに自動保存)

②openParent~ で心拍を送りたい旨だけ伝える

③HealthKit より心拍数取得

HealthKit を利用

心拍を送りたい

自分 相手

①心拍数計測 (HealthKitに自動保存)

②openParent~ で心拍を送りたい旨だけ伝える

③HealthKit より心拍数取得

④バックグラウンドで送信

HealthKit を利用

心拍を送りたい

自分 相手

①心拍数計測 (HealthKitに自動保存)

②openParent~ で心拍を送りたい旨だけ伝える

③HealthKit より心拍数取得

⑤ローカル通知

④バックグラウンドで送信

HealthKit を利用

心拍を送りたい

自分 相手

①心拍数計測 (HealthKitに自動保存)

②openParent~ で心拍を送りたい旨だけ伝える

③HealthKit より心拍数取得

⑤ローカル通知

心拍数に応じた速さで アニメーションを実行

④バックグラウンドで送信

ウォッチで計測した心拍数をリアルタイムにiPhone 側で HealthKit から取得できるのか?

ウォッチで計測した心拍数をリアルタイムにiPhone 側で HealthKit から取得できるのか?

• 心拍数の単位は “BPM” (Beats

Per Minute) なので60秒ぐらいまでのタイムラグは許容範囲かと

ウォッチで計測した心拍数をリアルタイムにiPhone 側で HealthKit から取得できるのか?

• 心拍数の単位は “BPM” (Beats

Per Minute) なので60秒ぐらいまでのタイムラグは許容範囲かと

• Watch で心拍数を計測しつつ、iPhone の Health アプリで最新データがいつ取得できるか確認してみた

ウォッチで計測した心拍数をリアルタイムにiPhone 側で HealthKit から取得できるのか?

• 心拍数の単位は “BPM” (Beats

Per Minute) なので60秒ぐらいまでのタイムラグは許容範囲かと

• Watch で心拍数を計測しつつ、iPhone の Health アプリで最新データがいつ取得できるか確認してみた

[Health Data] > [Vitals] > [Heart Rate] > [Show All Data]

ウォッチで計測した心拍数をリアルタイムにiPhone 側で HealthKit から取得できるのか?

• 心拍数の単位は “BPM” (Beats

Per Minute) なので60秒ぐらいまでのタイムラグは許容範囲かと

• Watch で心拍数を計測しつつ、iPhone の Health アプリで最新データがいつ取得できるか確認してみた

→ ほぼタイムラグなし (多く見ても10秒以内) [Health Data] > [Vitals]

> [Heart Rate] > [Show All Data]

デモ

(デモの流れ:Watch間メッセージ送信)自分 相手

(デモの流れ:Watch間メッセージ送信)

①Watch アプリ起動

自分 相手

(デモの流れ:Watch間メッセージ送信)

①Watch アプリ起動

②ボタンタップ

自分 相手

(デモの流れ:Watch間メッセージ送信)

①Watch アプリ起動

②ボタンタップ

③メッセージ選択、 または音声入力

自分 相手

(デモの流れ:Watch間メッセージ送信)

①Watch アプリ起動

②ボタンタップ

③メッセージ選択、 または音声入力

自分 相手

(バックグラウンド通信)

(デモの流れ:Watch間メッセージ送信)

①Watch アプリ起動

②ボタンタップ

③メッセージ選択、 または音声入力

自分 相手

(バックグラウンド通信)

メッセージ受信!

(デモの流れ:Watch間で心拍数共有)自分 相手

(デモの流れ:Watch間で心拍数共有)

①Watch アプリ起動

自分 相手

(デモの流れ:Watch間で心拍数共有)

①Watch アプリ起動

②ボタンタップ

自分 相手

(デモの流れ:Watch間で心拍数共有)

①Watch アプリ起動

②ボタンタップ

自分 相手

(バックグラウンド通信)

(デモの流れ:Watch間で心拍数共有)

①Watch アプリ起動

②ボタンタップ

自分 相手

(バックグラウンド通信)

心拍数表示& アニメーション

絵文字を送るには? (※試していないのであくまで仮説です)

• presentTextInputControllerWith~で、AllowEmoji / AllowAnimatedEmoji を指定

• 選択すると絵文字の画像データを表す大量のバイナリデータが返ってくる

• BLEでは(基本的に)1パケット20バイト

→ 種類は限られているので、オレオレ文字コードを定義して送り合えばOKかと

まとめ・所感

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

• メッセージ、心拍、絵文字は送れる

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

• メッセージ、心拍、絵文字は送れる• 通信速度も悪くない

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

• メッセージ、心拍、絵文字は送れる• 通信速度も悪くない

• 苦しい点

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

• メッセージ、心拍、絵文字は送れる• 通信速度も悪くない

• 苦しい点

• ローカル通知の制約(iPhoneの状態によってはウォッチ側で受け取ってくれない)

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

• メッセージ、心拍、絵文字は送れる• 通信速度も悪くない

• 苦しい点

• ローカル通知の制約(iPhoneの状態によってはウォッチ側で受け取ってくれない)

• タップは受信側が無理(Taptic Engine を制御できない)

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

• メッセージ、心拍、絵文字は送れる• 通信速度も悪くない

• 苦しい点

• ローカル通知の制約(iPhoneの状態によってはウォッチ側で受け取ってくれない)

• タップは受信側が無理(Taptic Engine を制御できない)

• 手描きスケッチも受信側が無理(あんなに滑らかに線を「動的に」描画できない)

サードパーティ製アプリで Apple Watch 同士で通信する方法を探ってみた

→ 意外とアリなのでは?• 接続も送信もバックグラウンドで自動で行われるため、ユーザー体験としてはウォッチ同士通信している感がある(親アプリによる処理を感じさせない)

• WiFiなどのインフラ不要、オフラインでも通信可能

• メッセージ、心拍、絵文字は送れる• 通信速度も悪くない

• 苦しい点

• ローカル通知の制約(iPhoneの状態によってはウォッチ側で受け取ってくれない)

• タップは受信側が無理(Taptic Engine を制御できない)

• 手描きスケッチも受信側が無理(あんなに滑らかに線を「動的に」描画できない)• 使いどころ(何に役立つのか?どんなアプリで嬉しいのか?)

Core Bluetooth / BLE の参考書籍

• konashi開発者 松村礼央さんとの共著

• BLEについては知識ゼロからでOKです