Мониторинг более 20 регионов маяка BLE с помощью CLLocationmanager в iOS

В настоящее время я использую CLLocationmanager для мониторинга областей маяков BLE в iOS.

Я знаю, что могу ранжировать маяки, если мне нужно более 20 регионов, но, к сожалению, ранжирование не позволило мне зарегистрировать события входа (RegionDidEnter) и выхода (RegionDidExit), насколько мне известно.

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

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


person Divye Shah    schedule 12.04.2018    source источник
comment
В частности, почему для вашего варианта использования требуется более 20 регионов? Не могли бы вы объединить регионы так, чтобы их осталось всего 20?   -  person davidgyoung    schedule 12.04.2018
comment
@davidgyoung Скажем так, у одного магазина или заведения может быть более одного маяка, и каждый из этих магазинов / заведений должен быть уникальным. Например, пользователь входит в один магазин, приложение прямо сейчас находится в заблокированном состоянии, нам нужно отправить уведомление, например, добро пожаловать в магазин XYZ, и при выходе мы также запускаем действие (мы получаем имя магазина, отправив uuid на сервер и получив подробную информацию). Объединение регионов не позволило бы мне этого сделать. Мне было интересно, можем ли мы ранжировать маяки внутри кода мониторинга, когда происходит событие regionDidEnter, чтобы получить uuid в фоновом режиме   -  person Divye Shah    schedule 12.04.2018


Ответы (2)


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

Псевдокод:

let myUUID = x
startMonitoring(myUUID)

func onDidEnter {
    startRanging(myUUID)
}

func onDidRange(beacons) {
    if beacons.empty { return } // keep ranging until we find something

    let major = beacons.first.major
    if major == 1 { show("Welcome to X") }
    if major == 2 { show("Welcome to Y") }

    stopRanging(myUUID)
}

Чтобы гарантировать, что ваше приложение не перейдет в спящий режим до того, как ему удастся определить расстояние до маяка, вы также можете использовать фоновая задача, тогда (псевдо) код будет выглядеть примерно так:

func onDidEnter {
    self.task = beginBackgroundTask(expirationHadler: {
        // our background time is up, iOS requires us to finish our work
        stopRanging(myUUID)
        endBackgroundTask(self.task)
    })
    startRanging(myUUID)
}

func onDidRange(beacons) {
    if beacons.empty { return }

    let major = beacons.first.major
    if major == 1 { show("Welcome to X") }
    if major == 2 { show("Welcome to Y") }

    stopRanging(myUUID)
    endBackgroundTask(self.task)
}
person heypiotr    schedule 12.04.2018
comment
Да, я согласен, это правильный подход. Единственным ограничением для этого является то, что вы можете отслеживать не более 20 ProximityUUID. Таким образом, вы должны иметь регионы, определенные только для UUID, с нулевыми подстановочными знаками для основных и второстепенных. И если все магазины используют один из этих 20 UUID, все будет работать. - person davidgyoung; 13.04.2018
comment
Разве это не ограничивает вещи? Я не могу четко идентифицировать каждый магазин и отправлять уведомления, когда приложение закрывается, если я отслеживаю только 20 магазинов. Можно ли найти другое решение? @davidgyoung - person Divye Shah; 19.04.2018
comment
Лично я бы использовал только один UUID для всех маяков и идентифицировал магазины по основному номеру в обратном вызове ранжирования. Фактическое ограничение здесь состоит в том, что событие ввода будет запускаться только один раз для каждого магазина, поэтому вместо этого вы не сможете идентифицировать разные маяки / зоны внутри магазина. Но это также можно обойти: когда вы входите в магазин, переключите настройку мониторинга в режим магазина и отслеживайте до 19-20 отдельных маяков. - person heypiotr; 20.04.2018

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

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

Почему основное местоположение ограничено 20

Регионы - это общий системный ресурс, и общее количество регионов, доступных для всей системы, ограничено. По этой причине Core Location ограничивает до 20 количество регионов, которые могут одновременно контролироваться одним приложением. Чтобы обойти это ограничение,

person Shamsudheen TK    schedule 12.04.2018
comment
Это будет означать, что пользователю нужно каждый раз включать службы определения местоположения, верно? также Если он будет продолжать отправлять значительные изменения местоположения в течение дня, не будет ли он израсходовать много батареи или, в свою очередь, не разрушит вариант использования маяков, если мне все равно придется определять местоположение? - person Divye Shah; 12.04.2018
comment
В любом случае службы определения местоположения должны быть включены для обнаружения маяков. Значительные изменения местоположения предназначены для устранения изменений вышек сотовой связи, поэтому в отличие от GPS он очень экономичен. - person davidgyoung; 19.04.2018
comment
@DivyeShah: Прочтение этого документа даст вам точное представление об энергосбережении. Просто используйте тот, который лучше соответствует вашим потребностям. developer.apple.com/library/content/ документация / Производительность / - person Shamsudheen TK; 23.04.2018