0-9
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

  1. 0450 reblogged this from 0-9
  2. atm09td reblogged this from act2012bl
  3. act2012bl reblogged this from 0-9
  4. 0-9 posted this