I am trying to show connected/nearby bluetooth devices in iOS app. So, I have wireless headphones (Mi Sports BT Earphones Basic model) and its connected to my iPhone.
But, It is calling only func centralManagerDidUpdateState( _ central: CBCentralManager) delegate method, it is not calling other delegate methods and I am unable to fetch bluetooth device name.
Following is my code:
import UIKit
import CoreBluetooth
class ViewController: UIViewController {
//CBPeripheralDelegate
/* ----------------------------------------------------
Outlets
------------------------------------------------------ */
@IBOutlet weak var bluetoothNameLabel: UILabel!
@IBOutlet weak var bluetoothOnOffStatusLabel: UILabel!
/* ----------------------------------------------------
Instance Objects
------------------------------------------------------ */
var centralManager: CBCentralManager?
var peripherals = [CBPeripheral]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
}
@IBAction func btnScanClick( sender: Any) {
print("scan Start")
let options: [String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey:NSNumber(value: false)]
centralManager?.scanForPeripherals(withServices: nil, options: options)
centralManager?.delegate = self
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) {
print("Scanning stop")
}
}
}
extension ViewController : CBPeripheralDelegate, CBCentralManagerDelegate{
// func centralManagerDidUpdateState(_ central: CBCentralManager) {
// if (central.state == .poweredOn){
// self.centralManager?.scanForPeripherals(withServices: nil, options: nil)
// }
// }
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
let localName = peripheral.name
self.bluetoothNameLabel.text = "\(localName ?? "")"
// if !peripherals.contains(peripheral) {
// let localName = advertisementData[CBAdvertisementDataLocalNameKey]
//
// print("\(String(describing: localName))" )
// peripherals.append(peripheral)
// }
}
func centralManagerDidUpdateState( _ central: CBCentralManager) {
switch central.state {
case .unknown:
print("central.state is .unknown")
case .resetting:
print("central.state is .resetting")
case .unsupported:
print("central.state is .unsupported")
case .unauthorized:
print("central.state is .unauthorized")
case .poweredOff:
print("central.state is .poweredOff")
case .poweredOn:
print("central.state is .poweredOn")
self.bluetoothNameLabel.text = "Bluetooh is powered ON"
@unknown default:
fatalError()
}
}
func centralManager( central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Connected to "+peripheral.name!)
}
func centralManager( _ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
print(error!)
}
}
How to get bluetooth name, Any suggestions?
