はじめに
React Nativeを仕事で扱い始めてから、早半年以上が過ぎました。
いろいろ躓くところはありましたが、一番躓いたといっても過言ではない件を備忘録として残しておこうと思います。
まず、結論から言わせて
今回根本的な解決はできておりません!!!
実装に合わせた修正をいれて対応したけど、あくまで 「こういった事象が発生したよ。」 というものになります。
位置情報アクセス許可要求とAppStateの相性が悪い件
厳密には相性が悪いという訳ではなく、想定外の動きをしてしまったというのが正しいです。
ちょっと盛りましたね。
※ちなみにAndroidのみで発生。
AppStateとは?
React Native公式ドキュメント - AppState
公式ドキュメントを読んでもらったほうが早いですが、アプリがフォアグラウンドにあるかバックグラウンドにあるかを通知してくれるものです。
AppStateを使用した背景
位置情報を監視したかったのですが、一度アプリをバックグラウンドに持ってきてしまうと監視されなくなってしまうという問題が発生したので、そちらの対応として使用しました。
ちなみに位置情報の監視は以下で出来ます。
React Native公式ドキュメント - watchPosition()
そのためAppStateを使ってアプリのフォアグラウンド・バックグラウンドを監視して、フォアグラウンドになった際は位置情報監視を開始、バックグラウンドになった際は監視状態を解除させるといった処理を入れたかったという訳です。
何が起こったの?
今回想定外の動きをしたのが、位置情報のアクセス許可を要求する際に、 「アプリがバックグラウンドに行ったよ〜と思ったらフォアグラウンドに戻ってきたよ〜」 と一気に通知されてしまうことです。
…Why?
それで何が相性悪いの?
今回フォアグラウンドに行った際には位置情報のアクセス許可要求を行う処理を行っていました。
そのため、
アクセス許可要求→バックグラウンド通知→フォアグラウンド通知→アクセス許可要求→バックグラウンド通知→フォアグラウンド通知…
のように無限ループが発生してしまいました。
(※位置情報のアクセス許可を拒否している場合のみ)
厳密には位置情報アクセス許可要求とAppStateの2つの相性が悪いというより、想定外の動きをするもんだから実装と相性が悪かったといった感じでしょうか。
結論でも述べたように、根本的な解決はわからず…
急にアプリが重くなるもんだからなんでだ…と悩みまくり…かなり時間を使ってしまいました。
そこかよ…
※ちなみに参考に記載したstackoverflowでは「AppStateは使うな!」とか書かれてます…笑
さいごに
玄人からすると「当たり前だろ」とか思われるかもしれませんが、まだまだ素人なのもので…お許しを。
参考
React Native公式ドキュメント
stackoverflow - Appstate keep on getting change in React native in Android