I have a simple app where I implemented a Central that can connect to a Peripheral and read or write to him.
For some reasons always this worked, but now I don't know why the delegate method didDiscoverServices is not firing. I am calling peripheral.discoverServices() in didConnect method. When discoverServices method is called I keep getting the error that the delegate method is not implemented or is nil. But the method is implemented and I am looking for services that exists.
This is my code
class SearchForPeripheralsTableViewController: UITableViewController, CBCentralManagerDelegate, CBPeripheralDelegate {
var centralManager: CBCentralManager?
var cbPeripheral: CBPeripheral!
var peripherals: [DiscoveryPeripherals] = []
var listOfServices: [ServiceIdentifier] = []
fileprivate func fillServices(){
listOfServices.append(ServiceIdentifier(CBUUID(string: "FFF0")))
}
override func viewWillAppear(_ animated: Bool) {
tableViewSearchPeripherals.dataSource = self
tableViewSearchPeripherals.delegate = self
initCentralManager()
}
override func viewDidAppear(_ animated: Bool) {
tableViewSearchPeripherals.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Peripheral connected")
let service = listOfServices.first(where: { $0.uuid == CBUUID(string:"FFF0")})
peripheral.discoverServices([(service?.uuid)!])
}
override func viewDidLoad() {
super.viewDidLoad()
fillServices()
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if error != nil {
print("Error discovering services: \(String(describing: error?.localizedDescription))")
return
}
if let services = peripheral.services {
for service in services {
let characteristics = listOfCharacteristics.map({ (element) -> CBUUID in return element.uuid})
// let characteristic = GetCharacteristicByCBUUID(uuid: CBUUID(string: "FFF1"))
peripheral.discoverCharacteristics(characteristics, for: service)
}
}
}
}
You must set your object as the CBPeripheral
's delegate in order to get calls to the CBPeripheralDelegate
functions:
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Peripheral connected")
peripheral.delegate = self
let service = listOfServices.first(where: { $0.uuid == CBUUID(string:"FFF0")})
peripheral.discoverServices([(service?.uuid)!])
}