Исходное местоположение Услуги, не работающие в iOS 7
Недавно я обновил свои iOS-устройства для использования iOS 7. В одном из приложений, которые мы разрабатываем, используются службы определения местоположения для отслеживания местоположения устройства, и все наши тестеры сообщили, что приложение больше не отслеживает в фон под iOS 7.
Мы проверили, что фоновая настройка для приложения включена в настройках устройства, а предыдущая сборка работает безупречно в iOS 6. Даже если устройство было циклически, приложение перезапустится после обновления местоположения.
Есть ли что-то еще, чтобы сделать эту работу под iOS 7?
Ответы
Ответ 1
Извиняюсь за задержку в публикации решения. Я был занят в последние несколько месяцев и догнал свою личную жизнь, пока не забыл об этой теме. Вот решение, которое я использовал для получения непрерывного местоположения с устройств iOS 7, независимо от того, находится ли он на переднем плане или на заднем плане.
Вы можете найти полное решение и объяснение из блога, а также github: -
Методы и объяснение: -
-
Я перезапускаю диспетчер местоположений каждые 1 минуту в функции сделалUpdateLocations
-
Я разрешаю диспетчеру местоположения получать данные из устройства в течение 10 секунд, прежде чем выключать его (чтобы сохранить аккумулятор).
Частичный код ниже: -
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
for(int i=0;i<locations.count;i++){
CLLocation * newLocation = [locations objectAtIndex:i];
CLLocationCoordinate2D theLocation = newLocation.coordinate;
CLLocationAccuracy theAccuracy = newLocation.horizontalAccuracy;
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
if (locationAge > 30.0)
continue;
//Select only valid location and also location with good accuracy
if(newLocation!=nil&&theAccuracy>0
&&theAccuracy<2000
&&(!(theLocation.latitude==0.0&&theLocation.longitude==0.0))){
self.myLastLocation = theLocation;
self.myLastLocationAccuracy= theAccuracy;
NSMutableDictionary * dict = [[NSMutableDictionary alloc]init];
[dict setObject:[NSNumber numberWithFloat:theLocation.latitude] forKey:@"latitude"];
[dict setObject:[NSNumber numberWithFloat:theLocation.longitude] forKey:@"longitude"];
[dict setObject:[NSNumber numberWithFloat:theAccuracy] forKey:@"theAccuracy"];
//Add the vallid location with good accuracy into an array
//Every 1 minute, I will select the best location based on accuracy and send to server
[self.shareModel.myLocationArray addObject:dict];
}
}
//If the timer still valid, return it (Will not run the code below)
if (self.shareModel.timer)
return;
self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager];
[self.shareModel.bgTask beginNewBackgroundTask];
//Restart the locationMaanger after 1 minute
self.shareModel.timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self
selector:@selector(restartLocationUpdates)
userInfo:nil
repeats:NO];
//Will only stop the locationManager after 10 seconds, so that we can get some accurate locations
//The location manager will only operate for 10 seconds to save battery
NSTimer * delay10Seconds;
delay10Seconds = [NSTimer scheduledTimerWithTimeInterval:10 target:self
selector:@selector(stopLocationDelayBy10Seconds)
userInfo:nil
repeats:NO];
}
Обновление в мае 2014 года. У меня появилось несколько запросов на добавление примерных кодов при отправке местоположения на сервер на определенный промежуток времени. Я добавил примеры кодов, а также объединил исправление для BackgroundTaskManager, чтобы решить проблему с запуском фона в течение длительного периода времени. Если у вас есть какие-либо вопросы, вам будет предложено присоединиться к нам для обсуждения здесь: Справочное обновление местоположения Обновление для iOS 7 с обновлением местоположения на сервере
Обновление в январе 2015 года. Если вы хотите получить обновление местоположения, даже когда приложение приостановлено, см. раздел Как получить обновления местоположения для iOS 7 и 8 Даже когда приложение приостановлено
Ответ 2
Если вы посмотрите на видеозапись сессии WWDC 2013 # 204 - Что нового в многозадачности pdf, на странице №15 четко указано, что приложения не будут запускаться в фоновом режиме, если пользователь удалит его из приложения-переключателя. См. Изображение,
![enter image description here]()
Ответ 3
Я думаю, что они сделали оптимизацию (возможно, используя датчики движения), чтобы обнаружить "относительно" стационарное позиционирование телефона, и они останавливают обновления местоположения. Это только предположение, но мои тесты в настоящее время показывают:
- Обновление начального местоположения; (испытаны с точностью 10 и 100 метров, по 3 раза)
- Отключите экран устройства, чтобы установить приложение в фоновом режиме;
- Оставьте устройство неподвижным (например, на столе) в течение 30 минут.
Данные, которые я регистрирую, показывают, что остановка геообстановки перестает появляться после ~ 15 м и 30 секунд. При этом вся другая фоновая обработка, которую вы делаете, также завершается.
Мое устройство - iPhone 5 с iOS 7.
Я уверен на 95%, это было не так на iOS 6/6.1. Где получение гео-обновлений с точностью 100 м используется для того, чтобы вы в значительной степени выполняли непрерывную работу в фоновом режиме.
Обновление
Если вы перезапускаете диспетчер местоположений каждые 8 минут, он должен работать непрерывно.
Обновление # 2
Я не тестировал это в последнюю очередь, но это то, как я перезапустил его, когда написал запись. Надеюсь, это будет полезно.
- (void)tryRestartLocationManager
{
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
int seconds = round(floor(now - locationManagerStartTimestamp));
if ( seconds > (60 * 8) ) {
[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];
locationManagerStartTimestamp = now;
}
}
Ответ 4
Одно из моих приложений iOS должно регулярно отправлять обновление местоположения на сервер, а следующий подход работал для нас....
Начиная с iOS 7:
- приложение должно было уже использовать службы определения местоположения
(startUpdatingLocation) ПЕРЕД тем,
подходящий для фонового времени работы
- тайм-аут льготного периода фона был уменьшен с 10 минут до 3
минут
- остановка обновлений местоположения (через stopUpdatingLocation) запустит 3
минута backgroundTimeRemaining count down
- обновления исходного местоположения, если уже в фоновом режиме не будет
reset backgroundTimeRemaining
Итак, НЕ останавливайте обновления местоположения в любое время... Вместо этого предпочитайте использовать необходимую точность (точное расположение и грубое местоположение). Грубое место не потребляет много батареи... так что это решение решает вашу проблему.
После долгих поисков в Интернете найдено ссылку, которая обеспечивает жизнеспособное решение для iOS 7. Решение выглядит следующим образом:
- Пока приложение все еще находится на переднем плане, начните обновление местоположения
(startUpdatingLocation), но установите фильтры точности и расстояния для
очень конечно-зернистые (например, 3 км) обновления. Важно сделать это
на переднем плане (в applicationDidEnterBackground слишком поздно).
- Если требуется мелкомасштабное разрешение, временно установите
точность и дистанционные фильтры, чтобы получить наилучшее возможное местоположение и
затем верните их обратно к конечному значению - но никогда не останавливайтесь
обновления местоположения.
- Поскольку обновления местоположения всегда включены, приложение не получит
приостановлено, когда оно переходит на задний план.
И убедитесь, что вы добавили следующее в свои приложения Info.plist
"местоположение" к ключу UIBackgroundModes
"location-services" и "gps" к ключу UIRequiredDeviceCapabilities
Кредиты: http://gooddevbaddev.wordpress.com/2013/10/22/ios-7-running-location-based-apps-in-the-background/
Ответ 5
Я нашел еще один поток Начать менеджер местоположений в iOS 7 из фоновой задачи Sash упомянул, что
Я нашел проблему/решение. Когда пришло время начать работу с местоположением и остановить фоновое задание, фоновая задача должна быть остановлена с задержкой (я установил 1 секунду). В противном случае служба поиска не запускается.
Кто-нибудь может это проверить и проверить?
Николай, вы можете вставить свой код здесь? Я пытался перезапустить диспетчер местоположений каждые 8 минут, но он не запускается непрерывно.
Update:
После поиска High и Low я нашел решение от Apple Forum!
В iOS 7 вы не можете запустить службу определения местоположения в фоновом режиме. Если вы хотите, чтобы служба определения местоположения продолжала работать в фоновом режиме, вы должны запустить ее на переднем плане, и она будет продолжать работать в фоновом режиме.
Если вы были похожи на меня, остановите службу определения местоположения и используйте таймер для повторного запуска его в фоновом режиме, он НЕ будет работать.
Для получения более подробной информации вы можете посмотреть первые 8 минут видео 307 из WWDC 2013: https://developer.apple.com/wwdc/videos/
Февраль 2014 Обновление:
Я могу получить местоположение непрерывно с устройства с помощью iOS 7 после нескольких месяцев попыток. Вы можете увидеть полный ответ здесь: Справочная информация Услуги, не работающие в iOS 7
Ответ 6
Значок на панели состояния включен? У меня тоже странное поведение.
Проверьте мой вопрос: startMonitoringSignificantLocationChanges, но через некоторое время didUpdateLocations больше не вызывается
Я обнаружил, что существенные изменения местоположения были, но просто остановка и перезапуск службы (для значительных изменений) не приводили в действие новые местоположения.