【发布时间】:2023-03-24 06:39:01
【问题描述】:
我在 iOS 13 和 swift 5 上使用 Core Bluetooth 连接到外围设备。我在连接或发现服务和特性方面没有问题。但是,我似乎无法保存上述服务和特性以供以后使用。
这是连接到外围设备并访问其服务的主要 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)
}
}
}
}
来自 Apple 关于外围设备的 services 属性的文档:
如果您还没有调用 discoverServices(_:) 方法来发现外围设备的服务,或者这样做时出现错误,则此属性的值为 nil。
既然我已经调用了 discoverServices,我不应该能够使用我的 peripheralZero 变量来检索它们吗?无论我尝试在代码中的何处访问它,该值都是 nil。我猜我保存外围设备的方式是导致问题的地方,但我真的不知道。我是 swift 的新手,所以任何帮助将不胜感激!
【问题讨论】:
-
尝试在
didConnect中设置peripheralZero -
我试过了。我什至尝试在 didDiscoverCharacteristicsFor 中设置它,但它仍然不起作用。此外,如果我没有在 didDiscover 中设置它,我会收到 API 滥用警告
-
什么 API 滥用警告?你从哪里开始扫描?在收到开机状态之前,您不应开始扫描
-
您收到了哪些 API 滥用警告?您的问题的特点是有两个
CentralManager实例 - 您确定您只创建一个吗?在init中设置断点 -
我在上面的代码中添加了开始扫描的功能。如果我没有在 didDiscover 中设置 peripheralZero,这是我得到的 API 滥用:API MISUSE:取消未使用外围设备的连接
,你忘记保留它的引用了吗?
标签: ios swift xcode core-bluetooth