2015-07-01 4 views
3

Я пытаюсь найти места, пока мое приложение находится в фоновом режиме. Все работает отлично, когда я использую свое приложение. Я также могу переключиться на любое другое приложение (даже на начальном экране), и все еще остаются в памяти. Если я использую свой телефон, но мое приложение находится в фоновом режиме, обновления обновляются, как кажется, очень хорошо, пока мой телефон активен (не заблокирован).iOS Location Manager останавливается после того, как телефон заблокирован на ~ 10 минут

Однако, если я заблокирую телефон, и я вернусь примерно через 10 минут, значок местоположения в строке состояния и мое приложение больше не получают обновления местоположения.

Я проверил для аварии приложения и нет отчета об аварии. Мое приложение также по-прежнему появляется в списке приложений, поэтому я не думаю, что он разбился.

Должен ли GPS оставаться навсегда, если я попрошу разрешения «Всегда». Или ОС выключает его после того, как телефон спит какое-то время?

Здесь есть являются записи в моей PLIST:

<key>NSLocationAlwaysUsageDescription</key> 
<string></string> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string></string> 

А вот скриншот услуг фона местоположения на:

enter image description here

Вот мой пользовательский класс, который является менеджером местоположения делегат:

@interface LocationDelegate() 
    @property (nonatomic, strong) CLLocationManager *locationManager; 
@end 

@implementation LocationDelegate 

+ (instancetype) singleton { 
    static LocationDelegate *delegate = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     delegate = [[self alloc] init]; 
    }); 
    return delegate; 
} 

- (id) init { 
    if (self = [super init]) { 
     // for now filter and accuracy are based on the same preference 
     _locationManager = [[CLLocationManager alloc] init]; 
     _locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; 
     _locationManager.delegate = self; 

     // Check for iOS 8 
     if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
      [_locationManager requestAlwaysAuthorization]; 
     } 

    return self; 
} 

Обратите внимание, что это является одноэлементным. Это имеет значение? Этот класс очищается после того, как мое приложение некоторое время находилось в фоновом режиме или приостановлено? Из того, что я прочитал, я не думаю, что подобные синглы убираются, поскольку они являются сильными ссылками, поэтому я не думаю, что это проблема ... но я действительно не знаю, почему я прекратил получать места после определенного количества время.

EDIT:

Кажется, что мой менеджер местоположения паузы геоданных через некоторое время. Большая проблема в том, что я не получаю резюме.

У меня есть набор activityType до значения по умолчанию

CLActivityTypeOther

Я могу попробовать другие activityTypes, чтобы увидеть, если это будет иметь значение. Однако я полагаюсь на свое приложение, чтобы работать на прогулку и вождение.

Я думаю, что я бегу в той же проблемы, как это:

iPhone GPS in background never resumes after pause

+0

Привет @lostintranslation, у меня такая же проблема. Пожалуйста, предоставьте мне ответ, если у вас есть. –

ответ

0

Да, она должна оставаться так долго, как вы позволяете его в BackgroundModes, просить requestAlwaysAuthorization и добавить NSLocationAlwaysUsageDescription. Тем не менее, NSLocationAlwaysUsageDescription должен иметь описание, ваш XML выглядит так, как будто у вас его нет. Очевидно, вам также нужно вызвать startUpdatingLocation.

Если вы считаете, что ваш синглтон может быть частью проблемы, попробуйте переместить код в appDelegate.

+0

NSLocationAlwaysUsageDescription - это нормально, чтобы быть пустой строкой. Я буду больше смотреть в синглтон. – lostintranslation

+1

Я сравнил его с моим (Swift) кодом, и я не думаю, что делаю что-то по-другому, за исключением того, что у меня нет синглтона, а для iOS9 я добавил также «locationManager.allowsBackgroundLocationUpdates = true'. Приложение выполняет фоновое обновление должным образом. – MirekE

1

Нет, это не обязательно будет продолжаться в фоновом режиме.По умолчанию для pausesLocationUpdatesAutomatically установлено значение YES, что в сочетании с activityType (если установлено) поможет ОС определить, когда безопасно приостанавливать обновления местоположения, чтобы сохранить мощность. Вы можете реализовать делегат locationManagerDidPauseLocationUpdates: для регистрации, если ОС приостановила ваши обновления.

Также, чтобы быть ясным, установка requestAlwaysAuthorization не означает, что locationManager будет продолжать работать, это просто означает, что ваше приложение может запустить locationManager с переднего плана или фона или приостановленных режимов.

+0

pausesLocationUpdatesАвтоматически установленный YES должен быть в порядке. До тех пор, пока я снова начну двигаться, менеджер местоположений начинает резервное копирование «приостановки», чего не происходит. Я проверю хотя бы, если он почему-то приостанавливается и не перезапускается. Также, когда вы говорите: «не означает, что locationManager будет работать», каков правильный способ сохранить работу менеджера местоположений? Если вам нужно, чтобы я опубликовал больше кода, дайте мне знать. – lostintranslation

+0

Да, locationManager должен снова начать обновление, если вы снова начнете двигаться. Когда он перезагружается, он должен вызывать 'locationManagerDidResumeLocationUpdates:' Тем не менее, он может занять некоторое движение, прежде чем он начнется снова, на основе вашего фильтра расстояния и настроек точности. Вы также должны посмотреть на настройку 'activityType' в locationManager, чтобы помочь ОС узнать, когда приостанавливать обновления. В вашем случае вы можете захотеть установить его на 'CLActivityTypeAutomotiveNavigation' – rmp

+0

В моем приложении используются данные о местоположении для авто и пешехода. Устанавливает ли actionType значение CLActivityTypeAutomotiveNavigation, которое вызовет проблемы при прохождении пользователей? В настоящее время он установлен на значение по умолчанию «CLActivityTypeOther». Похоже, что мой менеджер местоположений не возобновляется после значительного перемещения – lostintranslation

0

Перезапуск после паузы будет иметь тот же эффект, что и не позволять ему делать паузу. Да, это удар батареи, но мой единственный вариант, если я хочу, чтобы он работал, когда пользователь снова начинает двигаться.