Подтвердить что ты не робот

Службы местоположения не прекращаются, когда приложение прекращается

В настоящее время я разрабатываю приложение для iPhone, которому нужны службы определения местоположения для различных целей, включая AR.

Я тестирую все на симуляторе и на своем iPhone 3GS, и все прошло хорошо.

Недавно я тестировал iPhone4 и iPad2, а служба определения местоположения (маленькая иконка в строке состояния) продолжает отображаться, даже когда я вручную убиваю приложение! Единственный способ отключить этот значок - это вручную остановить службу определения местоположения для моего приложения в настройках.

Кто-нибудь знает что-то об этом? При необходимости я могу опубликовать свой код.

Заранее благодарю

Изменить:

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

4b9b3361

Ответ 1

Я нашел ответ! Он пришел из регионального мониторинга, который я включил раньше, но удалил весь код, используя его несколько недель назад.

Как я уже тестировал на iPad, и даже если я удалил и заново установил приложение, система, похоже, сохранила информацию о регионе, который я контролировал.

Таким образом, как описано documentation, iOS продолжал находить для моего приложения, как и startMonitoringSignificantLocationChanges.

Спасибо за ответы, это дало мне лучшее понимание системы местоположения и ее эффективного использования (в частности, благодаря progrmr и Билл Браски)

Ответ 2

Похоже, что вы приложение входит в фоновый режим и все еще использует CLLocation. Вы можете остановить CLLOcationManager, когда вы получите уведомление о том, что приложение является активным, это лучший способ. Затем возобновите его, когда он станет активным. Ответ в этом вопросе показывает, как это сделать здесь

[РЕДАКТИРОВАТЬ] Когда ваше приложение переходит в фоновый режим или уходит в отставку по какой-либо причине (т.е.: телефонный звонок), вы должны прекратить услуги определения местоположения в это время. Вам необходимо подписаться на уведомления и предоставить метод остановки и запуска служб определения местоположения, например:

-(void)appDidBecomeActiveNotif:(NSNotification*)notif
{
    [locationManager startUpdatingLocation];
}

-(void)appWillResignActiveNotif:(NSNotification*)notif
{
    [locationManager stopUpdatingLocation];
}

-(void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActiveNotif:) name:UIApplicationDidBecomeActiveNotification object:nil];         
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActiveNotif:) name:UIApplicationWillResignActiveNotification object:nil]; 
}

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

Ответ 3

Я столкнулся с этой же самой точной проблемой при использовании инструментов мониторинга региона. Не имело значения, что я сделал, чтобы отключить регионы, стрелка осталась. Я, наконец, решил проблему, очистив вызовы locationManager. Если вы закрываете свое представление и не нуждаетесь в менеджере местоположений, установите его на нуль и/или отпустите. Если вы отслеживаете местоположение в фоновом режиме, оно останется там, но если нет, убедитесь, что вы очищаете весь свой мониторинг местоположения.

Кажется, что это ошибка, но, как я узнал, это не так. Просто требуется немного больше очистки.

Ответ 4

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

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

Если у вас есть код, который освобождает ваш CLLocationManager в applicationDidEnterBackground, а затем вы назначаете совершенно новый в applicationDidEnterForeground и т.д., то у вас, вероятно, будет эта проблема.

Решение таково:

  • Создайте объект CLLocationManager один раз, в applicationDidFinishLaunching.
  • Чтобы начать, вызовите startUpdatingLocation, startMonitoringSignificantLocationChanges и т.д. как обычно.
  • Чтобы остановить обновления, вызовите соответствующий stopUpdatingLocation, stopMonitoringSignificantLocationChanges и т.д. как обычно.
  • Никогда, никогда не выпускайте свой CLLocationManager или не устанавливайте его ссылку на nil (кроме, возможно, в applicationWillTerminate, но это, вероятно, не имеет никакого значения).

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

Примечание. Протестировано на iPhone 4S под управлением iOS 5.1.1. Чтобы получить точные результаты производительности приложения в этом отношении, убедитесь, что вы вошли в Настройки- > Службы местоположения- > Системные службы и отключили переключатель значка строки состояния. Таким образом, стрелка строки состояния будет точно отражать использование только приложениями.

Ответ 5

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

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

Ответ 6

Это решение, которое исправило эту проблему для меня.

Просто прекратите изменение местоположения в

- (void) applicationDidEnterBackground: (UIApplication *)application
{
    [locationManager stopMonitoringSignificantLocationChanges];
    locationManager.delegate = nil;
}

не в applicationWillEnterForeground:. Чтобы исчезнуть значок местоположения, требуется несколько секунд.

Я не знаю, почему он не работает в последнем методе.

Ответ 7

Я столкнулся с этой проблемой некоторое время назад и нашел полезным применить только один метод applicationDelegate object

- (void)applicationWillEnterForeground:(UIApplication *)application;

Если вы остановите свой CLLocationManager на получении обновлений внутри этого вызова, вы будете в порядке. Конечно, вам нужно начать обновление где-то еще, и - (void)applicationDidBecomeActive:(UIApplication *)application; будет хорошим выбором. Также вам нужно отметить, что существует два метода определения местоположения

  • основанный на gps -(void)start/stop_UpdatingLocation;

  • и 3g/wi-fi на основе -(void)start/stop_MonitoringSignificantLocationChanges;