我有一个使用 BLE 的 swiftui 程序。但是当我想知道 centralManager (my iPhone) 的状态时,它显示未知。我不知道是我的代码有问题还是我的手机有问题。
我的内容视图:
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()
}
}
我的 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 !!
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句