Услуги определения местоположения не прекращаются, когда приложение прекращается - PullRequest
11 голосов
/ 14 сентября 2011

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

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

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

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

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

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

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

Ответы [ 7 ]

8 голосов
/ 22 сентября 2011

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

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

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

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

7 голосов
/ 14 сентября 2011

Звучит так, будто ваше приложение уходит в фон и все еще использует 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];
}
2 голосов
/ 19 июля 2012

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

Причина, по которой служба определения местоположения не останавливается при запросе, не в том, что вы ее не остановили или не выпустили должным образом. На самом деле это вызвано освобождением и перераспределением самого 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. Чтобы получить точные результаты о производительности вашего приложения в этом отношении, убедитесь, что вы идете в Настройки-> Службы определения местоположения-> Системные службы и отключите переключатель значка строки состояния. Таким образом, стрелка в строке состояния будет точно отражать использование только приложениями.

2 голосов
/ 21 сентября 2011

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

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

1 голос
/ 06 апреля 2012

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

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

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

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

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

1 голос
/ 21 сентября 2011

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

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

0 голосов
/ 21 сентября 2011

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

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

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

  • на основе GPS -(void)start/stop_UpdatingLocation;

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

...