react-native連携watchOS開発の覚え書き

https://github.com/mtford90/react-native-watch-connectivity を使っていく.
"react-native": "^0.62.2"
でかなり古いのでそのままだと動かない。
Forkしてごにょごにょいじったら動いた。
デモが充実している以外は、実のところ NativeのWatchConnectivity を単にブリッジしているだけが大部分なので、RNBridgeを自作できるならその方が賢明なのだろう。

iPhone↔︎watchのsimulatorの挙動が不安定で、
watch→iPhone の通信は確認できるのだが、
iPhone→watch の通信がどうやっても「転送がタイムアウトしました」になってハマった。
react-native-watch-connectivityのドキュメントに記載があったが、どうやらsimulator自体の問題らしい。
Troubleshooting
Watch remains unreachable on the simulator
Apple’s dodgy watchos/ios simulator setup strikes again. If you keep reinstalling each app, it will eventually work. Better to use real devices.

実機で確認したらようやく iPhone→watch の疎通も確認できた。
(iOSとwatchOSそれぞれ最新にする必要があり地味に手間だった)

今更だが、実装しているのはカウンターアプリ。
iPhone側にマスタとなるデータストアがあるのだが、watch→iPhoneに送信したあとの最新のカウンター値をwatchに返信したい。
iPhone→watch の イベントハンドラには replyHandler
というコールバックが用意されているのだが、肝心のwatch→iPhone側にはないように見える。どうすればいいのだろう。
とりあえず以下のような実装にしてみる。
- watch→iPhone の送信
- 1を受信したiPhone側のイベント内で iPhone→watchの送信

XCodeからwatchアプリを実行すると以下の二つのメッセージが延々とループして実行が完了しない問題に悩まされた。
- “Waiting to reconnect to Apple Watch. Previous preparation error: Transport error."
- “Connecting to Apple Watch. Xcode will continue when the operation completes.”
forumにて同じ問題が報告されており、参考になった。
私の場合はiPhoneとwatchを同じWifiに繋いでいないことが原因だった。
というかwatchのwifiほっとくと接続切れる。毎回繋ぎ直す必要があり面倒。
追記)
一度解決したがリブートするうちに再発する。これといった解決手段がない。
追記)
機内モードを何度もオンオフすると直るかもしれない。

watchのhapticの仕様
無音で実行できない、必ず音がついてくる。
端末をミュートにすれば無音で振動だけになる。
端末のミュート(および音量)はプログラムからは制御できない。

- watch→iPhone の送信
- 1を受信したiPhone側のイベント内で iPhone→watchの送信
iPhone側のデータを常に正とするための実装は、これでうまくいった(と思う)。
watchを操作する際はiPhoneでアプリを開いといてもらう必要がある。
こだわるなら、それぞれのbackground処理とかで同期できるのかもしれない。流石に辛そうすぎるのでやらない。

watchのsleep無効
無効にはできず、一部カテゴリなら延長できるのみ。