我已经在 StackOverflow 上查看了类似的问题,但它们都处理由于收到扫描响应数据而对 CBManager 委托的 didDiscover 方法进行第二次调用。我的情况有所不同。
我坐在家里的办公桌前。我的应用程序在 iPhone 6、iOS 10.2 上运行。我的应用程序开始扫描而不指定任何服务 uuid(即发现所有外围设备)。我的应用程序未连接到任何发现的外围设备。正在发现五种不同的外围设备,其中包括我开发的 MacBook Pro,它通过 USB/Lightning 电缆连接到 iPhone。
我的应用程序在 MacBook Pro 上表现奇怪。 MacBook Pro 一次又一次地调用 didDiscover 方法。最后它停了下来;直到我移动 MacBook Pro 的光标或点击键盘上的某个键;然后又开始了。其他四台外围设备(其中两台 Apple TV)不会出现这种情况。
这是我的 didDiscover 方法:
@objc func centralManager(_ manager: CBCentralManager, didDiscover cbPeripheral: CBPeripheral, advertisementData data: [String : Any], rssi signalStrength: NSNumber) {
NSLog("Peripheral discovered: \(cbPeripheral)")
}
这是控制台的示例:
我不知道该如何思考这个问题。我无法想出任何可以尝试或检查的东西来揭示有关正在发生的事情的更多信息。任何想法将不胜感激。
更新1:
首先一些附加信息:
- 我为 scanForPeripherals 方法的选项参数传递 nil
- 如果我连接到 MacBook Pro,则调用 didDiscover 的频率会从大约每秒减少到大约每分钟。
但是,正如 CuriousRabbit 指出的那样,那又怎样呢?好吧,考虑到这种行为不是我疏忽的结果,我剩下的问题是:我该如何编码?目前,我最好的办法是:
- 第一次调用 didDiscover - 执行我所做的操作以响应发现外围设备。
- 第二次调用 - 可能有感兴趣的扫描响应数据;看here https://stackoverflow.com/questions/11557500/corebluetooth-central-manager-callback-diddiscoverperipheral-twice
- 后续呼叫 - 忽略
你们觉得这正确吗?
而且,如果这里学到的教训是期望每当外围设备发送广告数据包时都会调用 didDiscover(关于 CuriousRabbit 的“您的 MacBook 正在积极广告”评论),那么为什么我没有看到其他四个外围设备的这种行为?
对于 CBCentralManagerScanOptionAllowDuplicatesKey 的情况is not被指定时,苹果文档 https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/BestPracticesForInteractingWithARemotePeripheralDevice/BestPracticesForInteractingWithARemotePeripheralDevice.html(请参阅“仅在必要时指定 CBCentralManagerScanOptionAllowDuplicatesKey 选项”部分)指出,只要广告数据发生更改,就会重复调用 didDiscoverPeripheral 方法。
我观察到的是,如果信号强度 (rssi) 发生变化,也会发生重复呼叫。对于 MacBook Pro,rssi 值会波动(尽管有时有两个背靠背日志语句,其中它不会改变,但通常会改变)。广告数据永远不会改变。还;在极少数情况下,当对其他外围设备之一重复discoverDiscoverPeripheral 时,RSSI 值已发生变化。
我非常有信心 RSSI 的变化可以解释我所看到的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)