2014-09-04 5 views
9

Ho cercato tutto il giorno per la risposta a questo e la sfera di Google non ha fornito alcuna risposta. Ho provato tutto ciò che so come fare e ho lavorato con le soluzioni e le risposte suggerite e niente ha funzionato.Connessione rete PhoneGay - Impossibile leggere la proprietà 'type' di undefined

In poche parole sto cercando di sviluppare un'applicazione per PhonegapAndroid e Apple I dispositivi mobili e una delle caratteristiche di cui ho bisogno è quello di rilevare sia lo stato della rete e il tipo di connessione di rete. Di seguito è riportato il codice che sto usando.

L'avviso Firing device ready si spegne e quindi viene visualizzato l'errore Cannot read property 'type' of undefined seguito dal looping dell'oggetto Navigator. Mentre passo attraverso ognuna di queste proprietà dell'oggetto non vedo la proprietà connection o anche la proprietà network come era usata nelle versioni precedenti.

Qualcuno ha qualche idea?

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

e nel mio config.xml ho:

<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: SOLUZIONE

Una soluzione è stata infine formulato grazie agli sforzi congiunti di @Dawson Loudon e @benka. Dawson corretto il plugin che usavo che avrebbe dovuto essere:

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

E questo in realtà funziona correttamente solo dopo l'attuazione della breve ritardo di cui parla @benka. Così ora il codice di lavoro si presenta così in 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

State voi costruendo localmente o in build.phonegap.com? –

+0

build.phonegap.com –

+2

Si desidera utilizzare il plugin trovato qui: https://build.phonegap.com/plugins/626 '' –

risposta

6

si desidera utilizzare il plugin trovato qui: http://build.phonegap.com/plugins/626

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

per installare questo è necessario per eseguire alcuni comandi alla console? o aggiungilo solo a config.xml –

+0

Questo è specifico per il servizio online 'PhoneGap Build'. Se stai costruendo localmente, invece di aggiungere qualcosa a 'config.xml' esegui' plugin cordova aggiungi org.apache.cordova.network-information' e poi 'cordova build' nella directory del tuo progetto locale. –

2

ho postato questa idea già qui: https://stackoverflow.com/a/19319817/2390075

Quello che ho notato è che networkState non ottiene sempre inizializzato immediatamente. Così che cosa ha funzionato per me è l'aggiunta di un piccolo ritardo dopo aver controllato lo stato e poi il controllo di nuovo, nel tuo caso dovrebbe assomigliare a questa:

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

Grazie per il suggerimento. Ho provato quello di cui stavi parlando e ho persino lavorato con la tua risposta collegata in diverse varianti, ma sfortunatamente sto ancora ottenendo gli stessi risultati. Quando uso 'networkState = navigator.connection && navigator.connection.type;' e avviso 'networkState' riporta come' indefinito' e quando uso 'networkState = navigator.connection.type;' Ottengo lo stesso risultato del mio post originale. –

1

risposta tardi, ma questo ha funzionato perfettamente per me:

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

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

Mi mancava solo uno "=" (si stava usando "=" invece di "=="). Questo post lo ha chiarito. – Zeni