2017-11-20 110 views
6

Stworzyłem aplikację w PhoneGap, która śledzi twoją podróżowaną trasę przez interfejs API geolokalizacji, otrzymuję aktualną pozycję urządzenia przez navigator.geolocation.getCurrentPosition(onSuccess, onError); i aktualizowanie polilinii przez uzyskanie położenia po regularnych odstępach czasu przez navigator.geolocation.watchPosition(function(position) Ale teraz problem polega na tym, że nie działa on w tle tj. (gdy otwieram kolejną aplikację i zaczyna działać w tle) nie aktualizuje średniej polilinii nie wyzwalającej tej funkcji navigator.geolocation.watchPosition(function(position) więc próbowałem uruchomić aplikację przez Cordova-plugin-background-mode tę wtyczkę jej uruchomienie aplikacji w tle i ponownie, która nie wyzwala funkcji navigator.geolocation.watchPosition(function(position) oznacza, że ​​nie było to wymagane .e (nie było potrzeby instalowania wtyczki, aby uruchomić aplikację w tle). Proszę pomóż mi rozwiązać ten problem z uzyskaniem pozycji w tle. A jeśli użyję tej wtyczki Cordova-plugin-mauron85-background-geolocation, jak mogę uzyskać pozycję, gdy przechodzę przez pozycję oglądania? i co zrobić, jeśli aplikacja działa na pierwszym planie? czy muszę używać funkcji watchPosition lub czegoś innego?Aby uzyskać lokalizację urządzenia po określonych odstępach czasu, gdy aplikacja Phonegap działa w tle za pomocą interfejsu API geolokalizacji

Odpowiedz

1

Możesz chcieć przekopać się do tego location plugin. Wydają się sądzić, że rozwiązali problem.

Szybka fiddle i test na telefonach Mam dostęp, aby pokazać, że to nie jest problem z kartami. To jest problem z systemem operacyjnym. Większość telefonów została zoptymalizowana pod kątem wstrzymania aktywności w tle, zwłaszcza w przeglądarce internetowej. Najlepiej jest powiązać z natywnymi wydarzeniami, aby uzyskać pożądane zachowanie.

navigator.geolocation.watchPosition(positionChanged, err, options); 

Zauważyłem, że telefony zachowują wszystkie połączenia otwarte nawet dla zadań wykonywanych w tle. Możesz być w stanie zagrać w sytuację, wykonując wywołanie ajax na serwerze, który nie odmawia, ale nie odpowiada, dodaje handler przekroczenia limitu czasu i ustawia interwał, który chcesz, w ajax timeout handler sprawdzić lokalizację, a następnie skonfigurować nowe połączenie.

Powodzenia!

+0

@everyone daj nam znać, jeśli spróbować Ajax siekać wykonywać w odstępach czasu, gdy w tle. –

0

Jest próbka z cordova-plugin-background-mode:

var backgroundGeoLocation = window.plugins.backgroundGeoLocation; 

function startGetLocation() { 

var callbackFn = function(location) { 
    console.log('[js] BackgroundGeoLocation callback: ' + location.latitude + ',' + location.longitude); 
    var latitude = location.latitude; 
    var longitude = location.longitude; 
    var pontos = []; 
    if($localStorage.getPontosGps() && $localStorage.getPontosGps().pontos){ 
     pontos = $localStorage.getPontosGps().pontos; 
    } 


    $log.log('lat: ' + latitude); 
    $log.log('long: ' + longitude); 

    if (!_.find(pontos, { 
     latitude: latitude, 
     longitude: longitude 
     })) { 

     pontos.push({ 
     latitude: latitude, 
     longitude: longitude, 
     velocidade: null 
     }); 

     $localStorage.setPontosGps({ 
     isRunning: true, 
     pontos: pontos 
     }); 
    } 
    backgroundGeoLocation.finish(); 
    }; 

    var failureFn = function(error) { 
    console.log('BackgroundGeoLocation error: ' + error); 
    }; 

    backgroundGeoLocation.configure(callbackFn, failureFn, { 
    desiredAccuracy: 10, 
    stationaryRadius: 20, 
    distanceFilter: 30, 
    debug: false, 
    stopOnTerminate: false, 
    locationTimeout: 10, 
    notificationTitle: 'Title', // <-- android only, customize the title of the notification 
    notificationText: 'Collecting geolocation' 
    }); 

    backgroundGeoLocation.start(); 

}