在后台监控iBeacon信标

7
我一直在开发iOS应用程序并尝试使用苹果的CoreLocation和iBeacon技术。目前我已经使用了三个具有不同UUID的信标。一切都很好,直到我决定在我的应用程序中添加更多的信标。只有在这时我遇到了奇怪的问题。据说,一个应用程序可以同时监视最多20个信标区域,即使在后台运行 - 但是在我的情况下,这个数字似乎是3。我尝试了不同的方法,但没有任何效果。当我重新排列信标数组时,结果就像我预期的那样 - 只有前3个信标区域会在应用程序在后台运行时触发didEnterRegion和didExitRegion事件。但是,当应用程序在前台运行时,情况并非如此。
请注意:
  1. I have an array of custom beacon objects (consumed from API)
  2. For each custom beacon object I create an instance of CLBeaconRegion like so:

    let beaconRegion = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: region.uuid)!, identifier: region.uuid)
    
    beaconRegion.notifyOnEntry = true
    beaconRegion.notifyOnExit = true
    beaconRegion.notifyEntryStateOnDisplay = true
    
  3. Then I pass that instance to CLLocationManager's startMonitoringForRegion method like so:

    locationManager.startMonitoringForRegion(beaconRegion)

当循环遍历CLLocationManager的monitoredRegions方法响应时,我得到了所有我期望的信标区域,并且它们的regionState为2(外部)。

  1. 除此之外,我已经添加了:

    NSLocationAlwaysUsageDescription

到应用程序的Info.plist中。

locationManager.requestAlwaysAuthorization()

对于ViewController的viewDidLoad方法来说

然而,只有当我在范围内时,才会触发didEnterRegion和didExitRegion这两个方法,而我开始监测的前三个信标区域中的任何一个都可以。

谢谢,

Piotr Czarnoleski

3个回答

8
一个iOS设备有限的硬件加速插槽用于信标检测。这些插槽委托给蓝牙芯片,以便在匹配信标区域模式时通知操作系统。当这些插槽被使用时,后台检测非常快速--信标传输进入范围后,区域进入事件可以在一两秒内发生。
然而,如果这些插槽用尽,则操作系统必须回退到全面扫描来查找剩余的区域。为了节省电池电量,操作系统对其进行限制。据证明,它们大约每15分钟发生一次。这意味着如果您的应用程序监视的任何区域没有获得硬件加速插槽,则在匹配信标进入范围后,可能需要长达15分钟才能被检测到(尽管平均而言,通常需要更少的时间--平均需要7.5分钟)。
有多少硬件插槽可用?这是未记录的,并且可能因iOS设备型号而异。但实验表明,它可能约为30个。这适用于手机上的所有应用程序,并且与每个应用程序的20个区域限制完全无关。注册区域的第一个应用程序将获得插槽。
在您的手机上,可能只剩下3个硬件加速插槽可用于您的应用程序。这可能是您正在经历的情况。为了测试这个理论,您可以:
1.卸载其他您预计可能注册信标区域的应用程序,这将释放更多插槽。
2.等待长达15分钟,以查看是否在后台检测到其他区域。
阅读更多信息:https://developer.radiusnetworks.com/2015/04/21/max-beacon-regions-ios.html

1
David,硬件加速的信标区域插槽信息非常有趣。你能分享一下这些信息的来源吗?我很想能够阅读更多相关内容。 - Duncan C
@davidyoung 谢谢!我尝试了两个测试用例 - 首先,我将我的应用程序置于后台约15分钟,然后didEnterRegion被触发。这绝对是硬件加速插槽问题,因为我再次重复整个过程,同样的事情发生了。然而,释放更多插槽对我没有用 - 我卸载了所有与信标相关的应用程序并重新启动了我的iPhone,但我仍然只有3个可用的硬件加速插槽。我怀疑这可能是iPhone 4s所能达到的。有什么解决方法吗? - Piotr Czarnołęski
1
有趣。是的,iPhone 4s 可能只有3个插槽(您可以尝试重新启动、恢复出厂设置等来确认)。如果是真的,那么这是一种硬件限制,唯一的解决方法就是将您的区域使用减少到3个。 - davidgyoung
@Duncan-C 请参考我回答中的链接,以了解导致这一理论的实验。 - davidgyoung

0

Core Location 允许每个应用程序监视总共 20 个 CLRegion。无论是信标区域还是地理围栏区域都会计入这 20 个区域的限制。

为了在后台监视信标,您需要将 NSLocationAlwaysUsageDescription 键添加到 info.plist 中,并在启动时调用位置管理器的 requestAlwaysAuthorization 方法,如果您没有 kCLAuthorizationStatusAuthorizedAlways 的授权状态。

除此之外,为了帮助您,我们需要更多关于您的应用程序、相关代码和调试信息的详细信息。

请注意,您可以使用位置管理器的 monitoredRegions 属性获取您的应用程序当前正在监视的区域列表。我建议检查一下,以及 authorizationStatus,看看发生了什么。


感谢您的快速回复。我已经更新了我的原始帖子。 - Piotr Czarnołęski

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接