ios - 如果设备关闭,尝试在 IOS 应用程序中检索以前配对的蓝牙设备将不会响应失败

标签 ios objective-c core-bluetooth bluetooth-lowenergy

抱歉,标题太长了,但是我们在使用 corebluetooth for ios 时遇到了一个非常有趣的问题。我们正在 CBCentralManager 中发出对 retrievePeripherals 的调用,并且能够找到之前配对的设备。

无论设备是打开还是关闭,都会发生这种情况。我在苹果的文档中找不到任何关于为什么它能够在关闭时找到设备并且它没有出现在设置 ->蓝牙 ->设备中的任何信息。我怀疑 Apple 正在缓存此信息,但找不到任何文档来证实这一点。此外,当设备关闭并且我们发出连接调用时,程序继续正常执行,但永远不会调用 didFailToConnect 的委托(delegate)。当设备打开时,它会立即连接。

有没有办法在尝试连接到设备时传递超时参数?如果没有,最好的解决方案是处理重新连接到应用程序以前使用过的设备(我们将上次连接的设备存储在应用程序中)。

最佳答案

关于 retrievePeripherals:connectPeripheral: 您需要了解的两点

1.) retrievePeripherals: 尝试检索与您提供的 uuid 关联的 CBPeripheral 对象。即使 ble 设备关闭(或在国家的另一边)retrievePeripherals: 仍将返回 CBPeripheral 的实例,您可以调用 connectPeripheral: 上。这样做是有意为之的,这样您就可以向不在附近的外围设备发出调用,并且当它回到范围内时仍会自动连接到它。它基本上在系统蓝牙内部创建了一个标记,以便在实际看到设备时,它会知道应该连接到它。

2.)connectPeripheral: 不会超时,除非与实际设备的通信 channel 中断。如果 iOS 设备没有看到该设备,它不会失败也不应该超时(除非系统蓝牙内部发生某些错误)。

至于超时参数,CoreBluetooth 框架中没有记录方法。您可以为它创建自己的实现,但是我相信您最好保留一个列表,列出您实际调用的外围设备 uuid,然后在它们出现时从列表中弹出它们连接。如果您不想再连接到列表中的外围设备,请在该 UUID 上调用 cancelPeripheral:,在另一个上调用 connectPeripheral:,然后交换条目。很高兴。

关于ios - 如果设备关闭,尝试在 IOS 应用程序中检索以前配对的蓝牙设备将不会响应失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18244137/

相关文章:

iphone - 使用 iPhone 摄像头作为亮度传感器

ios - 如何在 Swift 中设置 UIWebView 的 "User-Agent" header

ios - 关于在 iPhone 中常量之间使用逻辑 && 的警告

ios - CoreBluetooth 中央 --> 外设

ios - 通过蓝牙接收字符串数据

ios - Measure 应用程序是否有可用的 URL 方案?

ios - Xcode 自动布局 : Place a label next to a dynamic label at a constant distance

objective-c - 向 iOS 应用程序添加另一个 UIWindow 的优点、问题、示例?

objective-c - 在沙盒 OSX 应用程序中询问用户管理员密码

core-location - iBeacon 和 XCode - 使用 CoreLocation 进行发现并与 CoreBluetooth 连接