Unable to show available bluetooth devices (wireless headphone name) in iOS Swift

555 Views Asked by At

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?

enter image description here

0

There are 0 best solutions below