为什么CoreBluetooth再次发现同一个外设?

我已经回顾了StackOverflow上的类似问题,但是由于接收到扫描响应数据,他们都处理第二次调用CBManager委托的didDiscover方法。 我的情况是不同的。

我坐在家中的桌子上。 我的应用程序运行在iPhone 6,iOS 10.2上。 我的应用程序开始扫描,没有指定任何服务uuid​​s(即发现所有外设)。 我的应用程序不连接到任何发现的外围设备。 五种不同的外围设备正在被发现,其中我的开发MacBook Pro通过USB / Lightening电缆连接到iPhone。

我的应用程序在MacBook Pro方面的performance很奇怪。 didDiscover方法被一次又一次地调用MacBook Pro,第二次。 最后停下来; 直到我移动MacBook Pro的光标或点击键盘上的一个键; 然后重新开始。 其他四款外设都没有出现,其中两款是苹果电视。

这是我的didDiscover方法:

@objc func centralManager(_ manager: CBCentralManager, didDiscover cbPeripheral: CBPeripheral, advertisementData data: [String : Any], rssi signalStrength: NSNumber) { NSLog("Peripheral discovered: \(cbPeripheral)") } 

这里是一个来自控制台的示例:

在这里输入图像说明

我不知道该怎么想。 我不能拿出任何我可能会尝试或检查的东西,以揭示更多关于正在发生的事情的信息。 任何想法将不胜感激。

更新1:

首先一些额外的信息:

  1. 我传递零的scanForPeripherals方法的选项参数
  2. 如果我连接到MacBook Pro,那么对didDiscover的调用频率从大约每一秒钟减less到大约每分钟。

但是,正如CuriousRabbit所指出的那样呢? 那么,鉴于这种行为不是我的一些监督的结果,我留下的是:我如何编码? 目前,我的最佳投篮是:

  1. 首先打电话给didDiscover – 做我所做的,以响应被发现的外设。
  2. 第二次调用 – 可能存在感兴趣的扫描响应数据; 看到这里
  3. 随后的电话 – 忽略

这对你们来说似乎是正确的吗?

而且,如果从这里学到的教训是希望在外围设备发送广告数据包时调用didDiscover(re CuriousRabbit的“你的MacBook广告积极广告”评论),那么为什么我没有看到其他四个外设的这种行为?

对于指定CBCentralManagerScanOptionAllowDuplicatesKey的情况, Apple文档 (请参阅“仅在必要时指定CBCentralManagerScanOptionAllowDuplicatesKey选项”部分)指出,只要广告数据发生更改,就会发生重复调用didDiscoverPeripheral方法。

我正在观察的是,如果信号强度(rssi)改变,重复调用也会发生。 对于MacBook Pro来说,rssi值是反弹的(尽pipe有时候会有两个背靠背的日志语句,其中它不会改变,但总的来说它正在改变)。 广告数据永远不会改变。 也; 在less数情况下,当disDiscoverPeripheral重复其他外设之一时,rssi值已经改变。

我有很高的信心,rssi的变化解释了我所看到的行为。