Я хочу сделать сканер BLE, который может работать в фоновом режиме.
Во-первых, я узнал о периферийных устройствах и их сервисных пользователях с помощью кода ниже.
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .poweredOn:
central.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
default:
central.stopScan()
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
self.scannedPeripherals.appendAsUnique(peripheral)
central.connect(peripheral)
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
peripheral.delegate = nil
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
peripheral.services?.forEach {
peripheral.discoverCharacteristics([$0.uuid], for: $0)
}
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
// I got a service uuid here!
print(service.uuid)
}
Этот код позволяет мне делать все, что я хочу, в режиме переднего плана.
Итак, я узнал сервисные uuids, которые можно сканировать сейчас, включая 180A (Device Information)
, 180F (Battery Service)
, 1805 (Current Time Service)
, D0611E78-BBB4-4591-A5F8-487910AE4366 (Continuity)
, 9FA480E0-4967-4542-9390-D343DC5D04AE
.
И я 'мы видели документы (например, фоновое сканирование для BLE в Swift ), в которых говорится, что мне нужно добавить служебные uuids вместо withServices: nil
для работы в фоновом режиме, поэтому я добавил служебные uuids, которые я знаю, каккод ниже.
central.scanForPeripherals(withServices: [CBUUID(string: "180A")], options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
central.scanForPeripherals(withServices: [CBUUID(string: "180F"), CBUUID(string: "9FA480E0-4967-4542-9390-D343DC5D04AE")])
Однако с тех пор периферийные устройства не были обнаружены.(даже в режиме переднего плана.)
Чтобы подвести итог проблемы
сканировать все => 180A
служба была проверена
сканировать с 180A
служба => ничего не сканируется
Что не так?: '(
пс. Спасибо, Paulw11.