【问题标题】:didDisconnectPeripheral not called iOS Swift 3didDisconnectPeripheral 未调用 iOS Swift 3
【发布时间】:2017-06-12 21:33:44
【问题描述】:

我正在尝试断开与 BLE 设备的连接。我在做cancelPeripheralConnection(),它从不打电话给didDisconnectPeripheral()。 我将通知值设置为一个特征,因此在断开连接时我将其设置为 false。

{

BLEOperations.sharedInstance.connectedDevice?.setNotifyValue(false, for: BLEOperations.sharedInstance.peripheralCharacteristics[0])

BLEOperations.sharedInstance.manager.cancelPeripheralConnection(BLEOperations.sharedInstance.connectedDevice!)

}

当用户尝试连接到新设备时,我正在尝试断开 connectedPeripheral。当前设备未断开连接,但新设备与旧设备连接。

{

BLEOperations.sharedInstance.manager.connect(self.peripheralArray[indexPath.row] as! CBPeripheral , options: nil)

}

我在这里做错了什么?当设备连接丢失时,将调用该方法。

【问题讨论】:

  • 此代码是否来自 swift 2->3 迁移?
  • 遇到类似问题...有解决方案吗?
  • @TravisGriggs 请检查接受的答案

标签: ios xcode swift3 disconnect cbperipheral


【解决方案1】:

当 CentralManager 在整个流程中只有一个实例时,它可以正常工作。

您可以创建一个 CentralManager 操作类(它是一个单例)并执行操作,而不是在视图控制器中使用 centralmanagerdelegates。

我做到了,而且效果很好。

【讨论】:

    【解决方案2】:

    好吧,我们可能需要有关您的代码的更多信息。但是你要找的方法,就是这个。

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

    您应该将 centralManager 的委托设置为 self,并且每次外围设备断开连接时,它都应该调用委托。 做一些测试,断开过程并不像看起来那么好,您可以看到您的外围设备仍在断开连接,但已调用委托(这可以通过硬件本身或外围设备上的固件进行调整)。

    顺便说一句,您可以同时连接多个设备。

    【讨论】:

      【解决方案3】:

      取消与外围设备的活动或挂起连接

      class ViewController: UIViewController, CBCentralManagerDelegate {
      
        var manager: CBCentralManager!
        var peripherals: [CBPeripheral]?
      
        @IBAction func actionScanBLEDevice(_ sender: AnyObject) {
           manager = CBCentralManager (delegate: self, queue: nil)
        }
      
        @IBAction func actionDisconnectBLE(_ sender: AnyObject) {
           //Use As per need where you want to disconnect perticular  peripheral
           manager.cancelPeripheralConnection(peripheral[0]) // Disconnent numbers of BLE Devices
        }
      
        func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
           //Manage Some Condition then disconnect
           print("Disconnected from peripheral")  
           peripherals?.append(peripheral)
        }  
      
        func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
      
          print("Discovered peripheral \(peripheral.name,peripheral.identifier.uuidString)")
          print("advertisementData\(advertisementData)")
          // Use discovered peripheral here 
        }
      
        func centralManagerDidUpdateState(_ central: CBCentralManager) {
          print("Checking")
          switch(central.state)
          {
          case.unsupported:
              print("BLE is not supported")
          case.unauthorized:
              print("BLE is unauthorized")
          case.unknown:
              print("BLE is Unknown")
          case.resetting:
              print("BLE is Resetting")
          case.poweredOff:
              print("BLE service is powered off")
          case.poweredOn:
              print("BLE service is powered on")
              print("Start Scanning")
              manager.scanForPeripherals(withServices: nil, options: nil)
          }
        }
      
      }
      

      【讨论】:

      • 我正在使用上述所有建议的答案,但是当我关闭 BLE 设备时会调用 didDisconnectPeripheral,但在使用 manager.cancelPeripheralConnection(connectedDevice) 时不会调用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多