Каждый раз при сканировании bluetooth-устройств выдает CBCentralManagerStateUnknown?
Впервые я использую coreBluetooth. Вот моя реализация есть ли в ней что-то неправильное.
@synthesize CM,activePeripheral;
- (id)init
{
if ((self = [super init]))
{
CM = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (int) scanForPeripherals
{
if (self.CM.state != CBCentralManagerStatePoweredOn)
{
NSLog(@"CoreBluetooth is %s",[self centralManagerStateToString:self.CM.state]);
return -1;
}
[self.CM scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"180D"]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];
return 0;
}
- (const char *) centralManagerStateToString: (int)state
{
switch(state)
{
case CBCentralManagerStateUnknown:
return "State unknown (CBCentralManagerStateUnknown)";
case CBCentralManagerStateResetting:
return "State resetting (CBCentralManagerStateUnknown)";
case CBCentralManagerStateUnsupported:
return "State BLE unsupported (CBCentralManagerStateResetting)";
case CBCentralManagerStateUnauthorized:
return "State unauthorized (CBCentralManagerStateUnauthorized)";
case CBCentralManagerStatePoweredOff:
return "State BLE powered off (CBCentralManagerStatePoweredOff)";
case CBCentralManagerStatePoweredOn:
return "State powered up and ready (CBCentralManagerStatePoweredOn)";
default:
return "State unknown";
}
return "Unknown state";
}
- (void) connectPeripheral:(CBPeripheral *)peripheral {
printf("Connecting to peripheral with UUID : %srn",[self UUIDToString:peripheral.UUID]);
self.activePeripheral = peripheral;
self.activePeripheral.delegate = self;
[self.CM connectPeripheral:self.activePeripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}
-(const char *) UUIDToString:(CFUUIDRef)UUID
{
if (!UUID)
return "NULL";
CFStringRef s = CFUUIDCreateString(NULL, UUID);
return CFStringGetCStringPtr(s, 0);
}
#pragma mark -Central manager delegate method
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
NSLog(@"hits it");
if (central.state != CBCentralManagerStatePoweredOn) {
return;
}
isOn=YES;
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
NSLog(@"Received periferal :%@",peripheral);
NSLog(@"Ad data :%@",advertisementData);
[MBProgressHUD hideHUDForView:self.view animated:YES];
}
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
NSLog(@"Connected peripheral %@",peripheral);
}
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"Error occured :%@",[error localizedDescription]);
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)scanDevices:(id)sender {
if (isOn) {
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[self scanForPeripherals];
}
}
Каждый раз, когда он дает log
CoreBluetooth is State unknown (CBCentralManagerStateUnknown)
Обновление к вопросу
После предложения, данного @Michael Dautermann, я узнаю, что мой метод делегата centralManagerDidUpdateState не поражает.Я не знаю, почему это происходит.Если кто-нибудь найдет причину, пожалуйста, сообщите мне.
Спасибо вам.
3 ответа:
CoreBluetooth просто находится в процессе запуска.
Вам нужен этот метод делегата, чтобы ударить первым:
- (void) centralManagerDidUpdateState: (CBCentralManager *) central;
И как только это произойдет, затем Вы можете начать сканирование периферийных устройств.
Через несколько дней я проверил инициализацию CentralManager и узнал, что метод init на firstViewController никогда не вызывался.Я проверил, распечатав вход в метод init.
- (id)init { NSLog(@"hello init"); if ((self = [super init])) { CM = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()]; } return self; } - (void)viewDidLoad { CM = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()]; isOn=NO; [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. }
Итак, я инициализирую центральный менеджер в viewDidLoad, и теперь он инициализируется и centralManagerDidUpdateState, наконец, вызывается.Теперь печать
CBCentralManagerStateUnsupported
, и это не проблема, потому что iPhone 4 не поддерживает ее.Спасибо Майклу, он мне очень помог.