Ответ 1
У вас есть два варианта здесь:
1) Регулярное отслеживание местоположения.
Этот тип отслеживания работает с kCLAuthorizationStatusAuthorizedWhenInUse
и kCLAuthorizationStatusAuthorizedAlways
. Когда CLLocationManager
запустил отслеживание местоположения один раз, он получит обновления местоположения в методе делегата locationManager:didUpdateLocations:
Приложение может перейти в приостановленное состояние, но когда менеджер местоположений получает новое местоположение, приложение переходит в фоновое состояние и обрабатывает новое местоположение в методе делегата. Как настроить диспетчер местоположения:
- (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) Отслеживание изменений местоположения.
Этот тип отслеживания работает только с авторизацией kCLAuthorizationStatusAuthorizedAlways
. Он получает новое местоположение только каждые 500 метров, поэтому фильтр расстояния и требуемая точность здесь не работают. Приложение может перейти в приостановленное состояние и даже может быть прервано системой, но при обновлении местоположения приложение переходит в фоновое состояние и получает местоположение в методе делегата locationManager:didUpdateLocations:
Если приложение было UIApplicationLaunchOptionsLocationKey
системой, оно будет перезапущено в фоновом режиме с ключом UIApplicationLaunchOptionsLocationKey
в параметрах запуска в didFinishLaunchingWithOptions
делегата приложения didFinishLaunchingWithOptions
. Как настроить этот тип на отслеживание:
- (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];
}
Вы должны заметить, что оба эти метода не гарантируют, что ваше приложение не перейдет в приостановленное состояние.
Кроме того, если приложение было прервано пользователем (например, с помощью переключателя приложений путем пролистывания), отслеживание местоположения в фоновом режиме не будет работать.
ОБНОВЛЕНИЕ (соответствует комментариям)
Вот мои примеры кода, которые работают для меня:
Для регулярного отслеживания. Запустите пример, предоставьте доступ к местоположению пользователя, нажмите кнопку "Пуск", чтобы начать обновление местоположения. Для проверки местоположения в симуляторе выберите в меню симулятора "Отладка"> "Расположение"> "Автострада". Теперь вы можете переместить приложение в фоновый режим с помощью кнопки "Домой" (Ctrl + Shift + H). Оставьте симулятор более 10 минут, и все это время приложение будет получать локации. Когда вы вернетесь в приложение, вы увидите красные булавки на карте.
Для значительных изменений. Запустите приложение и протестируйте так же, как в предыдущем примере.
Мониторинг Значительных изменений можно запустить только методом [self.locationManager startMonitoringSignificantLocationChanges];
ОБНОВЛЕНИЕ (iOS 11)
Изменения в отслеживании местоположения в iOS 11
iOS 11 также вносит некоторые существенные изменения в существующие API. Одним из пострадавших районов является отслеживание местоположения. Если ваше приложение использует местоположение только в то время, когда оно находится на переднем плане, как это делают большинство приложений, вам, возможно, вообще не придется ничего менять; однако, если это одно из тех приложений, которые непрерывно отслеживают местоположение пользователей в течение дня, вам, вероятно, стоит забронировать время этим летом, чтобы внести некоторые изменения в отслеживание и тестирование возможных сценариев использования.
перейдите по этой ссылке: https://mackuba.eu/2017/07/13/changes-to-location-tracking-in-ios-11/