Исходное местоположение Услуги, не работающие в 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 больше не вызывается

Я обнаружил, что существенные изменения местоположения были, но просто остановка и перезапуск службы (для значительных изменений) не приводили в действие новые местоположения.