Как отключить любые объекты CLRegion, зарегистрированные с помощью -startMonitoringForRegion?

Я использую NavigationController для отображения списка геозон, доступных пользователю. Вверху есть глобальный переключатель включения/выключения, который я хотел бы использовать для отключения любых ограждений, зарегистрированных с помощью CoreLocation -startMonitoringForRegion.

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

Когда я отключаю свои заборы по отдельности, я делаю это так.

CLLocationCoordinate2D coord;
coord.latitude = [[settingsData valueForKey:@"latitude"] doubleValue];
coord.longitude = [[settingsData valueForKey:@"longitude"] doubleValue];
CLLocationDistance radius = [[settingsData valueForKey:@"radius"] intValue];
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:coord radius:radius identifier:[settingsData valueForKey:@"name"]];

// remove this fence from system monitoring
[locationManager stopMonitoringForRegion:region];
[region release];

Я просмотрел всю документацию Apple по CoreLocation и использованию этих методов, и я в конце концов.

Я пытался вызвать [locationManager monitoredRegions];, но он возвращает только активное ограждение и только тогда, когда у меня загружено подробное представление. Я не могу вызвать его в любом другом месте в моей программе и заставить его возвращать какие-либо из моих заборов, хотя я знаю, что они должны быть активны. Если у кого-то есть какие-либо советы, куда идти дальше, я весь слушаю.


person Bill Burgess    schedule 15.08.2011    source источник
comment
Получу ли я значок за вопрос, которого все избегают, как чумы?   -  person Bill Burgess    schedule 16.08.2011
comment
Вы пытались задать этот вопрос на devforums.apple.com?   -  person jtbandes    schedule 23.08.2011
comment
Нет, но, наверное, должен. Я ничего не получаю с этим здесь.   -  person Bill Burgess    schedule 23.08.2011
comment
Образец приложения LocationReminders с WWDC 2010, по-видимому, подразумевает, что вам нужно передать тот же экземпляр CLRegion, чтобы остановить, который вы использовали для запуска. Я не могу проверить это в данный момент.   -  person    schedule 23.08.2011
comment
Я могу отменить регистрацию региона, если я использую тот же регион, в котором я его создал, но если я не знаю, какой регион существует ... как мне узнать, какой из них создать, чтобы удалить его. Эта проблема пинала меня в задницу, и об этом не так много.   -  person Bill Burgess    schedule 24.08.2011


Ответы (3)


Или более простое решение:

for (CLRegion *monitored in [locationManager monitoredRegions])
    [locationManager stopMonitoringForRegion:monitored];
person thepaperboy    schedule 03.07.2012
comment
Я думаю, вам также следует проверить идентификатор региона, иначе вы можете столкнуться с каким-то другим регионом (может быть создан какой-то библиотекой, которую вы можете использовать позже). Что-то вроде: if([monitored.identifier isEqualToString:kGeofenceIdentifier]) { [locationManager stopMonitoringForRegion:monitored]; } - person Yogesh Maheshwari; 14.02.2015
comment
где я должен вызвать stopMonitoring? если тот же регион придет снова, он будет контролировать или нет - person iSrinivasan27; 29.11.2018

Хорошо, я думаю, что наконец-то смогу ответить на свой вопрос здесь. Означает ли это, что я могу потребовать свою награду? :D

Во-первых, затянувшаяся стрелка местоположения кажется ошибкой iOS. Я нашел несколько историй с одной и той же проблемой. Так что пока я мало что могу с этим поделать.

Что касается удаления всех моих регионов сразу, я понял это сейчас.

NSArray *regionArray = [[locationManager monitoredRegions] allObjects]; // the all objects is the key
for (int i = 0; i < [regionArray count]; i++) { // loop through array of regions turning them off
     [locationManager stopMonitoringForRegion:[regionArray objectAtIndex:i]];
}

Я смог отобразить свой массив и доказал, что они все там. Еще одна проверка после удаления показывает, что все они исчезли. Вау!! Проблема со стрелкой местоположения остается в зависимости от того, какую версию iOS вы используете. Я не могу, я думаю. Если у вас есть пользователи, обязательно сообщите им, что фиолетовая стрелка — это не ваша вина. Для получения дополнительной информации по этому вопросу вы можете начать здесь. GetSatisfaction Удачи.

person Bill Burgess    schedule 25.08.2011
comment
«allObjects» на самом деле не «ключ», а «значение»: P Это была ваша проблема. monitorRegion возвращает объект NSSet, а не NSArray :-) - person jules; 26.08.2011
comment
Я этого не знал. Он никогда нигде не упоминался, даже в документации Apple. И я не имел в виду ключ как в ключе, я имел в виду ключ к тому, чтобы я его починил. - person Bill Burgess; 26.08.2011
comment
просто взгляните на файл *.h в таких случаях. нажмите CMD и щелкните имя класса или метод, и XCode перенесет вас в соответствующий класс. Таким образом, вы можете выяснить, что же такое на самом деле контролируемое свойствоRegions. - person jules; 26.08.2011
comment
О том, что фиолетовая стрелка остается видимой - я пробовал отключать регионы в iOS 5.1, и через некоторое время она исчезла. Похоже, что Apple могла исправить ошибку. - person Brandon O'Rourke; 29.03.2012
comment
Да, я верю, что они есть. Стрелка изменилась с 5.1, теперь она является контуром для мониторинга региона и сплошной для любого использования местоположения. В нижней части настроек местоположения в приложении «Настройки» есть легенда. - person Bill Burgess; 30.03.2012
comment
Если monitorRegions возвращает NSSet, а не NSArray (что он и делает), то как [regionArray objectAtIndex:i] работает в решении? Это должно быть преобразовано в массив, но я просто дважды проверяю. - person ari gold; 01.09.2012
comment
[locationManager monitorRegions] возвращает NSSet. Это больше похоже на сырой NSArray. У него нет возможности получить доступ к объекту по определенному индексу. Вы можете зациклить их, если хотите. for (CLRegion *region in [locationManager monitorRegions]), но вы не можете получить к ним доступ по индексу. Если вы хотите, чтобы они были в массиве, вы добавляете allObjects, который возвращает их в массив, как показано в моем примере. Надеюсь это поможет. - person Bill Burgess; 02.09.2012

Да, это баг iOS. Удаление и переустановка приложения не помогает. Единственный способ избавиться от проблемы - сбросить предупреждения о местоположении.

person honcheng    schedule 26.08.2011
comment
Это все еще ошибка в iOS 6? - person Kent Nguyen; 25.11.2012