Подключение к телефонной сети – невозможно прочитать свойство «тип» неопределенного

Я весь день искал ответ на этот вопрос, и Google-сфера не давала никаких ответов. Я пробовал все, что умею, и работал через предлагаемые решения и ответы, и ничего не сработало.

В двух словах я пытаюсь разработать приложение Phonegap для устройств Android и Apple Mobile, и одной из функций, которые мне нужны, является определение статуса сети и типа сетевого подключения. Ниже приведен код, который я использую.

Предупреждение готовности 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> 

ОБНОВЛЕНИЕ: РЕШЕНИЕ

Решение было окончательно сформулировано совместными усилиями @Dawson Loudon и @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); }); } } 

Вы хотите использовать плагин, найденный здесь: http://build.phonegap.com/plugins/626

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

Я уже здесь разместил эту идею: 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); 

Поздний ответ, но это отлично сработало для меня:

 document.addEventListener("deviceready", onDeviceReady, false); // device APIs are available function onDeviceReady() { if(navigator.network.connection.type == Connection.NONE){ alert("nocon"); }else{ alert("yescon"); } }