Android環境でnavigator.onLineを使う場合の注意
iOS 4, 5, 6は問題なく取れる。
Android 2系はnavigator.onLineが設定の「機内モード」へ変更した場合のみ取れる。
(通常の回線切断に連動しない)
Android 4.1は手元の機種ではWebView上で「navigator.onLineが常にtrueになる」問題があった。
(これは機種、WebViewを呼び出しているアプリの問題の可能性もある)
これに対しては以下のJSで対応した。
(function () { if (!navigator.userAgent.match(/Android/i)) { return; } if (!navigator.__defineGetter__) { return; } var onLine = true; var timeout = 0; navigator.__defineGetter__('onLine', function () { if (timeout) { return onLine; } var xhr = new XMLHttpRequest(); xhr.open('HEAD', location.href, false); try { xhr.send(); onLine = true; } catch (e) { onLine = false; } timeout = setTimeout(function () { timeout = 0; }, 5000); return onLine; }); })();
確認環境はAndroid 2.2, 2.3, 4.1(WebView内)
(2.1は確認してないので動くかもしれない)
Broken Offline Support ここのコードをベースに確認を5秒に一回以下にした。
PhantomJSではnavigator.onLineは常にfalseになる。
上記コードはPhantomJSでも有効に使える。
navigator.onLine is always false, but shouldn’t be · Issue #10647 · ariya/phantomjs