iOS 7 BLE无法重新连接配对设备。

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上可以工作,但是结果一样。没有连接。


有个人在苹果开发者论坛上报告了类似的问题。他的情况在删除配对后得到了解决。你可以试试这个方法吗? - allprog
@allprog。如果我删除iOS设置->蓝牙中的配对,然后重新启动应用程序,则在尝试连接外围设备时不会显示配对弹出窗口。如果我重新启动iDevices,那么就可以正常使用,配对警报会显示。 - MrP
这可能是Core Bluetooth中的故障。问题是重置后是否可以连接到外围设备。 - allprog
@allprog。在重置iDevice后,我可以配对并连接我的外围设备一次。如果我重新启动应用程序,则无法连接。 - MrP
如果您也重置设备会怎样呢?正如@tdevoy所指出的那样,问题可能不在于应用程序代码,而是与您的外围设备固件有关。 - allprog
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:函数。

2
由于检索API似乎返回了某些外围设备,我猜测标识符是正确的。代码中可能还有其他问题,但我们需要查看清单以确保。 - allprog
@allprog 回来啦! - Tommy Devoy
3
@tdevoy. 我使用存储在用户偏好设置中的字符串创建的标识符。[[NSUUID alloc] initWithUUIDString:strUUID]。我将此标识符添加到数组中并调用retrievePeripheralsWithIdentifiers方法。该方法返回一个外设数组。这个方法可以工作但我无法重新连接外设。我调用[centralManager connectPeripheral:peripheral options:nil]; 但他的委托(didConnectPeripheral)从未被调用。 - MrP
听起来你可能有固件问题。芯片组是什么? - Tommy Devoy
@tdevoy 我使用BlueGiga BLE 113。 - MrP
显示剩余2条评论

2

首先,请确保您正在保留对感兴趣的CBPeripheral的强引用。

如果已经这样做了,但是CBPeripheralStateCBPeripheralStateConnectingCBPeripheralStateConnected的状态从未改变,请完全重新加载(完全关闭/打开)您的iPhone / iPad。


强引用是我的问题! - nexuzzz

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];

    }
}

0

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


2
我认为这是错误的 - retrievePeripherals 的整个想法就是避免冗长的扫描过程。 - DrMickeyLauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接