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:
- Declarations and initializations:
var centralManager: CBCentralManager?
var myPeripheral: CBPeripheral?
var peripheralManager: CBPeripheralManager?
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
peripheralManager = CBPeripheralManager.init(delegate: self, queue: DispatchQueue.main )
- Scan for devices when the
CBCentralManager
is in .poweredOn
state:
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
centralManager?.scanForPeripherals(withServices: [CBUUID.init(string: "SERVICE-ID")])
}
}
- Identify and connect to the device of interest:
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)
}
}
- Discover the services of the connected device and then the characteristics of those services
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)
}
}
- For one of these characteristics which has the
.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)
}
}
}
- Check the response of this write to identify if the pairing was successful:
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.