2014-09-04 18 views
9

Przez cały dzień szukałem odpowiedzi, a sfera Google nie dostarczyła żadnych odpowiedzi. Próbowałem wszystkiego, co umiem, i pracowałem nad proponowanymi rozwiązaniami i odpowiedziami i nic nie zadziałało.Połączenie sieciowe Phonegap - Nie można odczytać właściwości typu "niezdefiniowana"

Krótko mówiąc, próbuję stworzyć aplikację Phonegap dla urządzeń Android i Apple. Jedną z funkcji, których potrzebuję, jest wykrywanie statusu sieci i rodzaju połączenia sieciowego. Poniżej znajduje się kod, którego używam.

Alert Firing device ready odpala, a następnie pojawia się błąd Cannot read property 'type' of undefined, po którym następuje zapętlenie obiektu Navigator. Przechodząc przez każdą z tych właściwości obiektu, nie widzę właściwości connection ani nawet właściwości network, która była używana w starszych wersjach.

Ktoś ma jakieś pomysły?

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); 
     }); 
    } 
} 

iw moim config.xml mam:

<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: roztwór

roztwór ostatecznie formułowane przez połączone wysiłki @Dawson Loudon i @benka. Dawson poprawione wtyczki używałem które powinny być:

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

I to naprawdę działa tylko poprawnie po wdrożeniu krótkie opóźnienie wspomniany przez @benka. Teraz kod wygląda następująco pracy w 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

ty budowania lokalnie lub w build.phonegap.com? –

+0

build.phonegap.com –

+2

Chcesz użyć wtyczki znalezionej tutaj: https://build.phonegap.com/plugins/626 '' –

Odpowiedz

6

Chcesz użyć wtyczki znaleźć tutaj: http://build.phonegap.com/plugins/626

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

zainstalowanie tego jest wymagane, aby uruchomić jakieś polecenie na konsoli? lub dodaj to tylko do config.xml –

+0

Jest to specyficzne dla usługi online 'PhoneGap Build'. Jeśli budujesz lokalnie, zamiast dodawać cokolwiek do 'config.xml' uruchom' cordova plugin dodaj org.apache.cordova.net-information', a następnie 'cordova build' w swoim lokalnym katalogu projektu. –

2

Pisałem tu już ten pomysł: https://stackoverflow.com/a/19319817/2390075

Co zauważyłem jest to, że nie zostanie networkState zawsze zainicjowane natychmiast. Więc co pracował dla mnie jest dodanie niewielkiej zwłoki po sprawdzeniu stanu, a następnie sprawdzenie go ponownie, w Twoim przypadku powinno to wyglądać tak:

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

Dzięki za sugestię. Próbowałem tego, o czym mówisz, a nawet pracowałem z połączoną odpowiedzią w różnych odmianach, ale niestety nadal uzyskuję takie same wyniki. Kiedy używam 'networkState = navigator.connection && navigator.connection.type;' i alert 'networkState' to zgłasza się jako' undefined' i kiedy po prostu używam 'networkState = navigator.connection.type;' Otrzymuję taki sam wynik jak mój Oryginalny post. –

1

Późne odpowiedź, ale to działało idealnie dla mnie:

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

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

Po prostu brakowało mi jednego "=" (tj. Używałem "=" zamiast "=="). Ten post wyczyścił to. – Zeni

Powiązane problemy