2016-02-19 12 views
6

Próbuję zrobić aplikację do śledzenia użytkownika GPS przez cały czas, ta aplikacja to rodzaj samochodu GPS tracker, aby uzyskać lokalizację kierowcy przez cały czas i wysłać go do serwer.Aplikacja do śledzenia GPS iOS, która działa cały czas

Próbowałem dodać "aktualizacje lokalizacji" do "trybów tła", ale aplikacja automatycznie zawiesza się po 10 minutach, gdy wchodzę w tło.

Czy istnieje sposób, aby ta aplikacja działała przez cały czas i uzyskać lokalizację GPS?

Dziękuję.

Odpowiedz

7

Masz dwie opcje:

1) Regularne śledzenie lokalizacji.
Ten typ śledzenia działa z autoryzacjami kCLAuthorizationStatusAuthorizedWhenInUse i kCLAuthorizationStatusAuthorizedAlways. Gdy CLLocationManager zaczęła śledzić lokalizację, gdy otrzyma aktualizacje lokalizacji w trybie delegowanym locationManager:didUpdateLocations:. Aplikacja może przejść w stan zawieszenia, ale gdy menedżer lokalizacji otrzyma nową aplikację lokalizacyjną, przejdzie w stan tła i obsłuży nową lokalizację w metodzie delegatów. Jak skonfigurować menedżera lokalizacji:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.locationManager = [[CLLocationManager alloc] init]; 

    // Setup location tracker accuracy 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 

    // Distance filter 
    self.locationManager.distanceFilter = 50.f; 

    // Assign location tracker delegate 
    self.locationManager.delegate = self; 

    // This setup pauses location manager if location wasn't changed 
    [self.locationManager setPausesLocationUpdatesAutomatically:YES]; 

    // For iOS9 we have to call this method if we want to receive location updates in background mode 
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){ 
     [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
    } 

    [self.locationManager startUpdatingLocation]; 
} 


2) położenie Znaczenie śledzenia zmian.
Ten typ śledzenia działa tylko z autoryzacją kCLAuthorizationStatusAuthorizedAlways. Otrzymuje nową lokalizację tylko co 500 metrów, więc filtr odległości i pożądana dokładność nie działają tutaj. Aplikacja może przejść do stanu zawieszenia, a nawet może zostać zakończona przez system, ale gdy aplikacja do aktualizacji lokalizacji przejdzie w stan tła i otrzyma lokalizację w delegowanej metodzie locationManager:didUpdateLocations:.
Jeśli aplikacja została zakończona przez system, zostanie ponownie uruchomiona w tle z kluczem UIApplicationLaunchOptionsLocationKey w opcjach uruchamiania w metodzie delegowania aplikacji didFinishLaunchingWithOptions. Jak skonfigurować tego typu na śledzeniu:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.locationManager = [[CLLocationManager alloc] init]; 

    // Assign location tracker delegate 
    self.locationManager.delegate = self; 

    // For iOS9 we have to call this method if we want to receive location updates in background mode 
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){ 
     [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
    } 

    [self.locationManager startMonitoringSignificantLocationChanges]; 
} 


Należy zauważyć, że zarówno z tych metod nie gwarantuje, że aplikacja nie przechodzi do stanu zawieszenia.
Ponadto, jeśli aplikacja została zakończona przez użytkownika (na przykład z przełącznika aplikacji po przesunięciu), śledzenie lokalizacji w tle nie będzie działać.


UPDATE (odpowiadające komentarzach)

Oto moje przykłady kodu, które działają na mnie:
For Regular tracking. Uruchom przykład, zapewnij dostęp do lokalizacji użytkownika, dotknij przycisku Start, aby rozpocząć aktualizacje lokalizacji. Aby przetestować lokalizacje w symulatorze, wybierz w menu symulatora Debugowanie> Lokalizacja> Napęd na autostradzie. Teraz możesz przesuwać aplikację do tła za pomocą przycisku Home (Command + Shift + H). Pozostaw symulator na więcej niż 10 minut, a cała ta aplikacja będzie otrzymywała lokalizacje. Po powrocie do aplikacji zobaczysz czerwone szpilki na mapie.
For Significant changes. Uruchom aplikację i przetestuj ją w taki sam sposób, jak w poprzednim przykładzie.
monitorujące Istotne zmiany mogą być uruchamiane tylko metodą [self.locationManager startMonitoringSignificantLocationChanges];

UPDATE (iOS 11)

Zmiany śledzenia lokalizacji w iOS 11

iOS 11 także wprowadza kilka istotnych zmian do istniejących interfejsów API. Jednym z dotkniętych obszarów jest śledzenie lokalizacji. Jeśli Twoja aplikacja używa lokalizacji tylko wtedy, gdy aplikacja jest na pierwszym planie, jak większość aplikacji, nie musisz niczego zmieniać; Jeśli jednak jest to jedna z tych aplikacji, które nieustannie śledzą lokalizację użytkownika w ciągu dnia, prawdopodobnie warto zarezerwować latem tego lata na wprowadzenie zmian w sposobie śledzenia i testowania możliwych scenariuszy użycia.

poniższy link: https://mackuba.eu/2017/07/13/changes-to-location-tracking-in-ios-11/

+0

Dziękuję za odpowiedź, dla opcji 1, powiedziałeś, że kiedy pojawią się nowe położenie, stan przechodzi od zawieszony na tle, i zostały badania przez kilka dni, a sprawa ta nigdy się ze mną, aplikacja wraca do życia ponownie TYLKO podczas uruchamiania aplikacji ręcznie, a następnie zawiesza się po 10 minutach, dlaczego ??? – TMMDev

+0

Dla opcji 2, czy istnieje sposób, aby jakoś tak ustawić StartMonitoringSignificantLocationChanges w [self.locationManager startUpdatingLocation]? to sprawi, że przynajmniej będzie co 500 metrów co najmniej – TMMDev

+1

Zaktualizowana odpowiedź na twoje komentarze. Nie widzę twojego kodu, więc podałem tutaj linki do przykładów kodu dla obu opcji 1 i 2. – shpasta

0

W odpowiedzi Komentarz 1 w roztworze (nie mogę wypowiedzieć się jeszcze nigdzie): Nie wydaje się, aby rozwiązać problem, jak Twoja aplikacja zostanie zawieszony i nie aktualizuje lokalizacja już po 10 minutach.

miałem ten sam problem: Miałem ustawione setAllowsBackgroundLocationUpdates do YES i miałem klucz NSLocationAlwaysUsageDescription w moim Info.plist, ale mój App używana również do zaprzestania śledzenia położenia po 10 minutach.

Rozwiązałem go poprzez dodanie zarówno NSLocationAlwaysUsageDescription i NSLocationWhenInUseUsageDescription do pliku Info.plist więc wygląda to tak:

<key>NSLocationAlwaysUsageDescription</key> 
    <string>This app needs to use your location</string> 

    <key>NSLocationWhenInUseUsageDescription</key> 
    <string>This app needs to use your location</string> 
0

zestawu it.it wziąć moc baterii ale Twoja aplikacja prowadzony w Background.OS nie zawiesić App

[self.locationManager setPausesLocationUpdatesAutomatically:NO]; 
Powiązane problemy