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>];
  ...
}

好的,我解决了问题。我混淆了 CBUUIDNSUUID
以 iOS 开头 10 CBPeripheral discoverServices 只接受 CBUUIDNSUUID 不再有效。也许 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。