Сканирование определенного устройства с использованием сохраненных служб

У меня есть приложение, которое предоставляет парную кнопку. При нажатии кнопки приложение сканирует некоторые устройства с определенным именем и показывает их в виде таблицы. Ниже scan функция:

func scan() {
    let bonding = userDefaults.bool(forKey: UserDefaultsKey.BONDING)
    if bonding {
        let serviceCount = userDefaults.integer(forKey: UserDefaultsKey.SERVICE_COUNT)
        var cbuuids = [CBUUID]()
        for i in 0..<serviceCount {
            if let serviceString = userDefaults.string(forKey: "SERVICE\(i)") {
                print("[BLEManager] SERVICE\(i): \(serviceString)")
                cbuuids.append(CBUUID(string: serviceString))
            }
        }
        centralManager.scanForPeripherals(withServices: temp, options: nil)
    } else {
        centralManager.scanForPeripherals(withServices: nil, options: nil)
    }
}

Когда выбранное устройство выбрано, приложение подключится к нему и сохранит свои сервисы, используя UserDefaults:

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard error == nil else{
        print("ERROR: \(#file, #function)")
        return
    }
    var index = 0
    for service in peripheral.services!{
        connectPeripheral.discoverCharacteristics(nil, for: service)
        userDefaults.set(service.uuid.uuidString, forKey: "SERVICE\(index)")
        index = index + 1
    }
    userDefaults.set(index, forKey: UserDefaultsKey.SERVICE_COUNT)
    userDefaults.set(true, forKey: UserDefaultsKey.BONDING)
}    

Все работает отлично в первый раз, когда все вещи UserDeaults еще не существуют. Но после того, как я отключил и перезапустил свое приложение и снова нажал ту же парную кнопку, что заставило мой CentralManager сканировать периферийные устройства с ранее сохраненными службами, ничего не происходит. Я ожидал, что подключенное ранее устройство должно отображаться в виде таблицы. Означает ли это, что я не могу подключиться к конкретному устройству таким способом?

1 ответ

Я думаю, что вы хотите передать "var cbuuids" (ваши ранее отсканированные UUID) на scanForPeripherals.

centralManager.scanForPeripherals(withServices: cbuuids, options: nil)

Вы в настоящее время передаете "Temp". Я думаю, что это не правильный UUID.

Другие вопросы по тегам