web-dev-qa-db-ja.com

CoreBluetooth XPC接続が無効です

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

これは私のコードで、実行するとメッセージが表示されます

「[CoreBlueooth] XPC接続が無効です」

NSBluetoothPeripheralUsageDescriptionをinfo.plistファイルに追加してみましたが、うまくいきませんでした。

ただし、奇妙なのは、クラスを使用する代わりにCBCentralManagerを直接初期化すると、すべてが正常に機能することです。

この問題は、クラス[〜#〜] ble [〜#〜]または他のクラスのオブジェクトを作成してCBCentralManagerを初期化しようとしたときにのみ発生します。

12
Zeryx

CBCentralManager参照は、メンバー変数としてのクラスへの強い参照である必要があります。ローカル参照としては機能しません。

次を試してください:

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

私は同じ問題に遭遇しました:サンドボックスはデフォルトで「オン」であり、Bluetoothへのアクセスを無効にします。

ターゲット機能がBluetooth HWアクセスを許可していることを確認してください(添付のスクリーンショットを参照)。 Target capabilities

3
zenerino

IOSシミュレーターを実行している人にとって、Bluetoothはその中で動作しません。したがって、bluetoothを使用してアプリをシミュレートしようとすると、「[CoreBlueooth] XPC Connection Invalid」エラーが発生します。

詳細情報: https://www.browserstack.com/test-on-ios-simulator

実際のデバイスでアプリをテストする必要があります。

1
Fromarch

私のマネージャークラスでNSObjectIViewControllerに変更することを解決しました

0
Álvaro Agüero

私の場合、私がスキャンを呼び出すのが早すぎたことがわかりました。 ViewDidLoadメソッドから呼び出しを行っていました。ボタンを押すだけでスキャンを開始した場合、スキャンは正常に機能します。

私が使用した回避策は、ViewDidLoadメソッドからスキャンを呼び出すときに、遅延を伴うperformSelectorを使用することでした。

0
Hashim Akhtar