蓝牙DIDCONNECT或DIDFAILTOCONNECT未称为Xcode 9.2使用iOS 11.1.2



我有Xcode 9.2和iOS 11.1.2的问题," didDiscover"工作正常,并且我的外围列在我调用Connect之前保存在一个数组中,但是" didConnect"或" 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上扫描以确保蓝牙正常工作,SMTH如:

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(委托:self:self,queue:nil)中,centralmanagerdiDupDateState方法在vievdidload初始化后被调用。

希望它有帮助

顺便说一句,您正在制作一个数组来存储在那里连接的外围设备。只要记住,每当您从存储该数组的控制器返回并回到其中时,数组将再次为空。这就是为什么如果您需要在全球范围内工作的蓝牙课程,我建议您进行蓝牙服务类,以实现Singleton,并且您可以访问项目中任何地方的任何状态

最新更新