没有调用centralManager(_:didDisconnectPeripheral:error:)

时间:2019-02-04 08:35:25

标签: ios swift core-bluetooth

在以Swift(4.2)编写的CoreBluetooth相关的iOS应用中,我遇到以下问题。

该应用程序处理一定数量的PeripheralsCentrals。 每个Peripheral提供一项服务,并有多个Centrals与之连接;它会对此进行核算,并知道连接了多少个Central。

每个Central以相同的方式连接到多个Peripherals;并对此进行核算,以了解连接了多少Peripherals

我有一个问题是关于保持我刚才提到的会计记录保持最新状态。

Peripheral端开始,我可以看到Central何时断开连接。 为此,我使用:      peripheralManager(_:central:didSubscribeTo:) 和:      peripheralManager(_:central:didUnsubscribeFrom:)

Central中,我要使用:      centralManager(_:didConnect:) 和:      centralManager(_:didDisconnectPeripheral:error:)

但是在这里,由于某种原因,它不起作用。第一个函数( centralManager(_:didConnect:))被按预期方式调用,但第二个函数( centralManager(_:didDisconnectPeripheral:error:))不被调用。

我想函数的最后一个问题是我需要解决的问题。但是我可能错了。

结果,我看到Peripheral何时到达,但何时离开。

我想念什么?还是我做错了?

我使用两个设备测试该应用程序。

---更多信息---(更新后)

以下是一些相关代码:

func centralManager(_ central: CBCentralManager,
                    didDiscover peripheral: CBPeripheral,
                    advertisementData: [String : Any],
                    rssi RSSI: NSNumber) {
    print(#function)

    if cbPerifList  == nil {cbPerifList = [CBPeripheral]()}

    if let perifIndx = cbPerifList!.index(where:{$0.identifier==peripheral.identifier}) {
        central.connect(cbPerifList[perifIndx], options: nil)
    } else {
        peripheral.delegate = self
        cbPerifList.append(peripheral)
        central.connect(peripheral, options: nil)
    }
}

我注意到的另一件事可能是相关的。我没有像通常那样通过按钮开关切换外设,而是强制杀死当前扮演外设角色的设备上的应用程序,然后 centralManager(_:didDisconnectPeripheral:error:)函数是就像我期望的那样调用了另一台设备;并且会计核算正确执行。

2 个答案:

答案 0 :(得分:1)

在我的CoreBluetooth应用中

func centralManager (_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
}

在外围设备丢失时调用。

也许检查一下didDisconnectPeripheral函数的语法。

答案 1 :(得分:0)

我没有找到这个问题的直接答案。 阅读评论似乎表明现在已经有了答案。换句话说,我想做的事听起来是不可能的。如果某些专家碰巧知道其他情况,请告诉我们。

与此同时,我提出了一种解决方法:

当关闭一个外围设备时,我使用其特性之一来设置一些无意义的值,然后该值被中央用作提示,以知道外围设备已“说再见”。有效。