iOS 13核心蓝牙保存的外围服务在被发现后显示为零

iOS 13核心蓝牙保存的外围服务在被发现后显示为零,ios,swift,xcode,core-bluetooth,Ios,Swift,Xcode,Core Bluetooth,我正在使用iOS 13和swift 5上的核心蓝牙连接外设。我在连接或发现服务和特性方面没有问题。但是,我似乎无法保存所述服务和特征以供以后使用 下面是我的主要CentralManager类,它连接到外围设备并访问其服务: class CentralManager : NSObject{ private var centralManager : CBCentralManager! var peripheralZero : CBPeripheral! override i

我正在使用iOS 13和swift 5上的核心蓝牙连接外设。我在连接或发现服务和特性方面没有问题。但是,我似乎无法保存所述服务和特征以供以后使用

下面是我的主要CentralManager类,它连接到外围设备并访问其服务:

class CentralManager : NSObject{

    private var centralManager : CBCentralManager!
    var peripheralZero : CBPeripheral!
    override init(){
        super.init()

        centralManager = CBCentralManager(delegate: self, queue: nil)
    }

    func startScanning(){
        if centralManager.state == .poweredOn{
            centralManager.scanForPeripherals(withServices: nil, options: nil)
        }
    }

}

// MARK: - CBCentralManager Delegate Methods
extension CentralManager: CBCentralManagerDelegate{
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn{
            print("central powered on")
        }else{
            print("Central does not support bluetooth")
        }
    }
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
        if(peripheral.identifier == ParticlePeripheral.DeviceUUID! as UUID){
            centralManager.stopScan()
            peripheralZero = peripheral //Here I save the found peripheral
            peripheral.delegate = self
            centralManager.connect(self.peripheralZero, options: nil)
        }
    }
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        print("connection successful")
        peripheralZero.discoverServices(nil)
    }
}

//MARK: - CBPeripheral Delegate Methods
extension CentralManager: CBPeripheralDelegate{
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        if let services = peripheralZero.services { // this executes to nil but if I instead use:
            // if let services = peripheral.services 
            // it works
            for service in services{
                print(service)
                peripheral.discoverCharacteristics(nil, for: service)
            }
        }

    }
}
根据苹果关于外围设备服务属性的文档:

如果尚未调用discoverServices(:)方法来发现外围设备的服务,或者在执行此操作时出错,则此属性的值为零

既然我已经调用了discoverServices,难道我不能使用我的peripheralZero变量检索它们吗?无论我在代码中尝试在何处访问它,该值都是nil。我猜我保存外围设备的方式是问题的起因,但我真的不知道。我是swift的新手,因此非常感谢您的帮助

extension XXTrain: CBCentralManagerDelegate {
  func centralManagerDidUpdateState(_ central: CBCentralManager) {
    let cState = central.state
    
    switch cState {
    case .poweredOn:
      print(">>central.state is .poweredOn")
      centralManager.scanForPeripherals(withServices: services)
    @unknown default: break
    }
  }
  
  
  func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    discoveredPeripherals[peripheral.identifier] = peripheral
    myPeripheral = peripheral
    centralManager.connect(peripheral)
  }
  
  func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    print("  -- Connected: \((peripheral.state == .connected) ? "YES" : "NO"), \(String(describing: peripheral.name)), UUID: \(peripheral.identifier)")
    
    peripheral.delegate = self
    peripheral.discoverServices(services)
  }
}


extension XXTrain: CBPeripheralDelegate {
  func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard let services = peripheral.services else { return }
    
    for service in services {
      print("  >> Discover Services Found : \(service.uuid) service")
      peripheral.discoverCharacteristics(nil, for: service)
    }
  }
我发现的是

peripheral.delegate = self
重要的是要放在
didConnect
而不是
disdisdiscover
中,并且

myPeripheral = peripheral
将“持有强引用”置于
didDiscover

我发现的是

peripheral.delegate = self
重要的是要放在
didConnect
而不是
disdisdiscover
中,并且

myPeripheral = peripheral

didDiscover

中放置“保持强引用”的位置,请尝试在
didConnect
中设置
peripheralZero
。我甚至试着在DidDiscoveryCharacteristics中设置它,但仍然不起作用。另外,如果我没有将其设置在didDiscover中,我会收到API误用警告什么API误用警告?你从哪里开始扫描?在收到开机状态之前,您不应该开始扫描。您收到了什么API误用警告?您的问题的特点是存在两个
CentralManager
实例-您确定只创建了一个吗?在
init
中设置断点我在上面的代码中添加了开始扫描的函数。这就是如果我没有在didDiscover中设置peripheralZero,我会得到的API误用:API误用:取消未使用外围设备的连接,您是否忘记保留对它的引用?尝试在
didConnect中设置
peripheralZero
,我已经尝试过了。我甚至试着在DidDiscoveryCharacteristics中设置它,但仍然不起作用。另外,如果我没有将其设置在didDiscover中,我会收到API误用警告什么API误用警告?你从哪里开始扫描?在收到开机状态之前,您不应该开始扫描。您收到了什么API误用警告?您的问题的特点是存在两个
CentralManager
实例-您确定只创建了一个吗?在
init
中设置断点我在上面的代码中添加了开始扫描的函数。这就是如果我没有在didDiscover:API误用:取消未使用外设的连接中设置peripheralZero,我会得到的API误用,您是否忘记保留对它的引用?