iOS10上的CoreBluetooth:CBPeripheral discoverServices后的超时

时间:2016-09-20 10:19:35

标签: ios bluetooth-lowenergy core-bluetooth nrf51

我们的应用程序通过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;
在联系discoverServices上致电CBPeripheral

有谁知道什么是错的?这是iOS 10问题吗?是否有某个BLE日志需要检查?

使用Nordic Semiconductor nRF51822在iPad Pro 9.7上设置iOS 10.0.1(14A403)

2 个答案:

答案 0 :(得分:3)

好的,我解决了问题。我混淆了CBUUIDNSUUID
从iOS 10 CBPeripheral discoverServices开始,只接受CBUUIDNSUUID不再有效。也许NSUUID只能在较旧的iOS版本上意外使用。文件明确指出:

  

表示要发现的服务类型的CBUUID个对象列表。

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。

答案 1 :(得分:0)

确保在CBPeripheral调用peripheral:didDiscoverServices:之前不允许CBCentralManagerDelegate取消分配。通过将外围设备分配给属性,例如,可以很容易地实现这一点。 G:

@property (nonatomic, string) CBPeripheral *peripheral;

...

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {

  self.peripheral = peripheral
  [peripheral discoverServices:<desired service UUIDs>];
  ...
}