我正在实施核心蓝牙后台模式,并已成功使用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];
}
Apple docs表示应用必须在本地连接到设备,但是_peripheral.state
读取连接是否调用-connectPeripheral
。调用-centralManager:didConnectPeripheral
和-centralManager:didFailToConnectPeripheral:
都不会。同样地,[_peripheral readRSSI]
不会导致调用-peripheral:didReadRSSI
委托方法。
我似乎无法找到此功能的完整示例代码。如果有人有任何我可以解析的问题来帮助解决问题,我也会很感激。
谢谢,SO
答案 0 :(得分:0)
如果手机在应用程序终止时已连接到外围设备,它将不会调用centralManager:didConnectPeripheral回调,因为它已经连接且Core Bluetooth已为您保存该连接并已存储详细信息。正如您所做的那样,您可以在willRestoreState中恢复连接的详细信息。
如果它已经连接,我唯一知道可以将其唤醒的是,如果外围设备通知或指示或断开连接,在这种情况下,如果您通过设置代表回调正确地恢复了外围设备,那么寻找是
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)error:(NSError *)
或
-(void)centralManager:(CBCentralManager *)didDisconnectPeripheral:(CBPeripheral *)error:(NSError *)
所以我建议您检查peripheral.connected
州,只有connectPeripheral
或peripheral.connected != CBPeripheralStateConnected
peripheral.connected != CBPeripheralStateConnecting