首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道CBPeripheral何时不再可用

如何知道CBPeripheral何时不再可用
EN

Stack Overflow用户
提问于 2018-01-31 04:32:21
回答 1查看 1.1K关注 0票数 0

有没有一种方法可以检查CBPeripheral是否仍然可以连接?

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

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

此外,如果我在计时器上调用centralManager.retrievePeripherals(),那么即使关闭了很长一段时间,外围设备也不会消失。

EN

回答 1

Stack Overflow用户

发布于 2018-02-05 02:25:32

在调用scanForPeripherals时,您将CBCentralManagerScanOptionAllowDuplicatesKey作为true传递

代码语言:javascript
复制
centralManager.scanForPeripherals(withServices: yourUUIDs, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])

通过这种方式,didDiscoverPeripheral将被多次调用,通常用于更新RSSI,但是如果您跟踪上次“发现”每个外围设备的时间,则可以删除处于不活动状态太长时间的外围设备。

如果您将已连接的外围设备(例如,使用retrieveConnectedPeripherals)保存在同一阵列中,则还必须跟踪我们应该从哪些外围设备获取更新。在本例中,我通过检查RSSI是否为nil来完成此操作。

示例:

代码语言:javascript
复制
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()返回不可用的外设,我不知道如何修复它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48530044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档