22
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.

Eric Aya
  • 68,765
  • 33
  • 165
  • 232
Zeryx
  • 221
  • 1
  • 2
  • 4
  • Have you check this url. https://stackoverflow.com/questions/43880346/corebluetooth-xpc-connection-invalid-on-dismiss-viewcontroller – aBilal17 Apr 19 '18 at 09:44
  • you have to add some key in your info.plist will resolve this issue – aBilal17 Apr 19 '18 at 09:44
  • 1
    Try defining CBCentralManager in your appDelegate, use same CBCentralManager in your BLE class – aBilal17 Apr 19 '18 at 09:46
  • I already came across that url before I asked my question which is why I tried editing my info.plist in the first place. Perhaps you could be more specific as to which keys I should add? – Zeryx Apr 19 '18 at 09:55
  • I’ve also tried defining CBCentralManager in my appDelegate, no luck unfortunately – Zeryx Apr 19 '18 at 09:55

5 Answers5

23

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)
   }
}
Belzik
  • 359
  • 2
  • 11
10

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). Target capabilities

zenerino
  • 156
  • 1
  • 5
7

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.

Fromarch
  • 71
  • 1
  • 2
0

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.

Hashim Akhtar
  • 725
  • 2
  • 8
  • 15
0

I solved changing NSObject to UIViewController in my manager class

Álvaro Agüero
  • 2,458
  • 32
  • 26