Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Core Bluetooth : Getting API MISUSE Warning

I am writing a test app in iOS 7 with the Core Bluetooth API. When I am testing the application I found that I am getting the following warning message:

TestBluetooth[626:60b] CoreBluetooth[API MISUSE] can only accept commands while in the powered on state

Later I debugged app and found that, warning is coming from the following line of code:

[manager scanForPeripheralsWithServices:array options:scanOptions];

So can anyone please tell me why I am getting this message in the console?

There are bluetooth 4.0 android devices around me, but this app is not discovering them as peripheral device. So why it is not discovering bluetooth 4.0 LE Android devices as peripherals?

like image 314
Yogesh Kulkarni Avatar asked Apr 28 '14 10:04

Yogesh Kulkarni


Video Answer


3 Answers

You have to wait until the [-CBCentralManagerDelegate centralManagerDidUpdateState:] callback has been called. And then, verify that the state is PoweredOn before you start scanning for peripherals.

like image 51
Etan Avatar answered Oct 23 '22 06:10

Etan


Please use the following code to solve the warning:

(You can reference to the code in https://github.com/luoxubin/BlueTooth4.0)

if (bluetoothPowerOn) {
    [self.centralManager scanForPeripheralsWithServices:[serviceIDs copy] options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@(NO)}];
}

-(void)centralManagerDidUpdateState:(CBCentralManager *)central{

    switch (central.state) {

        case CBManagerStatePoweredOn:
        {
            bluetoothPowerOn = YES;    //new code
            [self start];
            break;
        }

        default:
        {    
            bluetoothPowerOn = NO;   //new code
            [self stopScan:[NSError hardwareStatusErrorWithMessage:@"Cannot open Bluetooth, please check the setting." hardwareStatus:central.state]];    
            break;
        }
    }
}
like image 43
oOEric Avatar answered Oct 23 '22 07:10

oOEric


Do scan when bluetooth is poweredOn:

func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch central.state {
        case .unknown:
            print("unknown")
        case .resetting:
            print("resetting")
        case .unsupported:
            print("unsupported")
        case .unauthorized:
            print("unauthorized")
        case .poweredOff:
            print("poweredOff")
            centralManager?.stopScan()
        case .poweredOn:
            print("poweredOn")
            centralManager?.scanForPeripherals(withServices: nil, options: nil)
        }
    }
like image 45
Mohammad Zaid Pathan Avatar answered Oct 23 '22 06:10

Mohammad Zaid Pathan