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)
}
}
}
Ceci est mon code, chaque fois que je l'exécute, il me donne le message
"[CoreBlueooth] Connexion XPC non valide"
J'ai essayé d'ajouter NSBluetoothPeripheralUsageDescription dans mon fichier info.plist mais cela n'a pas fonctionné.
La partie bizarre est que si j'initialise CBCentralManager directement au lieu d'utiliser une classe, alors tout fonctionne bien.
Ce problème se pose uniquement lorsque j'essaie d'initialiser CBCentralManager en créant sur l'objet de la classe BLE ou toute autre classe d'ailleurs.
La référence CBCentralManager doit être une référence forte à la classe en tant que variable membre. Il ne peut pas fonctionner comme référence locale.
Essayez ensuite:
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)
}
}
Pour les personnes qui exécutent un simulateur iOS, le bluetooth ne fonctionne pas à l'intérieur. Ainsi, si vous essayez de simuler une application en utilisant Bluetooth, cela générera l'erreur "[CoreBlueooth] XPC Connection Invalid".
Pour plus d'informations: https://www.browserstack.com/test-on-ios-simulator
Vous devez tester votre application sur un appareil réel.
J'ai résolu de changer NSObject en IViewController dans ma classe de gestionnaire
Dans mon cas, il s'avère que je faisais un appel au scan trop tôt. Je faisais l'appel à partir de la méthode ViewDidLoad. Le scan fonctionnerait bien si je l'initiais en appuyant sur un bouton.
Le travail autour que j'ai utilisé était d'utiliser le performSelector avec un retard lors de l'appel du scan à partir de la méthode ViewDidLoad.