Open5

Android WebView 内の JavaScript で RxJS の bufferTime/timeout等 を使うと端末スリープ後5分経過で subscribe が来なくなる件

amay077amay077

ガワネイティブな Android アプリで端末をスリープにして5分くらい経過すると Web 側で使っている RxJS のタイマー系(timeout とか bufferTime)がバグって? subscribe が来ないという興味深い事象に遭遇している(困った)。

RxJS を使わない処理では問題ないので WebView の wake lock とかそういう事ではないと思う。

amay077amay077

突き詰めたらどうせ setTimeout とか setInterval だろうから RxJS じゃなくても起こりそう。

amay077amay077

Android WebView でスリープ中に setTimeout がコールバックを呼ばないとしたら、WakeLock API で解決できるのかも知れない。
iOS の WKWebView ではこの問題は発生しない。

amay077amay077

WakeLock を試そうと
https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API

if ('wakeLock' in navigator) {
  isSupported = true;
  statusElem.textContent = 'Screen Wake Lock API supported!';
} else {
  wakeButton.disabled = true;
  statusElem.textContent = 'Wake lock is not supported by this browser.';
}

を実行してみたけど "Wake lock is not supported by this browser" の方へいってしまう。
Android System WebView のバージョンは 97.0 を超えてるけど、関係ないのかなあ?

  • HUAWEI Nova lite 3
  • Xperia 1 II

で確認。

amay077amay077

RxJS の bufferTime を使わないようにして回避はできるけど、
Web 側で Angular を使っていて、さらに Angular の HttpClient が RxJS に依存しているので?、通信(post)も送れなくなっている。
スリープから復帰すると、一気に post される。
HttpClient を fetch に代えて試す必要がある。