CoreBluetooth XPC connection invalid

狂风中的少年 提交于 2020-12-01 01:59:30

问题


public class BLE: NSObject, CBCentralManagerDelegate {

    var centralManager:CBCentralManager!

    public override init() {
        super.init()
        self.centralManager = CBCentralManager.init(delegate: self, queue: nil)
    }

    public func centralManagerDidUpdateState(_ central: CBCentralManager) {

        switch central.state {
        case .unknown:
            print("unknown")
        case .resetting:
            print("resetting")
        case .unsupported:
            print("unsupported")
        case .unauthorized:
            print("unauthorized")
        case .poweredOff:
            print("powered off")
        case .poweredOn:
            print("powered on")
            self.centralManager.scanForPeripherals(withServices: nil, options: nil)
        }
    }
}

This is my code, whenever I run it, it gives me the message

“[CoreBlueooth] XPC Connection Invalid”

I did try adding NSBluetoothPeripheralUsageDescription into my info.plist file but that didn’t work.

The weird part though is that, if I initialize CBCentralManager directly instead of using a class then everything works fine.

This problem only arises when I try to initialize CBCentralManager by creating on object of the class BLE or any other class for that matter.


回答1:


CBCentralManager reference should be a strong reference to the class as a member variable. It cannot work as a local reference.

Try next:

class ViewController: UIViewController {
   var ble: BLE!
   override func viewDidLoad() {
      super.viewDidLoad()

      ble = BLE()
  }
}

class BLE: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
   private var manager: CBCentralManager!

   required override init() {
      super.init()
      manager = CBCentralManager.init(delegate: self, queue: nil)
   }

   func centralManagerDidUpdateState(_ central: CBCentralManager) {
      var consoleLog = ""

      switch central.state {
      case .poweredOff:
          consoleLog = "BLE is powered off"
      case .poweredOn:
          consoleLog = "BLE is poweredOn"
      case .resetting:
          consoleLog = "BLE is resetting"
      case .unauthorized:
          consoleLog = "BLE is unauthorized"
      case .unknown:
          consoleLog = "BLE is unknown"
      case .unsupported:
          consoleLog = "BLE is unsupported"
      default:
          consoleLog = "default"
      }
      print(consoleLog)
   }
}



回答2:


I ran into the same issue: sandboxing is "On" by default and disables access to Bluetooth.

Make sure your target capabilities allow Bluetooth HW access (see attached screenshot).




回答3:


For people who are running an iOS simulator, bluetooth does not work within it. Thus, if you try and simulate an app using bluetooth, it will raise the "[CoreBlueooth] XPC Connection Invalid" error.

For further information : https://www.browserstack.com/test-on-ios-simulator

You need to test your app on a real device.




回答4:


In my case it turns out that I was making a call for Scan too soon. I was making the call from the ViewDidLoad method. The scan would work fine if I initiated it via the press of a button.

The work around I used was to use the performSelector with a delay when calling the scan from the ViewDidLoad method.




回答5:


I solved changing NSObject to UIViewController in my manager class



来源:https://stackoverflow.com/questions/49917646/corebluetooth-xpc-connection-invalid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!