navigator.connection.type即使设备准备就绪也无法工作*或*设备从未准备就绪

时间:2013-07-19 16:06:41

标签: networking cordova

我正在尝试使用Phonegap创建一个简单的应用程序,使用Adobe Phonegap构建器编译。我已经找到并使用了很好的文档示例,在下面使用了navigator.connection.type,并且我已经添加了另一行,以便在设备准备就绪时生成警报框。它甚至没有那么远。我已经在某些点显示了无尽的旋转圈,通过将这个代码从头部移动到页面的主体,但这到底是没有帮助的。在iOs和Android设备上进行测试会得到相同的结果,config.xml包括: -

<plugin name="NetworkStatus" value="CDVConnection" />
<plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager" />

非常感谢任何帮助。

// Wait for Cordova to load
// 
document.addEventListener("deviceready", onDeviceReady, false);

// Cordova is loaded and it is now safe to make calls Cordova methods
//
function onDeviceReady() {
    alert('Device is ready');
    checkConnection();
}

function checkConnection() {
    var networkState = navigator.connection.type;

    var states = {};
    states[Connection.UNKNOWN]  = 'Unknown connection';
    states[Connection.ETHERNET] = 'Ethernet connection';
    states[Connection.WIFI]     = 'WiFi connection';
    states[Connection.CELL_2G]  = 'Cell 2G connection';
    states[Connection.CELL_3G]  = 'Cell 3G connection';
    states[Connection.CELL_4G]  = 'Cell 4G connection';
    states[Connection.CELL]     = 'Cell generic connection';
    states[Connection.NONE]     = 'No network connection';

    alert('Connection type: ' + states[networkState]);
}

</script>

2 个答案:

答案 0 :(得分:6)

您还应该等到加载所有脚本。将所有内容包装在onBodyLoad中:

function onBodyLoad() {
    // these are useful later in the app, might as well set early
    window.isRipple = (window.tinyHippos != null);
    window.isPhoneGap = /^file:\/{3}[^\/]/i.test(window.location.href);
    window.isIOS = !window.isRipple && navigator.userAgent.match(/(ios|iphone|ipod|ipad)/gi) != null;
    window.isAndroid = !window.isRipple && navigator.userAgent.match(/(android)/gi) != null;

    // stuff I use for debugging in chrome
    if (window.isPhoneGap) {
        document.addEventListener("deviceready", onDeviceReady, false);
    } else {
        onDeviceReady();
    }
}

并添加到您的身体标签:

<body onload="onBodyLoad()"> 

我的其余代码用于其他参考:

function checkOffLine(minutes) {
    if (window.lastCheckTime == null) {
        window.lastCheckTime = 0;
    }

    var currentTime = (new Date()).getTime();
    if (currentTime < (window.lastCheckTime + minutes * 60000)) return;
    window.lastCheckTime = currentTime;

    // ios does not allow you to exit the application so just warn
    // ios also require you to warn or your app get rejected
    if (window.isIOS) {
        navigator.notification.alert('This application may not function properly without an internet connection.');
    } else {
        navigator.notification.confirm(
            'This application may not function properly without an internet connection.  Continue working offline?', // message
            function(button)      // callback to invoke with index of button pressed
            {
                if (button == 1) {
                    navigator.app.exitApp();
                }  
            },
                'Warning', // title
                'Exit,Continue'                     // buttonLabels
            );
        }
}

function checkConnection() {
    // your check connection type code here or just use navigator.onLine
    if (!navigator.onLine) {
        // don't be annoying, only confirm for once every every 5 minutes
        checkOffLine(5);
    }
}

// initial phonegap deviceready handler
function onDeviceReady() {
    console.log('Application started');
    angular.bootstrap(document, ['assetsApp']);
    if (window.isPhoneGap) {
        document.addEventListener("offline", checkConnection, false);
        checkConnection();
    }
};

function onBodyLoad() {
    // these are useful later in the app, might as well set early
    window.isRipple = (window.tinyHippos != null);
    window.isPhoneGap = /^file:\/{3}[^\/]/i.test(window.location.href);
    window.isIOS = !window.isRipple && navigator.userAgent.match(/(ios|iphone|ipod|ipad)/gi) != null;
    window.isAndroid = !window.isRipple && navigator.userAgent.match(/(android)/gi) != null;

    // stuff I use for debugging in chrome
    if (window.isPhoneGap) {
        document.addEventListener("deviceready", onDeviceReady, false);
    } else {
        onDeviceReady();
    }
}

答案 1 :(得分:1)

我遇到了同样的问题,发现我必须运行“cordova build”,然后状态才能正确返回。

<强>提防 当我运行cordova构建时,它似乎占用了我的〜/ app / www目录中的所有内容,覆盖 app / platforms / android / assets / www /

中的所有内容

我的“安装过程”如下:

cordova create app com.app "App"
cd app
cordova platform add android
cordova plugin add org.apache.cordova.network-information
cordova plugin add org.apache.cordova.camera
cordova plugin add org.apache.cordova.geolocation
cordova build

然后我可以在app / www中进行代码更改,当快乐时,使用'cordova build''部署'它(似乎总是将文件复制到app / platforms / android / assets / www /.

如果我使用:(例如)

添加另一个插件
cordova plugin add org.apache.cordova.file

然后我需要运行

cordova build

让它发挥作用。

我希望这会有所帮助

(我使用的是cordova 3.3.1-0.1.2)