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。如果你有什么解决办法,请告诉我。我也面临同样的问题。谢谢