问题
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