в то время как делегат равен нулю или не реализует периферийное устройство: didDiscoverCharacteristicsForService: ошибка: (Corebluetooth, Swift) - PullRequest
0 голосов
/ 26 апреля 2020

Ранее я опубликовал аналогичный пост, посвященный проблеме со службами, и исправил его, добавив периферийное устройство.delegate = self.

Теперь у меня возникает эта проблема, когда я пытаюсь определить характеристики для Сервисы.

, когда делегат равен нулю или не реализует периферийное устройство: didDiscoverCharacteristicsForService: error:

Вот мой ViewController

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)
      }
    }
  }
}

Кто-нибудь знает, что Я должен делать? спасибо!

1 Ответ

1 голос
/ 26 апреля 2020

Вы поместили свою peripheral(_:didDiscoverCharacteristicsFor:error:) функцию в функцию peripheral(_:didDiscoverServices:). Таким образом, это вложенная функция, а не часть расширения CBPeripheralDelegate. Переместите его за пределы функции в собственное расширение, и оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...