didDisconnectPeripheral:没有被调用

时间:2015-12-23 14:07:45

标签: ios objective-c core-bluetooth

我有一个自定义对象BLEDevice,它对CBPeripheral对象有弱引用。我维护一个字典,保持外围设备和我的自定义对象之间的关联:

- (void)setDeviceForPeripheral:(CBPeripheral *)peripheral {
    // New device: sets a new 'BLEDevice' instance
    BLEDevice *new = [[BLEDevice alloc] initWithPeripheral:peripheral];
    new.name = peripheral.name;
    new.peripheral.delegate = self;
    [associations setObject:new forKey:peripheral];
}

当我在附近发现一个新的外围设备时,我执行以下操作:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
    if (![associations objectForKey:peripheral]) {
        NSLog(@"Found peripheral: %@", peripheral.name);
        [self setDeviceForPeripheral:peripheral];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"BLEDeviceFound" object:nil];
    }
}

此时,我定义了一个自定义方法来连接到我的设备:

- (void)connect:(BLEDevice *)device {
    // Connects with the peripheral
    [manager connectPeripheral:device.peripheral options:nil];
}

这里一切正常:我的外围设备已连接,我开始对委托方法centralManager:didConnectPeripheral:内的服务和特性执行操作。

现在我的麻烦来了。当我想断开与外围设备的连接时,我执行以下操作:

- (void)disconnect:(BLEDevice *)device {
    // Unsubscribes from all the characteristics in services
    for (CBService *service in device.peripheral.services) {
        for (CBCharacteristic *characteristic in service.characteristics)
            [device.peripheral setNotifyValue:NO forCharacteristic:characteristic];
    }
    [manager cancelPeripheralConnection:device.peripheral];
}

当我调用此方法时,我的外围设备确认断开连接成功。无论如何,委托方法centralManager:didDisconnectPeripheral:没有被调用。有人可以解释一下为什么吗?

2 个答案:

答案 0 :(得分:3)

我发现解决方案非常简单。我刚刚调用了错误的委托方法。正确的签名是

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error.

这个狗屎几周以来一直让我发疯!

答案 1 :(得分:2)

当您断开外围设备的名称时,不会调用该方法。你想要的是以下几点。

- centralManager:didDisconnectPeripheral:error:

该文件说:

  

当拆除与外围设备的现有连接时调用。

断开外围设备时将调用委托方法。