ios - 监控 ibeacon 时替代 didexitregion

标签 ios swift cllocationmanager ibeacon

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

最佳答案

另一种方法是进行信标测距,并在您在较短的时间段(例如 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
  }
}

关于ios - 监控 ibeacon 时替代 didexitregion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36892777/

相关文章:

javascript - Phonegap iOS 音量控制

swift - 如果不为零则模式匹配

ios - CLLocationManager 响应能力

swift - 无法构造“CLLocationManagerDelegate”,因为它没有可访问的初始值设定项

iphone - 将语音添加到自定义 UIMenuController

ios - 如何在 IOS 中启动新屏幕?

iphone - 如何在 iOS 中渲染拉伸(stretch)文本?

objective-c - 如何在 Swift 中引用类?

javascript - 修改WKWebView中不存在的DOM元素

objective-c - iOS7 核心位置不更新