SlideShare a Scribd company logo
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です

More Related Content

Apple Watch 間通信