什么原因导致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个代表。 因为硬件不是上下文保存