web-dev-qa-db-fra.com

Connexion CoreBluetooth XPC non valide

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.

12
Zeryx

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)
   }
}
5
Belzik

J'ai rencontré le même problème: le sandboxing est "On" par défaut et désactive l'accès à Bluetooth.

Assurez-vous que vos capacités cibles autorisent l'accès Bluetooth HW (voir capture d'écran ci-jointe). Target capabilities

3
zenerino

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.

1
Fromarch

J'ai résolu de changer NSObject en IViewController dans ma classe de gestionnaire

0
Álvaro Agüero

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.

0
Hashim Akhtar