我正在实现核心蓝牙后台模式,并且已经成功地使用了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];
}苹果docs规定,应用程序必须在本地连接到设备,但无论是否调用-connectPeripheral,_peripheral.state都显示为已连接。既不调用-centralManager:didConnectPeripheral也不调用-centralManager:didFailToConnectPeripheral:。类似地,[_peripheral readRSSI]不会导致调用-peripheral:didReadRSSI委托方法。
我似乎找不到此功能的完整示例代码。如果任何人有任何我可以解析的东西来帮助解决问题,我也会非常感激。
谢谢你,所以
发布于 2016-06-02 22:15:55
如果在应用程序终止时手机已经连接到外围设备,它将不会调用centralManager:didConnectPeripheral回调,因为它已经连接,并且Core Bluetooth已经为您保留了该连接并存储了详细信息。按照您正确的做法,在willRestoreState中恢复连接的详细信息由您决定。
如果它已经连接,我所知道的唯一能唤醒它的就是外围设备是否通知、指示或断开连接,在这种情况下,如果您通过设置委托正确地恢复了您的外围设备,则您要查找的回调是
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)error:(NSError *)
或
-(void)centralManager:(CBCentralManager *)didDisconnectPeripheral:(CBPeripheral *)error:(NSError *)
因此,我建议您检查peripheral.connected状态,只有在peripheral.connected != CBPeripheralStateConnected或peripheral.connected != CBPeripheralStateConnecting时才调用connectPeripheral
https://stackoverflow.com/questions/37275772
复制相似问题