监控 ibeacon 时替代 didexitregion

Alternative to didexitregion when monitoring ibeacon

我在 swift 中有一个程序可以检测信标何时在范围内和超出范围,即使应用程序在后台也是如此。
我遇到的问题是触发 didExitRegion 需要大约 30 秒。我知道这 30 秒是一个不可调整的值,但对于我的应用程序来说,30 秒是远离信标以获取通知的很长一段路要走。我还有什么其他选择可以解决这个问题?
是否可以在应用程序处于后台时监视主要值,并给它 10 秒的误报,如果仍然没有看到主要值,那么我知道我超出了范围? 如果答案是肯定的,是否有任何示例显示如何监控主要值?

另一种方法是进行信标测距,并在您在较短的时间段(比如 10 秒)内未在该区域看到任何信标时创建您自己的退出事件。

但是,这样做有很大的局限性:

在 iOS 的后台,您只能在区域进入事件后或应用程序被推送到后台后的有限时间段内搜索信标。默认情况下,这只有 5 秒,但可以是 extended up to 3 minutes programatically。在那三分钟之后,您将不会再收到任何范围回调,因此如果到那时您还没有检测到 10 秒退出,那么您将不得不依赖常规 didExitRegion 事件。

如果您使用此技术,您需要意识到 iOS 在未检测到信标后仍会报告其存在一段时间,接近度为未知。

以下是如何在测距回调中执行此操作的示例:

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
  }
}