我一直在开发iOS应用程序并使用Apple的CoreLocation
和iBeacon
技术。到目前为止,我使用了三个具有不同UUID的信标。一切都很好,直到我决定在我的应用程序中添加更多信标。只有那时我遇到了奇怪的问题。有人说,一个应用程序可以在后台监视多达20个信标区域 - 但在我的特定情况下,这个数字似乎是3.我尝试了不同的方法,没有任何效果。当我在阵列中改变信标时,结果如我所料 - 当app在后台时,只有前3个信标区域触发了didEnterRegion
和didExitRegion
个事件。这在前景时没有应用。
请考虑一下:
对于每个自定义信标对象,我创建一个CLBeaconRegion
实例,如下所示:
let beaconRegion = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: region.uuid)!, identifier: region.uuid)
beaconRegion.notifyOnEntry = true
beaconRegion.notifyOnExit = true
beaconRegion.notifyEntryStateOnDisplay = true
然后我将该实例传递给CLLocationManager的startMonitoringForRegion
方法,如下所示:
locationManager.startMonitoringForRegion(beaconRegion)
当循环通过CLLocationManager的monitoredRegions
方法响应时,我得到了我期望用regionState 2(外部)的所有信标区域
最重要的是我已添加:
NSLocationAlwaysUsageDescription
到app的Info.plist
locationManager.requestAlwaysAuthorization()
到ViewController的viewDidLoad方法
仍然,didEnterRegion
和didExitRegion
仅在我处于我开始监控的前三个信标区域中的任何一个的范围内时触发。
谢谢,
Piotr Czarnoleski
答案 0 :(得分:7)
用于信标检测的iOS设备具有有限数量的硬件加速插槽。这些插槽遵循蓝牙芯片,以在信标区域模式匹配时通知操作系统。使用这些插槽时,背景检测非常快 - 区域输入事件可能发生在范围内的信标传输的第二或第二个内。
但是,如果这些插槽耗尽,则操作系统必须回退到完全扫描以找到其余区域。操作系统限制这些节省电池。证据表明它们大约每15分钟发生一次。这意味着,如果您的应用程序监控的任何未获得硬件加速插槽的区域在匹配的信标进入范围后最多可能需要15分钟才会被检测到(尽管平均而言通常会花费更少的时间 - 7.5分钟会是平均值)
有多少硬件插槽?这是未记录的,可能因iOS设备型号而异。但是实验表明它可能大约为30.这是在手机上的所有应用程序中,与每个应用程序的20个区域限制完全无关。注册区域的第一批应用程序是第一批获得插槽的应用程序。
在此处阅读更多内容:https://developer.radiusnetworks.com/2015/04/21/max-beacon-regions-ios.html
您可能正在遇到以上情况,并且手机上只有3个硬件加速插槽可用于您的应用。要测试这个理论,你可以:
答案 1 :(得分:0)
核心位置可让您监控每个应用的总共20 CLRegion
秒。信标区域和地理围栏区域都计入该区域的20个限制。
要在后台监控信标,您需要将NSLocationAlwaysUsageDescription
密钥添加到info.plist,并在启动时调用位置管理器的requestAlwaysAuthorization
方法尚未拥有kCLAuthorizationStatusAuthorizedAlways
的授权状态。
除此之外,您还必须发布有关应用详情,相关代码和调试信息的更多信息,以便我们为您提供帮助。
请注意,您可以使用位置管理器的monitoredRegions
属性来获取您的应用当前正在监控的区域列表。我建议检查一下,以及authorizationStatus
,看看发生了什么。
答案 2 :(得分:0)
此链接在swift 2.3中同时包含ibeacon发送方和接收方应用。希望这能让你清楚地了解ibeacons。
https://www.dropbox.com/s/g0ixmynkjet0uwj/ibeacons_final%202.zip?dl=0