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/
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
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
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