我在 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方法
希望能帮助到你
顺便说一句,您正在创建一个数组来存储连接的外围设备。请记住,每当您从存储该数组的控制器返回并返回到该数组时,该数组将再次为空。这就是为什么如果您需要您的蓝牙类在全球范围内工作,我建议您创建一个实现单例的 BluetoothService 类,并且您可以访问项目中任何位置的任何状态
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)