蓝牙didConnect或didFailToConnect未使用iOS 11.1.2调用Xcode 9.2

我遇到了Xcode 9.2和iOS 11.1.2的问题,“didDiscover”工作正常,我的外设在我调用connect之前保存在一个数组中,但是“didConnect”或“didFailToConnect”没有被调用,所以外围状态将保持不变在“连接”…请帮助

var manager: CBCentralManager! override func viewDidLoad() { super.viewDidLoad() manager = CBCentralManager(delegate: self, queue: nil) //manager = CBCentralManager (delegate: self, queue: DispatchQueue.main) //manager = CBCentralManager.init(delegate: self, queue: nil, options:[:]) //manager.delegate = self } func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { guard let name = peripheral.name else { return } print("BR peripheral.name = \(name), rssi = \(RSSI), adertisementData = \(advertisementData)") if (peripheral.name?.hasPrefix("testBT"))! { peripheralArray.append(peripheral) manager.connect(peripheralArray.first!, options: [:]) print("Connecting to peripheral \(peripheral)") } } func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { print("BT connected!") manager.stopScan() peripheral.delegate = self peripheral.discoverServices(nil) } func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { print("BT disconnected!") } func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { print("BT failed!") } 

尝试使变量全局:

 var myPeripheral:CBPeripheral? 

比,在你的代码编辑它:

 if (peripheral.name?.hasPrefix("testBT"))! { myPeripheral = peripheral //HERE WRITE DELEGATE, NOT IN didConnect myPeripheral!.delegate = self //peripheralArray.append(myPeripheral) manager.connect(myPeripheral!, options: nil) print("Connecting to peripheral \(peripheral)") } 

现在我认为它应该有效。 我也会开始扫描centralManagerDidUpdateState以确保蓝牙工作正常,如:

 func centralManagerDidUpdateState(_ central: CBCentralManager) { switch central.state{ case .poweredOn: startScan() // own method where i start scanning case .poweredOff: print("blth powered off") case .unsupported: print("bltyh noit supported") } } 

有更多的状态,你可以在文档中检查它。 在vievDidLoad初始化你的CBCentralManager var(manager = CBCentralManager(delegate:self,queue:nil))后调用centralManagerDidUpdateState方法

希望能帮助到你

顺便说一下,你正在制作一个arrays来存储连接的外围设备。 请记住,无论何时从存储该数组的控制器返回并返回该数组,该数组将再次为空。 这就是为什么如果你需要你的蓝牙课程全球工作,我建议你制作一个可以实现Singleton的BluetoothService课程,你可以访问你项目中任何地方的任何状态