对于 iOS 对想要扫描 BLE 信标\外设的应用程序施加的限制,存在很多困惑。
在阅读了几个博客和 Stack Overflow 答案后,我想看看我是否正确理解了所有问题。如果有什么理解错误或者遗漏的地方请指正。我仅指 iOS 7 及更高版本,重点关注检测而不是连接(Can you connect to a CLBeacon using the iBeacon Monitoring & Ranging API?)。
信标的选项很明确 - 使用通用 BLE 外设或使用在iBeacon 格式 https://stackoverflow.com/questions/18906988/what-is-the-ibeacon-bluetooth-profile(此外,非标准外设可以在 adv 数据包中以 iBeacon 格式进行广告,并在扫描响应数据包中以不同的格式进行广告)。
一般限制
- iBeacon 测距会让您知道您周围有哪些信标。您必须指定信标预先通告的 ProximityUUID(无“常规”扫描)。
didRangeBeacons
每秒都会使用最近发现的 CLBeacon 对象数组进行调用。距信标的距离及其精度是由 iOS 使用一些只有 Apple 开发人员真正知道的机密算法来计算的(该算法基于信标宣传的 rssi 值和 rssi-at-1-meter 校准字节)。您还可以使用 iBeacon 监控在每次进入或退出某个区域时调用代表 - 同样,您必须指定您要查找的 ProximityUUID(您也可以指定主要和次要)。 “退出区域”是指一段时间内未收到任何广告的时间,因此不能立即退出。可同时测距/监控的区域数量每台设备限制为 20 - 这意味着如果其他应用程序同时进行监视\测距,您的应用程序可能无法监视\测距(对吗?)。
- CoreBluetooth - 您还可以检测信标广告中的其他广告结构。如果信标也以 iBeacon 格式进行广告,您将无法看到 iBeacon 字段(ProximityUUID、主要、次要...),尽管它们是在您在其他情况下可以看到的标准“制造商特定”广告结构下发送的。
在前台运行- 限制较少的用例:
- iBeacon 测距和监控 - 没有进一步的限制。
- CoreBluetooth - 传递
nil
in the serviceUUIDs
of scanForPeripheralsWithServices
将扫描所有外围设备。通过CBCentralManagerScanOptionAllowDuplicatesKey
as YES
在选项中将使didDiscoverPeripheral
对于同一个外围设备\信标被多次调用(我假设使用计时器检测到一段时间内未收到广告并假设用户退出了“区域”)。
在后台运行- 更受限制的用例:
- iBeacon 测距不能直接工作。 iBeacon监控会调用
didEnterRegion
并为应用程序提供 6 秒的运行时间 - 在此期间您可以开始测距(例如,检测主要和次要)。由于 iOS 会打开和关闭扫描以节省电池电量,因此检测可能不会立即进行。如果您输入具有相同 ProximityUUID 的多个信标的区域,并且您在没有特定主要和/或次要的情况下监视此 UUID,didEnterRegion
当您开始接收来自第一个信标的信号时将被调用 - 但是,如果您没有退出第一个信标的区域并且您还进入了第二个信标的区域,则应用程序将不会再次被唤醒(didEnterRegion
不会再次被调用),因此您无法开始测距以检测第二个信标的主要和次要。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。
- CoreBluetooth - 根据核心蓝牙后台处理 https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html
scanForPeripheralsWithServices
可以在后台运行使用,但必须至少指定一个serviceUUID。didDiscoverPeripheral
将给出 10 秒的运行时间。使用CBCentralManagerScanOptionAllowDuplicatesKey
不管用 -didDiscoverPeripheral
每个外设都会被调用一次。因此,您无法检测到该区域的“退出”和“重新进入”。我想您可以使用非标准 BLE 外设来更改其 MAC 地址来解决此问题。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。由于 iOS 会打开和关闭扫描以节省电池电量,因此检测可能不会立即进行。
应用程序被杀死后运行
- iBeacon 监控 - 有效!即使用户终止了应用程序或设备重新启动。
- CoreBluetooth - 如果应用程序被 iOS 终止(由于不活动或内存限制),应用程序将被唤醒。但是,如果用户明确终止该应用程序,它将不会被唤醒(这使得第一种情况难以测试)。我不知道设备重启后会发生什么...
有人对这些限制有更多经验吗?能scanForPeripheralsWithServices
在某些用例中可以用作 iBeacon 监控的更好替代方案吗?
Thanks!
你的描述基本上是正确的。只需要澄清两点:
20 个区域限制为not每个设备,它是特定于应用程序的。无论其他应用程序在移动设备上做什么,iOS 仍然允许您的应用程序监控最多 20 个区域。也就是说,可能存在特定于设备的硬件限制,即在硬件协助下可以在后台监控多少个区域。这些限制没有记录。如果超过这些未记录的限制,可能需要更长的时间才能在后台检测到信标。 (尽管如此,操作系统无法保证检测何时到来。)
您无法连接到CLBeacon
使用监控和测距 API。这些 API 仅适用于无连接的 BLE 广告数据包。
是的,可以使用scanForPeripheralsWithServices
作为备选。这就是万向节信标为了实施专有系统所做的事情。然而,在背景检测时间和可靠性方面存在真正的缺点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)