iOS蓝牙背景连接外设

时间:2016-05-17 12:09:43

标签: ios bluetooth background cbcentralmanager cbperipheral

我正在实施核心蓝牙后台模式,并已成功使用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

1 个答案:

答案 0 :(得分:0)

如果手机在应用程序终止时已连接到外围设备,它将不会调用centralManager:didConnectPeripheral回调,因为它已经连接且Core Bluetooth已为您保存该连接并已存储详细信息。正如您所做的那样,您可以在willRestoreState中恢复连接的详细信息。

如果它已经连接,我唯一知道可以将其唤醒的是,如果外围设备通知或指示或断开连接,在这种情况下,如果您通过设置代表回调正确地恢复了外围设备,那么寻找是 - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)error:(NSError *)

-(void)centralManager:(CBCentralManager *)didDisconnectPeripheral:(CBPeripheral *)error:(NSError *)
所以我建议您检查peripheral.connected州,只有connectPeripheralperipheral.connected != CBPeripheralStateConnected

才能致电peripheral.connected != CBPeripheralStateConnecting