Ответ 1
Вам нужно подождать, пока не будет вызван обратный вызов [-CBCentralManagerDelegate centralManagerDidUpdateState:]
. Затем проверьте, что состояние PoweredOn
прежде чем начинать сканирование периферийных устройств.
Я пишу тестовое приложение в iOS 7 с Core Bluetooth API. При тестировании приложения я обнаружил, что получаю следующее предупреждение:
TestBluetooth [626: 60b] CoreBluetooth [API MISUSE] может принимать команды только во включенном состоянии
Позже я отладил приложение и обнаружил, что предупреждение исходит из следующей строки кода:
[manager scanForPeripheralsWithServices:array options:scanOptions];
Так может кто-нибудь сказать мне, почему я получаю это сообщение в консоли?
Вокруг меня есть Android-устройства Bluetooth 4.0, но это приложение не воспринимает их как периферийное устройство. Так почему же он не обнаруживает устройства Bluetooth 4.0 LE Android в качестве периферийных устройств?
Вам нужно подождать, пока не будет вызван обратный вызов [-CBCentralManagerDelegate centralManagerDidUpdateState:]
. Затем проверьте, что состояние PoweredOn
прежде чем начинать сканирование периферийных устройств.
Пожалуйста, используйте следующий код для устранения предупреждения:
(Вы можете сослаться на код в 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;
}
}
}
Сканирование при включенном Bluetooth:
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)
}
}