CBCentralManager 未开机

问题描述 投票:0回答:2
_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

ios macos bluetooth bluetooth-lowenergy bluetooth-device-discovery
2个回答
2
投票

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

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

0
投票

我尝试使用后台线程,因为

sleepForTimeInterval
会阻塞主线程,并且 CBCentralManager 默认使用主线程:

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

因此

centralManagerDidUpdateState:
几乎立即被调用,并通过
didDiscoverPeripheral:
发现外围设备。

© www.soinside.com 2019 - 2024. All rights reserved.