2014-04-28 14 views
26

Sto scrivendo un'app di test in iOS 7 con l'API Core Bluetooth. Quando sto testando l'applicazione ho scoperto che sto ottenendo il seguente messaggio di avviso:IOS Core Bluetooth: Getting API MISUSE Warning

2014-04-28 15:52:09.400 TestBluetooth[626:60b] CoreBluetooth[API MISUSE] can only accept commands while in the powered on state

Più tardi ho debug app e ha scoperto che, avvertimento viene dalla seguente riga di codice:

[manager scanForPeripheralsWithServices:array options:scanOptions];

Quindi qualcuno può dirmi perché sto ricevendo questo messaggio nella console?

Ci sono dispositivi Android 4.0 bluetooth intorno a me, ma questa app non li sta scoprendo come periferica. Quindi, perché non è la scoperta di dispositivi Android 4.0 LE bluetooth come periferiche?

+2

È necessario controllare la CBCentralManager' '' proprietà state' prima: https: //developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/CBCentralManager_Class/translated_content/CBCentralManager.html#//apple_ref/occ/instp/CBCentralManager/state – Larme

risposta

48

È necessario attendere fino alla chiamata del callback [-CBCentralManagerDelegate centralManagerDidUpdateState:], quindi verificare che lo stato sia PoweredOn, prima di avviare la scansione delle periferiche.

+3

È un commento semplice ma molto utile. Sembra ovvio ma non lo è. Grazie per quello. – nembleton

+0

np ........... <3 – Etan

+1

Ho creato uno strumento per aiutare a eseguire il debug degli errori di API Errus: https://github.com/nrbrook/NBCoreBluetoothAPIMisuseGuard – Nick

1

Utilizzare il seguente codice per risolvere l'avvertimento:

(è possibile fare riferimento al codice in https://github.com/luoxubin/BlueTooth4.0)

if (bluetoothPowerOn) {  //new code 

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

} //new code 


-(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; 

     } 

    } 


} 
+0

You da real mvp – CodeMode