监控ibeacon时替代didexitregion

时间:2016-04-27 14:26:53

标签: ios swift cllocationmanager ibeacon

我有一个swift程序,可以检测信标何时在范围内且超出范围,即使应用程序处于后台。
我遇到的问题是,didExitRegion需要大约30秒才能被触发。我知道这30秒是一个不可调整的值,但对于我的应用程序,30秒是一个很长的路要走离灯塔获取通知。我有什么其他选择来解决这个问题?
是否有可能在应用程序处于后台时监控主要值,如果误报为10秒,如果仍然没有看到主要值,那么我知道我超出了范围? 如果回答是肯定的,那么任何样本都会显示为如何监控主要值?

1 个答案:

答案 0 :(得分: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
  }
}