Open8

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

ひらりーひらりー

iPhone↔︎watchのsimulatorの挙動が不安定で、
watch→iPhone の通信は確認できるのだが、
iPhone→watch の通信がどうやっても「転送がタイムアウトしました」になってハマった。

react-native-watch-connectivityのドキュメントに記載があったが、どうやらsimulator自体の問題らしい。
https://mtford.co.uk/projects/react-native-watch-connectivity/docs/troubleshooting/#watch-remains-unreachable-on-the-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側にはないように見える。どうすればいいのだろう。

とりあえず以下のような実装にしてみる。

  1. watch→iPhone の送信
  2. 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の仕様

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

ひらりーひらりー
  1. watch→iPhone の送信
  2. 1を受信したiPhone側のイベント内で iPhone→watchの送信

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