It feels like I'm missing something here, but how can I get feedback on whether pairing a passcode protected peripheral failed or succeeded?
When I to connect a peripheral which is password protected the password UIAlertView pops up and the peripheral connects (didConnectPeripheral is called) and disconnects (didDisconnectPeripheral) immediately.
[bluetoothManager connectPeripheral:peripheral options:nil];
Now whether I enter the correct passcode, the wrong passcode or simply press cancel: on all occasions I don't receive any feedback from the CoreBluetooth delegate methods.
The question is how can I get feedback on this process?
Faced the same issue after years of the question being posted here. Surprisingly Apple does not provide any callbacks on whether the pairing was successful. However the following steps can be used to conclude the same:
var centralManager: CBCentralManager?
var myPeripheral: CBPeripheral?
var peripheralManager: CBPeripheralManager?
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
peripheralManager = CBPeripheralManager.init(delegate: self, queue: DispatchQueue.main )
CBCentralManager
is in .poweredOn
state:func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
centralManager?.scanForPeripherals(withServices: [CBUUID.init(string: "SERVICE-ID")])
}
}
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)
}
}
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)
}
}
.notify
property, write some data with write type as .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)
}
}
}
func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { }
If the pairing was not successful because of invalid passcode entry or cancellation by the user, you will get an error saying “Authentication is insufficient”
Else the write to the characteristic will be successful and error object will be nil.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With