iOS对于想要扫描BLE信标\外设的应用程序所施加的限制存在很多混淆。 在阅读了几篇博客和Stack Overflow答案之后,我想看看我是否正确理解了所有问题。如果有什么我误解或错过了,请纠正我。我只提到iOS 7及更高版本,专注于检测而不是连接(你能使用iBeacon Monitoring& Ranging API连接到CLBeacon吗?)。
信标的选项很明确 - 使用通用BLE外设或使用在iBeacon format中通告的BLE外设(另外,非标准外设可以在adv-packet中以iBeacon格式进行通告和扫描响应数据包中的不同格式。)
一般限制
didRangeBeacons
。距离信标的距离及其准确性是由iOS使用一些机密算法计算的,只有Apple的开发人员才知道(该算法基于rssi值和rssi-at-1-meter校准字节表示信标通告)。每次进入或退出某个区域时,您也可以使用iBeacon Monitoring来呼叫代理人 - 再次,您必须指定您要查找的ProximityUUID(您还可以指定一个主要和次要)。 "退出某个地区"由一段时间没有收到任何广告定义,因此不能立即。可以同时监控每台设备的区域数量限制为20 - 这意味着如果其他应用同时监控\范围,您的应用可能无法监控\范围(对吗?)。在前台运行 - 限制较少的用例:
nil
serviceUUIDs
中传递scanForPeripheralsWithServices
将扫描所有外围设备。一些CBCentralManagerScanOptionAllowDuplicatesKey
作为YES
在选项中传递将使didDiscoverPeripheral
被多次调用同一个外围设备\信标(我假设使用你检测到广告的计时器没有收到一些时间并假设用户退出"区域")。 在后台运行 - 更受限制的用例:
didEnterRegion
并给予应用程序运行时间6秒 - 您可以在其中开始测距(例如,检测主要和次要)。由于iOS打开和关闭扫描以保持电池电量,因此检测可能不会立即进行。如果您输入具有相同ProximityUUID的多个信标的区域,并且您在没有特定主要和/或次要的情况下监视此UUID,则当您开始从第一个信标接收信号时将调用didEnterRegion
- 但是,如果您没有退出第一个信标的区域,你也进入了第二个信标的区域,应用程序将不再被唤醒(didEnterRegion
将不再被调用)所以你无法开始测距以检测第二个信标&# 39; s major&次要。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。scanForPeripheralsWithServices
可以在后台运行,但必须指定至少一个serviceUUID。 didDiscoverPeripheral
将被赋予10秒的运行时间。使用CBCentralManagerScanOptionAllowDuplicatesKey
将无法使用 - didDiscoverPeripheral
将为每个外围设备调用一次。因此,您无法检测到"退出"来自该地区和"重新进入"。我想你可以使用一个非标准的BLE外设来改变它的MAC地址来克服这个问题。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。由于iOS打开和关闭扫描以保持电池电量,因此检测可能不会立即进行。 在应用被杀后运行
有没有人对这些限制有更多经验?在某些用例中,scanForPeripheralsWithServices
可以用作iBeacon Monitoring的更好替代方案吗?
谢谢!
答案 0 :(得分:4)
你的描述大多正确。只有两点澄清:
每个设备的20个区域限制不,它是特定于应用的。无论其他应用在移动设备上做什么,您的应用仍然可以通过iOS监控多达20个地区。也就是说,可能的硬件限制是特定于设备的,可以通过硬件辅助在后台监控多少个区域。这些限制没有记录。如果超过这些未记录的限制,则在后台检测到信标可能需要更长的时间。 (尽管如此,无论如何,检测何时都没有OS保证。)
您无法使用监控和范围API连接到CLBeacon
。这些API仅适用于无连接的BLE广告包。
是的,可以使用scanForPeripheralsWithServices
作为替代方案。这就是Gimbal信标为实现专有系统所做的事情。然而,在背景检测时间和可靠性方面存在实际缺点。