iOS蓝牙后台连接外设
我正在实现核心蓝牙背景模式,并成功地使用了iOS蓝牙后台连接外设,ios,bluetooth,background,cbcentralmanager,cbperipheral,Ios,Bluetooth,Background,Cbcentralmanager,Cbperipheral,我正在实现核心蓝牙背景模式,并成功地使用了willRestoreState方法。系统正确处理扫描和唤醒我的应用程序的服务广告和传入的数据。但是,如果应用程序终止时设备已经连接(由于内存管理),我似乎无法重新建立外围设备的功能所有权。不调用委托方法。这是我的willRestoreState方法: -(void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary<NSString *,id>
willRestoreState
方法。系统正确处理扫描和唤醒我的应用程序的服务广告和传入的数据。但是,如果应用程序终止时设备已经连接(由于内存管理),我似乎无法重新建立外围设备的功能所有权。不调用委托方法。这是我的willRestoreState
方法:
-(void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary<NSString *,id> *)state {
NSArray *peripherals = state[CBCentralManagerRestoredStatePeripheralsKey];
NSString* NFCName = @"ACR1255U-J1-001236";
_centralManager = central;
_centralManager.delegate = self;
for(CBPeripheral* peripheral in peripherals) {
if([peripheral.name isEqualToString:NFCName]) {
NSLog(@"Restoring NFC Connection");
_peripheral = peripheral;
_peripheral.delegate = self;
[_centralManager connectPeripheral:_peripheral options:nil];
return;
}
}
[_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"FFF0"]] options:nil];
}
-(无效)中央经理:(CBCentralManager*)中央遗嘱恢复财产:(NSDictionary*)州{
NSArray*peripherals=状态[CBCentralManagerStoredStatePeripheralsKey];
NSString*NFCName=@“ACR1255U-J1-001236”;
_中央管理者=中央;
_centralManager.delegate=self;
用于(CBPeripheral*外围设备中的外围设备){
if([peripheral.name IsequalString:NFCName]){
NSLog(@“恢复NFC连接”);
_外围设备=外围设备;
_外围设备。代表=自身;
[_CentralManagerConnectPeripheral:_PeripheralOptions:nil];
返回;
}
}
[_centralManager扫描外设服务:@[[CBUUID UUIDWithString:@“FFF0”]]选项:无];
}
Apple声明应用程序必须在本地连接到设备,但\u peripheral。无论是否调用-connectPeripheral
,state
都会读取connected。既不调用-centralManager:didconnectperipal
也不调用-centralManager:didfailtoconnectperipal:
。类似地,[\u peripheral readRSSI]
不会导致调用-peripheral:didrearssi
委托方法
我似乎找不到此功能的完整示例代码。如果有人有任何我可以解析的东西来帮助解决问题,我也会很感激的
谢谢,因此如果手机在应用程序终止时已连接到外围设备,它将不会呼叫centralManager:didConnectPeripheral回调,因为它已连接,核心蓝牙已为您保持连接并已存储详细信息。由您在willRestoreState中恢复连接的详细信息,正如您所做的那样 如果它已经连接,我所知道的唯一能唤醒它的事情是如果外围设备通知、指示或断开连接,在这种情况下,如果您通过设置代理正确恢复了外围设备,那么您正在寻找的回调是
-(void)peripheral:(CBPeripheral*)peripheral didUpdateValueForCharacteristic:(CBCharacteristic*)错误:(NSError*)
或
-(void)centralManager:(CBCentralManager*)didDisconnectPeripheral:(CBPeripheral*)错误:(N错误*)
因此,我建议您检查
外围设备.connected
状态,如果外围设备.connected!=CBPeripheralStateConnected
或peripheral.connected!=CBPeripheralStateConnering
您好,NewEndian,您找到解决此问题的方法了吗?我也有同样的问题。谢谢。嗨,@newedian。如果你有什么解决办法,请告诉我。我也面临同样的问题。谢谢