IOS 7でCore Bluetooth APIを使用してテストアプリを作成しています。アプリケーションをテストすると、次の警告メッセージが表示されます。
TestBluetooth [626:60b] CoreBluetooth [API MISUSE]は、電源がオンの状態でのみコマンドを受け入れることができます
後でアプリをデバッグしましたが、次のコード行から警告が出ていることがわかりました。
[manager scanForPeripheralsWithServices:array options:scanOptions];
コンソールでこのメッセージが表示される理由を教えてください。
私の周りにはbluetooth 4.0 Androidデバイスがありますが、このアプリはそれらを周辺デバイスとして検出していません。では、なぜBluetooth 4.0 LE Androidデバイスを周辺機器として検出しないのですか?
[-CBCentralManagerDelegate centralManagerDidUpdateState:]
コールバックが呼び出されるまで待つ必要があります。そして、周辺機器のスキャンを開始する前に、状態がPoweredOn
であることを確認します。
警告を解決するには、次のコードを使用してください。
(コードは https://github.com/luoxubin/BlueTooth4. で参照できます)
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)
}
}