iOS10 上的 CoreBluetooth:CBPeripheral 发现服务后超时
CoreBluetooth on iOS10: Timeout after CBPeripheral discoverServices
我们的应用程序通过 CoreBluetooth 连接到蓝牙 LE 设备。
在 iOS 8 和 9 上一切正常。在 iOS 10,我们收到超时错误 (Error Domain=CBErrorDomain Code=6 "The connection has timed out unexpectedly."
)
在 CBCentralManagerDelegate:
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;
在已连接的 CBPeripheral
上调用 discoverServices
之后。
有谁知道出了什么问题吗?这是 iOS 10 期吗?是否有特定的 BLE Log 可以检查?
使用 Nordic Semiconductor nRF51822
在 iPad Pro 9.7 上设置 iOS 10.0.1 (14A403)
确保在 CBCentralManagerDelegate
中调用 peripheral:didDiscoverServices:
之前不允许 CBPeripheral
被释放。这很容易通过将外围设备分配给 属性 来实现,例如。 g.:
@property (nonatomic, string) CBPeripheral *peripheral;
...
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
self.peripheral = peripheral
[peripheral discoverServices:<desired service UUIDs>];
...
}
好的,我解决了问题。我混淆了 CBUUID
和 NSUUID
以 iOS 开头 10 CBPeripheral discoverServices
只接受 CBUUID
。 NSUUID
不再有效。也许 NSUUID
只是意外地在旧的 iOS 版本上工作。文档明确指出:
A list of CBUUID
objects representing the service types to be discovered.
NSArray *services = @[
[CBUUID UUIDWithString:ServiceUUID] //Correct
//[[NSUUID alloc] initWithUUIDString:ServiceUUID] //Does work on iOS 9 but not on iOS 10
];
[self.peripheral discoverServices:services];
期待将应用程序移植到强类型Swift。
我们的应用程序通过 CoreBluetooth 连接到蓝牙 LE 设备。
在 iOS 8 和 9 上一切正常。在 iOS 10,我们收到超时错误 (Error Domain=CBErrorDomain Code=6 "The connection has timed out unexpectedly."
)
在 CBCentralManagerDelegate:
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;
在已连接的 CBPeripheral
上调用 discoverServices
之后。
有谁知道出了什么问题吗?这是 iOS 10 期吗?是否有特定的 BLE Log 可以检查?
使用 Nordic Semiconductor nRF51822
在 iPad Pro 9.7 上设置 iOS 10.0.1 (14A403)确保在 CBCentralManagerDelegate
中调用 peripheral:didDiscoverServices:
之前不允许 CBPeripheral
被释放。这很容易通过将外围设备分配给 属性 来实现,例如。 g.:
@property (nonatomic, string) CBPeripheral *peripheral;
...
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
self.peripheral = peripheral
[peripheral discoverServices:<desired service UUIDs>];
...
}
好的,我解决了问题。我混淆了 CBUUID
和 NSUUID
以 iOS 开头 10 CBPeripheral discoverServices
只接受 CBUUID
。 NSUUID
不再有效。也许 NSUUID
只是意外地在旧的 iOS 版本上工作。文档明确指出:
A list of
CBUUID
objects representing the service types to be discovered.
NSArray *services = @[
[CBUUID UUIDWithString:ServiceUUID] //Correct
//[[NSUUID alloc] initWithUUIDString:ServiceUUID] //Does work on iOS 9 but not on iOS 10
];
[self.peripheral discoverServices:services];
期待将应用程序移植到强类型Swift。