4

在 iOS 6 上,没问题,我可以重新连接配对的蓝牙设备

我用

- (void)retrievePeripherals:(NSArray *)peripheralUUIDs 

和代表

- (void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals

返回一个外围设备数组。我遍历这个数组并成功连接每个外围设备。

在 iOS 7 上,

- (void)retrievePeripherals:(NSArray *)peripheralUUIDs 

已弃用。

好的,我对 iOS 7 使用了一种新方法:

- (NSArray *)retrievePeripheralsWithIdentifiers:(NSArray *)identifiers

此方法返回一个外围设备数组。我遍历该数组并尝试连接每个外围设备,但它不起作用。

ios 7方法返回的外围设备日志:

"<CBPeripheral: 0x176e5f50 identifier = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, Name = \"Name\", state = disconnected>"

如果我再次调用retrievePeripheralsWithIdentifiers,外围设备的状态变为:

"<CBPeripheral: 0x176e5f50 identifier = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, Name = \"Name\", state = connecting>"

但什么也没有发生

我尝试使用适用于 iOS 6 的已弃用方法,但它是相同的。没有关联。

4

4 回答 4

3

您需要发布您实际连接到这些外围设备的方式以便我们确定,但新的 iOS 7 方法没有问题。我假设您正在传递CFUUIDRef's(就像我们为 iOS 6 所做的那样)而不是使用新NSUUID参数。

这是您需要做的:

NSUUID *uuid = [[NSUUID alloc]initWithUUIDString:savedUUID];//where savedUUID is the string version of the NSUUID you've saved somewhere

NSArray *peripherals = [_cbCentralManager retrievePeripheralsWithIdentifiers:@[uuid]];

for(CBPeripheral *periph in peripherals)
{
    [_cbCentralManager connectPeripheral:peripheral options:nil];
}

注意:如果您卡在连接状态,请cancelPeripheralConnection:在连接外围设备之前调用。

于 2013-09-25T18:40:18.600 回答
2

首先,确保您CBPeripheral对感兴趣的内容保持强烈的引用。

如果这样做了,但CBPeripheralState从未从 更改CBPeripheralStateConnectingCBPeripheralStateConnected,只需完全重新加载(完全关闭/打开)您的 iPhone / iPad。

于 2015-08-26T15:14:19.920 回答
0

您不应该重新连接,viewDidLoad因为当时CBCentralManager状态为未知

centralManagerDidUpdateState当状态为时,您应该在方法中执行此操作CBCentralManagerStatePoweredOn

代码 :

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{

    NSLog(@"state - %ld",(long)[central state]);


    if ([central state] == CBCentralManagerStatePoweredOn) {

        [self tryToReconnect];

    }
}

辅助方法:

- (void)tryToReconnect
{

    NSArray * peripherals = [_centralManager retrievePeripheralsWithIdentifiers:@[[CBUUID UUIDWithString:@"savedUdidString"]]];


    if (peripherals.count > 0) {

        CBPeripheral * peripheral = [peripherals firstObject];

        self.peripheral = peripheral;

        self.peripheral.delegate = self;

        [_centralManager connectPeripheral:peripheral options:nil];

    }
}
于 2016-10-26T14:39:43.783 回答
0

您的代码并没有说太多,但是要连接到您从您那里检索到的外围设备,retrievePeripheralsWithIdentifiers您需要先扫描然后再连接。

于 2016-01-25T10:49:43.857 回答