Swiftui - 蓝牙低功耗状态始终未知

Swiftui - Bluetooth Low Energy status is always unknown

我有一个使用 BLE 的 swiftui 程序。但是当我想知道 centralManager (my iPhone) 的状态时,它显示未知。我不知道是我的代码有错误还是我的 phone.

有问题

我的内容视图:

import SwiftUI
import CoreBluetooth

struct ContentView: View {
    var body: some View {
        VStack {
            Text("View").background(Color.init(red: 56, green: 22, blue: 22))
        }
        .onAppear(perform: connectBLEDevice)
    }
    private func connectBLEDevice(){
        print("connectBLEDevice")
        let ble = BLEConnection()
        ble.startCentralManager()
    }
}

我的 class BLE :

import CoreBluetooth

class BLEConnection: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
    var centralManager: CBCentralManager!
    var myPeripheral: CBPeripheral!

func startCentralManager() {
    self.centralManager = CBCentralManager(delegate: self, queue: nil)
    print("Central Manager State: \(self.centralManager.state)")
    centralManagerDidUpdateState(self.centralManager)
}

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    switch (central.state) {
       case .unsupported:
        print("BLE is Unsupported")
        break
       case .unauthorized:
        print("BLE is Unauthorized")
        break
       case .unknown:
        print("BLE is Unknown")
        break
       case .resetting:
        print("BLE is Resetting")
        break
       case .poweredOff:
        print("BLE is Powered Off")
        break
       case .poweredOn:
        print("BLE powered on")
        break
    @unknown default:
        break
    }
}
}

这里有一些修正

struct ContentView: View {
    private let ble = BLEConnection() // make member !!

    var body: some View {
        VStack {
            Text("View").background(Color.init(red: 56, green: 22, blue: 22))
        }
        .onAppear(perform: connectBLEDevice)
    }

    private func connectBLEDevice(){
        print("connectBLEDevice")
        ble.startCentralManager()
    }
}

Delegate 将被 BLE 引擎异步调用,所以不要强制调用它 - 只需为每个状态添加处理代码

func startCentralManager() {
    self.centralManager = CBCentralManager(delegate: self, queue: nil)

//    print("Central Manager State: \(self.centralManager.state)") //
//    centralManagerDidUpdateState(self.centralManager)  // << wrong !!
}