什么原因导致CBCentralManagerStateUnknown在iOS?
为什么使用这个简单的代码在iPad 2上获得CBCentralManagerStateUnknown
?
- (BOOL)viewDidLoad { bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; if ([manager state] == CBCentralManagerStatePoweredOff) NSLog(@"CBCentralManagerStatePoweredOff"); if ([manager state] == CBCentralManagerStatePoweredOn) NSLog(@"CBCentralManagerStatePoweredOn"); if ([manager state] == CBCentralManagerStateResetting) NSLog(@"CBCentralManagerStateResetting"); if ([manager state] == CBCentralManagerStateUnauthorized) NSLog(@"CBCentralManagerStateUnauthorized"); if ([manager state] == CBCentralManagerStateUnknown) NSLog(@"CBCentralManagerStateUnknown"); if ([manager state] == CBCentralManagerStateUnsupported) NSLog(@"CBCentralManagerStateUnsupported"); }
我无法弄清楚CBCentralManagerStateUnknown
含义。 我该怎么办? 苹果文档只是说:
状态不明,更新即将发生。
我在蓝牙设备连接的情况下以及蓝牙closures的情况下得到了这个响应。 如果我尝试运行类似[manager retrieveConnectedPeripherals]
东西,我也会在控制台中得到这个消息:
CoreBluetooth[WARNING] <CBConcreteCentralManager: ...> is not powered on
我知道为什么委托从未被称为。 因为该对象从内存中删除。 只是做一个强大的财产
@property (strong, nonatomic) DiscoverBluetoothDevices *btDevices;
并在初始化
@implementation DiscoverBluetoothDevices - (id) init { self = [super init]; if(self) { centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; [centralManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}]; } return self; }
现在,代表被正确地调用。
CBCentralManagerStateUnknown
只是意味着iOS已经启动了BLE进程,但还没有完成初始化。 给它一下,国家会改变。
一般来说,通过检测CBCentralManagerDelegate
委托处理程序中的状态变化,而不是在初始化调用之后立即查看状态,您将“稍等片刻”。 你会执行
- (void) centralManagerDidUpdateState: (CBCentralManager *) central;
有一些很好的例子显示了这一点,比如苹果的心率监测器 。
如果中央的状态转到CBCentralManagerStateUnsupported
(虽然设备支持蓝牙低功耗),但最有可能意味着应用程序在CoreBluetooth上做了一些坏事。
检查iOS蓝牙诊断日志logging。
例如,如果你这样做…
_cm1 = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{ CBCentralManagerOptionRestoreIdentifierKey: @"not_unique" }]; _cm2 = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{ CBCentralManagerOptionRestoreIdentifierKey: @"not_unique" }];
第二个中央的州将去CBCentralManagerStateUnsupported
。
实际答案(我知道的老问题); 开始扫描外围设备,这将启动BT LE,您的代表将被回电。 我的代表和状态信息没有改变,直到我这样做。
一个。 设置你的cbcentralmanager如下b。 在你的代码和你的.h文件中有-central *代表c。 NSLog或在屏幕上用新状态更新标签。 而…成功。
cManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; [cManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];
您需要同时保留CBCentralManager
实例(将其置于ivar或private属性中)并等待状态更改委托被调用。 (如果在实例化pipe理器后立即检查,状态总是“未知的”,实时状态将在委托方法中立即出现。
在我的情况下,我没有使用AppDelegate作为代表
CBCentralManagerDelegate
和单向的
AVCaptureMetadataOutputObjectsDelegate.
在一次。
1)注意线程。 使用
dispatch_get_main_queue()
要么
[NSThread mainThread]
与BLE合作。
2)注意在1个对象上使用这2个代表。 因为硬件不是上下文保存