Phonegap网络连接 - 无法读取未定义的属性'type'

问题描述:

我一直在寻找答案,并且Google-sphere没有提供任何答案。我已经尝试了一切,我知道该怎么做,并通过建议的解决方案和答案,没有任何工作。Phonegap网络连接 - 无法读取未定义的属性'type'

概括地说,我试图建立一个Phonegap应用为AndroidApple移动设备和我需要的是同时检测网络状态和网络连接类型的功能之一。以下是我正在使用的代码。

Firing device ready警报启动,然后出现错误Cannot read property 'type' of undefined,然后循环显示Navigator对象。在浏览对象的这些属性时,我看不到旧版本中使用的connection属性或甚至network属性。

任何人有任何想法?

的index.html

<!DOCTYPE html> 
<html> 
<head> 

<meta name="viewport" content="width=device-width, initial-scale=1.0"> 

<!-- jQuery Core --> 
<script src="js/jquery-1.11.1.min.js"></script> 
<!-- The main engine for the software. --> 
<script src="js/main.js"></script> 

<!-- Third party plugins --> 
<script type="text/javascript" src="cordova.js"></script> 
<script type="text/javascript" src="barcodescanner.js"></script> 
<script type="text/javascript" src="childbrowser.js"></script> 
<script type="text/javascript" src="js/barcode.js"></script> 

<title>index</title> 

<script> 
document.addEventListener("deviceready", onDeviceReady, false); 
</script> 

</head> 
<body> 


<script> 
barcode_app.initialize(); 
</script> 

</body> 
</html> 

main.js

function onDeviceReady(){ 
    alert('Firing device ready'); 
    try{ 
     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.NONE]  = 'No network connection'; 

     $("#system_popup").html('Connection type: ' + states[networkState]); 
     $("#system_popup").popup("open") 
     //alert('Connection type: ' + states[networkState]); 
    }catch(e){ 
     alert(e); 
     $.each(navigator, function(key, value){ 
      alert(key+' => '+value); 
     }); 
    } 
} 

而在我的config.xml中我有:

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

<gap:config-file platform="android" parent="/manifest"> 
     <uses-permission name="android.permission.ACCESS_NETWORK_STATE" /> 
    </gap:config-file> 

    <gap:config-file platform="android" parent="/manifest"> 
     <uses-permission name="android.permission.INTERNET" /> 
    </gap:config-file> 

    <gap:config-file platform="android" parent="/manifest"> 
     <uses-permission name="android.permission.READ_PHONE_STATE" /> 
    </gap:config-file> 

<feature name="http://api.phonegap.com/1.0/device" /> 
    <feature name="NetworkStatus"> 
     <param name="android-package" value="org.apache.cordova.NetworkManager" /> 
     <param name="ios-package" value="CDVConnection" /> 
    </feature> 










UPDATE:解决方案

解决办法,可以@Dawson劳登和@benka的共同努力终于制定。道森纠正我用这本来应该是插件:

<gap:plugin 
     name="org.apache.cordova.network-information" 
     version="0.2.7" /> 

这真的只有落实@benka提到的短暂延迟之后正常工作。所以,现在的工作代码看起来像这样在JavaScript:

function onDeviceReady(){ 
    try{ 
     var networkState = navigator.connection && navigator.connection.type; 

     setTimeout(function(){ 
      networkState = navigator.connection && 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.NONE]  = 'No network connection'; 

      alert('Connection type: ' + states[networkState]); 
     }, 500); 
    }catch(e){ 
     alert(e); 
     $.each(navigator, function(key, value){ 
      alert(key+' => '+value); 
     }); 
    } 
} 
+0

你在本地或build.phonegap.com建设? – 2014-09-04 19:13:55

+0

build.phonegap.com – 2014-09-04 19:14:24

+2

你想使用这里找到的插件:https://build.phonegap.com/plugins/626'' – 2014-09-04 19:15:25

你想使用这里找到插件:http://build.phonegap.com/plugins/626

<gap:plugin name="org.apache.cordova.network-information" version="0.2.7" /> 
+0

要安装这个是需要在控制台上运行一些命令吗?或者只添加到config.xml – 2015-02-13 04:08:54

+0

这是特定于'PhoneGap Build'在线服务。如果您在本地构建,而不是向'config.xml'添加任何内容,请在您的本地项目目录中运行'cordova plugin add org.apache.cordova.network-information',然后运行'cordova build'。 – 2015-02-13 06:01:32

我已经在这里张贴了这个想法已经:https://stackoverflow.com/a/19319817/2390075

我已经注意到的是,networkState并不总是得到立即初始化。 那么什么工作对我来说是一次先检查状态,然后检查之后加上一个小的延迟,你的情况应该是这样的:

var networkState = navigator.connection && navigator.connection.type; 

setTimeout(function(){ 
    networkState = navigator.connection && 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.NONE]  = 'No network connection'; 

    $("#system_popup").html('Connection type: ' + states[networkState]); 
    $("#system_popup").popup("open") 
    //alert('Connection type: ' + states[networkState]); 
}, 500); 
+2

感谢您的建议。我尝试了你正在谈论的内容,甚至在不同的变体中使用你的链接答案,但不幸的是我仍然得到相同的结果。当我使用'networkState = navigator.connection && navigator.connection.type;'并提醒'networkState'时,它会报告为'undefined',而当我使用'networkState = navigator.connection.type;'时,我得到和我一样的结果原来的帖子。 – 2014-09-04 18:52:20

晚的答案,但这个工作非常适合我:

document.addEventListener("deviceready", onDeviceReady, false); 

// device APIs are available 
function onDeviceReady() { 
    if(navigator.network.connection.type == Connection.NONE){ 
     alert("nocon"); 
    }else{ 
     alert("yescon"); 
    } 
} 
+0

我只是缺少一个“=”(即使用“=”而不是“==”)。这篇文章清除了它。 – Zeni 2015-12-26 17:20:28