2013-04-11 15 views
7

Standardowy interfejs API PhoneGap do sprawdzania bieżącego połączenia sieciowego (patrz poniżej) nie wydaje się aktualizować jego wyniku w Emulator ripple. Kiedy zmienić typ połączenia i wykonać checkConnection(), zwraca typ połączenia z pierwszego połączenia do tej funkcji (w deviceready)Stan połączenia sieciowego z PhoneGap nie aktualizuje się w Ripple

function checkConnection() { // Checks current network status 
    networkState = navigator.connection.type; 
    console.log(networkState); 

    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'; 

    // DEBUG: notify on network state 
    console.log("Connection type: " + states[networkState]); 
} 

Czy coś jeszcze muszę zrobić (dodać detektor zdarzeń?) Do zmusić to do działania? Zwykle urządzenie wywołuje zdarzenie tylko wtedy, gdy jego status zmienia się z online na offline, ale muszę rozróżnić "wolne" połączenia internetowe i xG.

+1

Czy to naprawdę takie marne pytanie? Czy nikt nigdy nie napotkał tego problemu? –

Odpowiedz

-1

Powiedziałbym, że próbuję dodać funkcję limitu czasu, aby opóźnić połączenie. Już widziałem podobne problemy, gdy to rozwiązało problem. Najpierw wykonaj:

networkState = navigator.connection.type; 

następnie:

setTimeout(function(){ 

    networkState = navigator.connection.type; // have to do this second time to pick up the refreshed value 
    console.log(networkState); 

    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'; 

    // DEBUG: notify on network state 
    console.log("Connection type: " + states[networkState]); 
}, 500); 

To daje czas (500 ms w tym przykładzie) do navigator.connection.type odświeżyć jego wartość.

+1

Możesz też użyć onDeviceReady() http://stackoverflow.com/a/17754340/1427338 – bleuscyther

+0

@bleuscyther, jeśli działa to konsekwentnie, to o wiele lepsze rozwiązanie. Jestem prawie pewien, że moja inicjalizacja stanu sieci przebiegała po 'onDeviceReady()', ale czasami nie działa. Muszę to jeszcze raz sprawdzić;) Pozdrawiam za aktualizację – benka

+0

Próbowałem tego, ale nie działa – wmfairuz

6

Najwyraźniej navigator.connection.type nie aktualizuje się w cordova na platformie Windows. Patrząc na kod, navigator.connection.type jest ustawiany tylko raz po zdarzeniu "deviceready".

Sztuką jest ręcznie zaktualizować go za pomocą połączenia # GetInfo() na powiązanych wydarzeń

var connection = navigator.connection; 
function errorCallback(e) { 
    console.warn(e); 
}; 
function updateConnection(info) { 
    connection.type = info; 
} 
document.addEventListener("resume", function() { 
    connection.getInfo(updateConnection, errorCallback); 
}); 
document.addEventListener("online", function() { 
    connection.getInfo(updateConnection, errorCallback); 
}); 
document.addEventListener("offline", function() { 
    connection.getInfo(updateConnection, errorCallback); 
}); 

Zastrzeżenie: refactored/Copy-wklejane kawałki z mojego własnego kodu, powinien działać po wyjęciu z pudełka.

+0

To działa całkowicie, ale jak do cholery to odkryłeś? Nie mogę nic na ten temat znaleźć, oprócz twojej odpowiedzi i teraz, gdy już wiem, czego szukać, źródła cordova. –

Powiązane problemy