gpt4 book ai didi

ios - 如何知道 CBPeripheral 何时不再可用

转载 作者:行者123 更新时间:2023-11-30 11:48:52 25 4
gpt4 key购买 nike

有没有办法检查 CBPeripheral 是否实际上仍然可以连接?

我使用CBCentralManager扫描外围设备,它会在didDiscover外围设备:中返回我的外围设备。

如果我关闭并再次打开作为外围设备的物理设备,didDiscovereripheral: 不会再次受到攻击。

此外,如果我在计时器上调用 centralManager.retrievePeripherals() ,外围设备永远不会消失,尽管关闭了很长一段时间。

最佳答案

当调用scanForPeripherals时,您将CBCentralManagerScanOptionAllowDuplicatesKey传递为true:

centralManager.scanForPeripherals(withServices: yourUUIDs, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])

这样 didDiscoverPeripheral 将被多次调用,这通常用于更新 RSSI,但如果您跟踪每个外围设备上次“发现”的时间,您可以删除具有以下功能的外围设备:太长时间不活动了。

如果您将已连接的外围设备(例如使用 retrieveConnectedPeripherals)保留在同一个数组中,您还必须跟踪我们应该期望更新的外围设备。在此示例中,我通过检查 RSSI 是否为 nil 来执行此操作。

示例:

var peripherals = [(peripheral: CBPeripheral,  lastUpdate: Date!)]()
var inactivityTimer: Timer?


override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
centralManager.scanForPeripherals(withServices: yourUUIDs, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])

inactivityTimer?.invalidate() // prevent duplicates
inactivityTimer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(inactivityCheck), userInfo: nil, repeats: true)
}

@objc func inactivityCheck() {
// reversed because we're removing stuff
for i in (0..<peripherals.count).reversed() {
if peripherals[i].RSSI != nil && peripherals[i].lastUpdate.timeIntervalSinceNow < -2 { // 2s max inactivity
peripherals.remove(at: i)
tableView.reloadData()
}
}
}

func serialDidDiscoverPeripheral(_ peripheral: CBPeripheral, advertisementData: [String : Any]?, RSSI: NSNumber?) {
// check for duplicates
if let i = peripherals.index(where: ({ $0.peripheral === peripheral })) {
// update
peripherals[i].RSSI = RSSI
peripherals[i].lastUpdate = Date()
tableView.reloadData()
} else {
// add
peripherals.append((peripheral, advertisementData, RSSI, Date()))
peripherals.sort { ($0.RSSI?.floatValue ?? 0) > ($1.RSSI?.floatValue ?? 0) } // optionally sort array to signal strength
tableView.reloadData()
}
}

编辑:至于centralManager.retrievePeripherals()返回不可用的外围设备,我不知道如何解决这个问题。

关于ios - 如何知道 CBPeripheral 何时不再可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48530044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com