Установите для CBCentralManagerScanOptionAllowDuplicatesKey значение true до начала сканирования, чтобы периферийный метод callDack для didDiscover запускался каждый раз при получении рекламного пакета.
создать словарь и таймер для отслеживания списка обнаруженных устройств. Ключом словаря является идентификатор периферийного устройства, а значение - счетчик, изначально установленный на 5, когда периферийное устройство обнаруживается впервые, после чего, когда получен рекламный пакет от периферийного устройства, мы продолжаем обновлять значение счетчика до 5 в методе обратного вызова didDiscover периферийного устройства.
var discoveredPeripherals : [String: Int] = [String: Int]()
var discoveryTimer : Timer = Timer()
ScheduledTimer при запуске сканирования:
discoveryTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateDiscoveredDevices), userInfo: nil, repeats: true)
остановка таймера при остановке сканирования.
discoveryTimer.invalidate()
, если устройство прекращает рекламу и не подключено затем удалите устройство через 5 сек c из списка обнаруженных устройств.
@objc func updateDiscoveredDevices() {
peripherals.forEach{
if discoveredPeripherals.index(forKey: $0.identifier.uuidString) != nil
{
if discoveredPeripherals[$0.identifier.uuidString]! != 0
{
discoveredPeripherals[$0.bleDeviceGetId()]! -= 1
}
else{
if $0.state != CBPeripheralState.connected
{
removeDevice($0)
}
}
}
}
}
Спасибо @ Paulw11 за предложение такого подхода.