Службы определения местоположения не останавливаются при завершении работы приложения

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

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

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

Кто-нибудь знает что-нибудь об этом? Если нужно, могу выложить свой код.

заранее спасибо

Редактировать :

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


person Geoffroy    schedule 14.09.2011    source источник


Ответы (7)


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

[EDIT] Когда ваше приложение переходит в фоновый режим или прекращает работу по какой-либо причине (например, из-за телефонного звонка), вы должны остановить службы определения местоположения в это время. Вам нужно подписаться на уведомления и предоставить метод для остановки и запуска служб определения местоположения, что-то вроде этого:

-(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];
}
person progrmr    schedule 14.09.2011
comment
Спасибо за ваш ответ, я добавил CLLocationManager stopMonitoringSignificantLocationChanges в мой метод Dealloc локатора, но он все еще не работает! - person Geoffroy; 14.09.2011
comment
Dealloc не в том месте. Вам необходимо подписаться на уведомления. Я добавил больше деталей в свой ответ. - person progrmr; 14.09.2011
comment
Еще раз спасибо, я применил ваш метод, но он все еще не работает! Я добавил лог, и методы вызываются в нужный момент, но приложение продолжает находить - person Geoffroy; 14.09.2011
comment
Откуда вы знаете, что он продолжает находить? Я сомневаюсь. Попробуйте удалить его из ползунка истории приложений внизу. - person progrmr; 15.09.2011
comment
Это то, что я делаю... И я знаю, что он продолжает находить, потому что индикатор локализации продолжает отображаться - person Geoffroy; 15.09.2011

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

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

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

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

person Geoffroy    schedule 22.09.2011
comment
Это решило мою проблему. Я удалил мониторинг значительных изменений, но мониторинг местоположения по-прежнему оставался активным. Сброс уведомлений о местоположении в настройках устранил ошибку для меня. - person Kelend; 23.11.2011
comment
Я просто потратил часы на отслеживание одной и той же функции с помощью службы значительных изменений. Так же, как вы описываете мониторинг региона, я удалил службу значительных изменений несколько версий назад, полностью удалил и переустановил приложение, и когда я включил стандартные службы определения местоположения в текущей версии приложения, а затем выключил его, службы определения местоположения значок останется включенным. Очевидно, что важные изменения настроек также сохраняются, несмотря на удаление приложения. Я только что позвонил stopMonitoringSignificantLocationChanges один раз, и теперь все в порядке. Вау, это расстраивает. - person Rob; 25.02.2013
comment
Да, спасибо Apple за хороший фреймворк :) irony На какой версии iOS вы тестируете? Может быть хорошо, чтобы заполнить радар - person Geoffroy; 26.02.2013
comment
(посмотрите этот замечательный сайт: bugreport.apple. com/cgi-bin/WebObjects/RadarWeb.woa/59/wo/) - person Geoffroy; 26.02.2013

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

Вроде как баг, но как я понял, это не так. Просто требуется немного больше очистки.

person Bill Burgess    schedule 21.09.2011
comment
Проверьте все места, где у вас настроен ‹CLLocationManagerDelegate›. Они будут местами, которые висят на вашем мониторинге местоположения. - person Bill Burgess; 21.09.2011

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

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

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

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

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

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

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

person Simon Tillson    schedule 19.07.2012

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

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

person EricLeaf    schedule 20.09.2011
comment
Иконка не сохраняется какое-то неопределенное время. Он остается до тех пор, пока используется местоположение. Как только вы остановитесь, значок сразу исчезнет. - person Bill Burgess; 21.09.2011

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

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

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

не в applicationWillEnterForeground:. Тем не менее, значок поиска исчезает через несколько секунд.

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

person Li Fumin    schedule 06.04.2012
comment
Почему я не могу? Ответ, который вы отметили, работает для вас, не означает, что он определенно работает для других. Мой пост может быть бесполезен для вас, другие могут найти этот пост полезным. - person Li Fumin; 12.04.2012
comment
Я согласен с вами, но вы не даете нового ответа, так как то, что вы сказали, уже есть в предыдущих постах :) - person Geoffroy; 12.04.2012

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

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

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

  • GPS на базе -(void)start/stop_UpdatingLocation;

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

person Ariel    schedule 20.09.2011