在扫描开始之前将 CBCentralManagerScanOptionAllowDuplicatesKey 设置为 true,以便在每次收到广告包时执行 didDiscover 外围回调方法。
创建字典和计时器以跟踪发现的设备列表。字典的键是外围设备标识符,当第一次发现外围设备时,计数器的值最初设置为 5,之后当接收到来自外围设备的广告包时,我们会在 didDiscover 外围设备回调方法中继续将计数器值更新为 5。
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 秒后从发现的设备列表中删除该设备。
@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 提出这种方法。