通过iBeacon检测信标监测与测距与CoreBluetooth scanForPeripheralsWithServices

关于iOS应用程序对要扫描BLE信标\外围设备的限制,存在很多混淆。 阅读了几个博客和堆栈溢出的答案后,我想看看我是否正确理解所有问题。 如果有任何我误解或错过,请纠正我。 我只提到iOS 7及以上版本,重点关注检测而不是连接(您可以使用iBeacon Monitoring&Ranging API连接到CLBeacon?)。

信标的选项是明确的 – 使用通用BLE外围设备或使用以iBeacon格式通告的BLE外设(另外,非标准外设可以在adv-packet中以iBeacon格式进行通告,而在扫描 – 响应数据包)。

一般限制

  • iBeacon测距将让你知道你周围的信标。 您必须事先指定信标广告的ProximityUUID(无“普通”扫描)。 didRangeBeacons将每秒钟被最近被发现的一个CLBeacon对象调用。 距离信标的距离及其准确性由iOS使用一些只有苹果开发人员真正知道的机密algorithm来计算(该algorithm基于rssi值和信标广告的rssi-at-1米校准字节)。 您也可以使用iBeacon Monitoring在每次进入或退出区域时调用代理 – 同样,您必须指定您正在查找的ProximityUUID(您也可以指定主要和次要)。 “退出一个地区”的定义是一段时间没有收到任何广告,因此不能立即。 每台设备可同时进行远程监控的区域数量限制为20个。这意味着如果其他应用程序同时进行监控\测距,您的应用程序可能无法监控\范围(右侧)。
  • CoreBluetooth – 您还可以检测信标广告中的其他广告结构。 如果信标也以iBeacon格式进行广告宣传,则尽pipe事实上它们是在标准的“制造商特定”广告结构下发送的,但在其他情况下您不能看到iBeacon字段(ProximityUUID,major,minor …) 。

在前台运行 – 限制较less的用例:

  • iBeacon测距和监测 – 没有进一步的限制。
  • CoreBluetooth – 在服务中传递nilscanForPeripheralsWithServices将扫描所有的外围设备。 在选项中将CBCentralManagerScanOptionAllowDuplicatesKeyYES将会使didDiscoverPeripheral对于同一个外设\ beacon被多次调用(我假定使用定时器检测到广告没有被接收一段时间,并且假定用户退出了“region”) 。

在后台运行 – 更受限制的用例:

  • iBeacon测距不会直接工作。 iBeacon监测将调用didEnterRegion并给予6秒的应用程序运行时间 – 您可以在其中启动测距(例如,检测主要和次要)。 由于iOS打开和closures扫描以保持电池电量,检测可能不会立即进行。 如果您使用相同的ProximityUUIDinput多个信标的区域,并且在没有特定专业和/或未成年人的情况下监控此UUID,则当您从第一个信标开始接收信号时,将会调用didEnterRegion – 但是,如果您没有退出第一个灯塔的地区,你也进入了第二个灯塔的地区,应用程序不会再被唤醒( didEnterRegion不会被再次调用),所以你不能开始测距,以检测第二个灯塔的主要和次要。 该应用程序不能简单地popup到前台,但可以创build本地通知和其他后台操作。
  • CoreBluetooth – 根据核心蓝牙后台处理 scanForPeripheralsWithServices可以使用在后台运行,但是你必须指定至less一个serviceUUID。 didDiscoverPeripheral将被给予10秒的运行时间。 使用CBCentralManagerScanOptionAllowDuplicatesKey将无法正常工作 – didDiscoverPeripheral将为每个外设调用一次。 因此,您不能检测到该地区的“退出”和“重新进入”。 我想你可以使用一个非标准的BLE外设来改变它的MAC地址来解决这个问题。 该应用程序不能简单地popup到前台,但可以创build本地通知和其他后台操作。 由于iOS打开和closures扫描以保持电池电量,检测可能不会立即进行。

在应用程序被杀后运行

  • iBeacon监测 – 工作! 即使用户杀了应用程序或设备重新启动。
  • CoreBluetooth – 该应用程序将被唤醒,如果它被iOS杀死(由于不活动或内存限制)。 但是,如果用户明确地杀死了应用程序,则不会被唤醒(这使得第一种情况很难testing)。 我不知道设备重新启动后会发生什么…

有没有人有这些限制更多的经验? 在某些使用情况下, scanForPeripheralsWithServices可以用作更好的替代iBeacon Monitoring的替代品吗?

谢谢!

你的描述大部分是正确的。 只是两个澄清:

  • 20个区域限制不是每个设备,它是应用程序特定的。 无论移动设备上有哪些其他应用,您的应用仍然可以通过iOS监控最多20个区域。 也就是说,可能有硬件限制是特定于设备的,可以在硬件辅助的背景下监视多less个区域。 这些限制是无证的。 如果超过这些无证的限制,可能需要很长的时间才能在后台检测到信标。 (尽pipe如此,无论如何,没有操作系统保证何时检测到。

  • 您无法使用监测和测距API连接到CLBeacon 。 这些API仅适用于无连接的BLE广告数据包。

是的,可以使用scanForPeripheralsWithServices作为替代scheme。 这是云台信标为了实现专有系统所做的。 然而,在背景检测时间和可靠性方面存在真正的缺点。