Проблема с 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)
}
}