2016-04-27 6 views
0

У меня есть программа в swift, которая обнаруживает, что маяк находится в диапазоне и выходит за пределы диапазона, даже несмотря на то, что приложение находится в фоновом режиме.
Проблема, которую у меня есть, занимает около 30 секунд для didExitRegion для запуска. Я знаю, что это 30 секунд - это не регулируемое значение, но для моего приложения 30 секунд - это длинный путь, чтобы уйти от маяка, чтобы получить уведомление. Какую еще альтернативу я должен решить эту проблему?
Возможно ли отслеживать значительное значение, когда приложение находится в фоновом режиме, и дать ему как 10 секунд для ложного позитива, и если все еще не видно основного значения, то я знаю, что я вне диапазона? Если да, любой образец, чтобы показать, как контролировать основное значение?Альтернатива didexitregion при мониторинге ibeacon

ответ

1

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

Однако существует большое ограничение делать это:

В фоновом режиме на IOS, вы можете колебаться только для маяков в течение ограниченного периода времени после события ввода области, или после того, как приложение получает толкнули к задний план. По умолчанию это всего лишь 5 секунд, но может быть extended up to 3 minutes programatically. Через три минуты вы не получите больше обратных вызовов, поэтому, если к тому времени вы не обнаружите 10-секундный выход, вам придется полагаться на обычное событие didExitRegion.

Если вы используете эту технику, вам нужно понять, что iOS все еще сообщает о присутствии маяка на некоторое время после того, как он не был обнаружен, с близостью UNKNOWN.

Вот пример того, как сделать это в пределах обратного вызова:

var lastBeaconDetectionTime = 0.0 
var exitFired = false 

func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) { 
    for beacon in beacons { 
    if beacon.proximity != CLProximity.Unknown { 
     lastBeaconDetectionTime = NSDate().timeIntervalSince1970 
     exitFired = false 
    } 
    } 
    if NSDate().timeIntervalSince1970 - lastBeaconDetectionTime > 10.0 && !exitFired { 
    exitFired = true 
    // TODO: Add logic for region exit firing after 10 seconds 
    } 
} 
+0

Спасибо, что звучит как хорошее решение – borna

Смежные вопросы