Mat*_*ijs 7 ios core-bluetooth cbperipheral
感觉我在这里遗漏了一些东西,但是如何获得关于配对受密码保护的外围设备失败还是成功的反馈?
当我连接受密码保护的外围设备时,弹出密码UIAlertView并连接外围设备(didConnectPeripheral),并立即断开连接(didDisconnectPeripheral).
[bluetoothManager connectPeripheral:peripheral options:nil];
Run Code Online (Sandbox Code Playgroud)
现在我是否输入正确的密码,错误的密码或只是按下取消:在任何情况下我都没有收到来自CoreBluetooth委托方法的任何反馈.
问题是如何获得有关此过程的反馈?
在这里发布多年的问题后面临同样的问题。令人惊讶的是,Apple 没有提供任何关于配对是否成功的回调。但是,可以使用以下步骤得出相同的结论:
var centralManager: CBCentralManager?
var myPeripheral: CBPeripheral?
var peripheralManager: CBPeripheralManager?
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
peripheralManager = CBPeripheralManager.init(delegate: self, queue: DispatchQueue.main )
Run Code Online (Sandbox Code Playgroud)
CBCentralManager处于.poweredOn状态时扫描设备:func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
centralManager?.scanForPeripherals(withServices: [CBUUID.init(string: "SERVICE-ID")])
}
}
Run Code Online (Sandbox Code Playgroud)
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
//Identify the device to be connected
if peripheral.name?.hasSuffix("DEVICE-SERIAL-NUMBER") ?? false {
myPeripheral = peripheral
peripheral.delegate = self
centralManager?.connect(myPeripheral!, options: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.discoverServices([CBUUID.init(string: "SERVICE-ID-STRING")])
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
let services = peripheral.services!
let charId = CBUUID.init(string: “CHARACTERISTIC-ID”)
for service in services {
peripheral.discoverCharacteristics([charId], for: service)
}
}
Run Code Online (Sandbox Code Playgroud)
.notify属性的这些特征之一,将一些写入类型的数据写入为.withResponse func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
let value = 1234
let data = withUnsafeBytes(of: value) { Data($0) }
for characteristic in service.characteristics!
{
if characteristic.properties.contains(.notify) {
peripheral.setNotifyValue(true, for: characteristic)
peripheral.writeValue(data, for: characteristic, type: .withResponse)
}
}
}
Run Code Online (Sandbox Code Playgroud)
func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { }
Run Code Online (Sandbox Code Playgroud)
如果由于密码输入无效或用户取消而导致配对不成功,您将收到“身份验证不足”的错误提示
否则写入特性将成功,错误对象将为 nil。