ios - 而委托为 nil 或未实现外围设备:didDiscoverCharacteristicsForService:error: (Corebluetooth, Swift)
问题描述
早些时候,我发布了一篇与此类似的关于服务问题的帖子,我通过添加 peripheral.delegate = self 来修复它。
现在,当我尝试发现服务的特征时,我遇到了这个问题。
而委托为 nil 或未实现外围设备:didDiscoverCharacteristicsForService:错误:
这是我的视图控制器
import UIKit
import CoreBluetooth
let rowerServiceCBUUID = CBUUID(string: "CE060000-43E5-11E4-916C-0800200C9A66")
class HRMViewController: UIViewController {
@IBOutlet weak var heartRateLabel: UILabel!
@IBOutlet weak var bodySensorLocationLabel: UILabel!
var centralManager: CBCentralManager!
var pmPeripheral: CBPeripheral!
var wattValue: Int!
override func viewDidLoad() {
super.viewDidLoad()
centralManager = CBCentralManager(delegate: self, queue: nil)
// Make the digits monospaces to avoid shifting when the numbers change
heartRateLabel.font = UIFont.monospacedDigitSystemFont(ofSize: heartRateLabel.font!.pointSize, weight: .regular)
}
func onHeartRateReceived(_ heartRate: Int) {
heartRateLabel.text = String(heartRate)
print("BPM: \(heartRate)")
}
}
extension HRMViewController: CBCentralManagerDelegate {
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")
centralManager.scanForPeripherals(withServices: [rowerServiceCBUUID])
@unknown default: break
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print(peripheral)
peripheral.delegate = self
pmPeripheral = peripheral
pmPeripheral.delegate = self
centralManager.stopScan()
centralManager.connect(pmPeripheral!)
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Connected!")
pmPeripheral.discoverServices(nil)
}
}
extension HRMViewController: CBPeripheralDelegate {
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
guard let services = peripheral.services else { return }
peripheral.delegate = self
for service in services {
print(service)
print(service.characteristics ?? "characteristics are nil")
peripheral.discoverCharacteristics(nil, for: service)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?){
peripheral.delegate = self
guard let characteristics = service.characteristics else { return }
for characteristic in characteristics {
print(characteristic)
}
}
}
}
有谁知道我应该怎么做?谢谢!
解决方案
你把你的函数peripheral(_:didDiscoverCharacteristicsFor:error:)
放在函数里面peripheral(_:didDiscoverServices:)
。像这样,它是一个嵌套函数,而不是CBPeripheralDelegate
扩展的一部分。将它移到函数之外并进入适当的扩展,它应该可以工作。
推荐阅读
- salt-stack - 如何在盐栈计划中设置 state_output=changes?
- ffmpeg - 通过 ffmpeg 以高清分辨率录制和流式传输桌面到 Youtube
- javascript - onClick 时不打印结果的测验问题
- r - 无法在 R 版本 3.4.3 中安装 devtools
- ssl - Nagios check_cert - 严重 - 无法建立 SSL 连接
- react-native - 是否可以使用组件顶部的关闭按钮打开错误屏幕?
- c++ - 输出文件在位图的文件末尾缺少填充。为什么是这样?
- c# - 我真的必须创建多个模型吗?
- python - 如何找到圆与矩形相交的间隔
- apache-spark - Spark JobServer 可以使用 Cassandra 作为 SharedDb