Проблема с iOS, если Bluetooth включен

Мне нужно проверить, включен ли Bluetooth.

Я использую этот код:

func startDetectingBluetoothState() {
        if self.centralManager == nil {
            self.centralManager = CBCentralManager(delegate: self, queue: self.workingQueue, options: [CBCentralManagerOptionShowPowerAlertKey: false])
        }
    }

func centralManagerDidUpdateState(_ central: CBCentralManager) {
        let state = central.state
        DispatchQueue.main.async { [weak self] in
            // notify observers about state change
            self?.stateObservers.invokeDelegates { stateObserver in
                stateObserver.bluetoothStateChanged()
            }
        }
    }

Я запускаю приложение на iPhone X 11.3 (Bluetooth включен в настройках), то почти сразу же входит в centralManagerDidUpdateState(_ central: CBCentralManager) с state == .poweredOff, Так что значение неверно. Затем я отключаю Bluetooth в настройках, centralManagerDidUpdateState(_ central: CBCentralManager) функция не вызывается (потому что предыдущее обнаруженное состояние было.poweredOff), затем я включаю Bluetooth и centralManagerDidUpdateState(_ central: CBCentralManager) называется с .poweredOn значение. Затем он обнаруживает каждое изменение состояния должным образом. Но если я перезагружаю приложение и Bluetooth включен, он не может обнаружить его снова. Если во время запуска Bluetooth выключен, все в порядке.

У меня есть другое устройство iPhone 6+11.2.5где все работает как шарм:)

2 ответа

Вам необходимо реализовать CBCentralManagerDelegate. Ниже приведен пример кода, который может помочь вам проверить условие:

 var centralManager:CBCentralManager!

 in init() or viewDidLoad()
 {
     centralManager = CBCentralManager()
     centralManager.delegate = self
 }

func centralManagerDidUpdateState(_ central: CBCentralManager) {

  if central.state == .poweredOn {
     print("Bluetooth is connected")
  }
  else if central.state == .poweredOff{
     print("Bluetooth is not Connected.")
  }
}

Используйте этот код, работающий для вас

 var centralManager:CBCentralManager!

 override func viewDidLoad()
{
    super.viewDidLoad()

    // This will trigger centralManagerDidUpdateState
    centralManager = CBCentralManager(delegate: self, queue: nil)

}

 func centralManagerDidUpdateState(_ central: CBCentralManager)
{
    print("Central Manager did update state")

    if (central.state == .poweredOn)
    {

        self.centralManager?.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: false])
    }
    else 
     {
        // Bluetooth is unavailable for some reason

        // Give feedback
        var message = String()
        switch central.state
        {
        case .unsupported:
            message = "Bluetooth is unsupported"
        case .unknown:
            message = "Bluetooth state is unkown"
        case .unauthorized:
            message = "Bluetooth is unauthorized"
        case .poweredOff:
            message = "Bluetooth is powered off"
        default:
            break
        }
        print(message)

        UIAlertView(
            title: "Bluetooth unavailable",
            message: message,
            delegate: nil,
            cancelButtonTitle: "OK")
            .show()
    }
}

Этот код работает без отображения предупреждения о разрешении iOS. Версия Swift 5

typealias Completion = ((Any?)->Void)
class BLEManager: NSObject {
    static let shared = BLEManager()
    var manager: CBCentralManager?
    var completion: Completion?

    func enabled() -> Bool {
        if #available(iOS 13.0, *) {
            return CBCentralManager(delegate: nil, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey: false]).authorization == .allowedAlways
        }
        else {
            let manager = CBCentralManager(delegate: nil, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey: false])
            return manager.state != .poweredOn
        }
    }
    
    func requestAccess(_ completion: @escaping Completion) {
        self.completion = completion
        manager = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey: true])
    }
}

extension BLEManager: CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        completion?(central.state)
    }
}
Другие вопросы по тегам