CBCentralManager未启动

时间:2015-04-04 07:59:32

标签: ios macos bluetooth bluetooth-lowenergy discovery

_manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
[NSThread sleepForTimeInterval:10]; // waiting for centralManagerDidUpdateState invocation
[_manager scanForPeripheralsWithServices:@[ _serviceUUID ] options:nil]; // warning here

...

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    NSLog(@"CBCentralManager state is %i", (int)central.state);
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    NSLog(@"Found peripheral: %@", peripheral);
    ...
}

出于某种原因,永远不会调用委托centralManagerDidUpdateState并且我收到警告:

  

2015-04-04 12:59:20.850 xctest [30276:303] CoreBluetooth [警告]    未启动

开始发现外围设备时。 AFAIK它应该适用于OSX(我在MBA 2013和OSX Maverics并运行XCTest)。蓝牙已打开,我可以运行LightBlue应用程序并发现一些BLE设备(我确定在测试我的代码时没有运行BLE应用程序)。因此,不会按预期调用didDiscoverPeripheral

2 个答案:

答案 0 :(得分:0)

我尝试使用后台线程作为sleepForTimeInterval块主线程,CBCentralManager默认使用主线程:

dispatch_queue_t bt_queue = dispatch_queue_create("BT_queue", 0);
_manager = [[CBCentralManager alloc] initWithDelegate:self queue:bt_queue];

因此,centralManagerDidUpdateState:几乎立即被调用,并且使用didDiscoverPeripheral:发现了外围设备。

答案 1 :(得分:0)

对于OS X 10.13.2,CBCentralManager.init()的队列参数必须为非零才能触发回调,例如在斯威夫特

manager = CBCentralManager(
  delegate: self,
  queue: DispatchQueue(label: "BT_queue"))