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を初期化しようとしたときにのみ発生します。
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)
}
}
IOSシミュレーターを実行している人にとって、Bluetoothはその中で動作しません。したがって、bluetoothを使用してアプリをシミュレートしようとすると、「[CoreBlueooth] XPC Connection Invalid」エラーが発生します。
詳細情報: https://www.browserstack.com/test-on-ios-simulator
実際のデバイスでアプリをテストする必要があります。
私のマネージャークラスでNSObjectをIViewControllerに変更することを解決しました
私の場合、私がスキャンを呼び出すのが早すぎたことがわかりました。 ViewDidLoadメソッドから呼び出しを行っていました。ボタンを押すだけでスキャンを開始した場合、スキャンは正常に機能します。
私が使用した回避策は、ViewDidLoadメソッドからスキャンを呼び出すときに、遅延を伴うperformSelectorを使用することでした。