2015-01-31 63 views
16

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

的信标中的选项是明确 - 使用通用BLE周或使用BLE周,在iBeacon format(通告此外,非标准外设可以在iBeacon显示格式通告在ADV-包和不同的格式在扫描 - 响应数据包中)。

一般限制

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

运行在前台 - 的限制较少的用例:

  • iBeacon显示测距和监控 - 没有进一步的限制。
  • CoreBluetooth - 通过nilserviceUUIDsscanForPeripheralsWithServices将扫描所有外围设备。在选项中传递CBCentralManagerScanOptionAllowDuplicatesKey作为YES将使didDiscoverPeripheral对同一个外设\信标被多次调用(我假设在一段时间内没有收到使用定时器检测到广告并假定用户退出“区域”) 。

在后台运行 - 在更严格的用例:

  • iBeacon显示测距不会直接工作。 iBeacon Monitoring将呼叫didEnterRegion并给予6秒的应用程序运行时间 - 您可以在其中启动测距(例如,检测主要的&未成年人)。由于iOS会开启和关闭扫描以保留电池电量,因此检测可能不会立即进行。如果您使用相同的ProximityUUID输入多个信标的区域,并且在没有特定专业和\或未成年人的情况下监控此UUID,当您开始接收来自第一个信标的信号时将会调用didEnterRegion - 但是,如果您未退出第一个灯塔的地区,你也进入第二个灯塔的地区,应用程序不会再被唤醒(didEnterRegion将不会再次被调用),所以你不能开始测量第二个灯塔的主要&未成年人。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。
  • CoreBluetooth - 根据Core Bluetooth Background ProcessingscanForPeripheralsWithServices可以在后台运行使用,但是您必须指定至少一个serviceUUID。 didDiscoverPeripheral将被给予10秒的运行时间。使用CBCentralManagerScanOptionAllowDuplicatesKey将不起作用 - 每个外设将调用didDiscoverPeripheral一次。因此,您无法检测到该区域的“退出”和“重新进入”。我想你可以使用改变其MAC地址的非标准BLE外设来解决这个问题。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。由于iOS会开启和关闭扫描以保留电池电量,因此检测可能不会立即进行。

应用程序运行后被杀

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

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

谢谢!

+0

感谢它非常有帮助的描述。 – 2015-11-20 05:10:36

回答

2

你大部分是正确的与您的描述。就在澄清:

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

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

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

+0

谢谢,我会看看万向节信标。您是否知道除了用户明确杀死应用程序或重新启动设备之外是否还有其他一些缺点?我试图建立一个即使用户长时间在后台离开应用程序也能检测到的灯塔。 – Oren 2015-01-31 22:15:36

+0

...并宣传比4字节主要+未成年人更多的信息。 – Oren 2015-01-31 22:21:27

+0

@davidyoung您可以详细说明使用scanForPeripheralsWithServices作为替代方案的缺点吗?他们是什么? (除了无法在后台启动应用程序) – fspirit 2015-02-18 14:22:05