Интервал дальномерных маяков

В iOS в моем делегате приложения я запускаю мониторинг региона, и как только я вхожу в регион маяка, я запускаю логику ранжирования, используя locationManager:didRangeBeacons:inRegion. Согласно документации Apple, этот метод следует вызывать только тогда, когда регион входит в диапазон или выходит за его пределы, или когда диапазон изменяется.

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


person Mihai Popa    schedule 21.01.2014    source источник


Ответы (2)


Согласно документам:

«Менеджер местоположения вызывает этот метод всякий раз, когда маяк входит в зону действия или выходит за ее пределы. Менеджер местоположения также вызывает этот метод при изменении диапазона маяка, например, когда маяк приближается».

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

Почему это проблема

РЕДАКТИРОВАТЬ:

В фоновом режиме вы получите уведомление о входе в регионы с помощью метода делегата приложения:

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{}

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

if(state == CLRegionStateInside)
{
    //Inside a region:
}
else if(state == CLRegionStateOutside)
{
    //Outside a region
}
else {
    //Something else
}

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

person CW0007007    schedule 21.01.2014
comment
Я хочу обрабатывать диапазон в фоновом режиме. Когда пользователь входит в диапазон маяка, я хочу получить подробную информацию о маяке (ах) - и это происходит в этом методе. Меня не интересует информация о близости, поэтому я не хочу, чтобы этот метод вызывался так часто. Я также читал, что ранжирование требует больше энергии, чем мониторинг региона, и это может разрядить батарею пользователя. - person Mihai Popa; 21.01.2014

locationManager:didRangeBeacons:inRegion вызывается один раз в секунду, несмотря ни на что. При каждом вызове параметр beacons будет содержать массив всех маяков, которые приложение может видеть в данный момент, упорядоченных по близости. Невозможно ограничить частоту вызова этого метода, за исключением остановки диапазона.

При мониторинге регионов (вместо ранжирования) ваше приложение будет вызывать didEnterRegion: и didExitRegion, а также didDetermineState:. Подробнее см. этот ответ.

person James Frost    schedule 21.01.2014
comment
Есть ли способ получить информацию о маяках, используя только информацию о регионах (в основном, чтобы получить информацию о маяках в фоновом режиме)? - person Mihai Popa; 21.01.2014
comment
Кажется, что вы можете вызвать startRangingBeaconsInRegion:, когда был вызван didEnterRegion:, но приложение будет активным только в течение очень короткого промежутка времени. На самом деле не рекомендуется пытаться делать это в фоновом режиме. - person James Frost; 21.01.2014