【问题标题】:iOS 7 BLE can't re-connect paired devicesiOS 7 BLE 无法重新连接配对设备
【发布时间】:2013-10-01 07:29:17
【问题描述】:

在 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 的已弃用方法,但它是相同的。没有连接。

【问题讨论】:

  • 一个人在 Apple Dev Forums 中报告了类似的问题。删除配对后,他的情况得到了解决。你可以试试这个吗?
  • @allprog。如果我删除配对(在 ios 设置-> 蓝牙中)并重新启动应用程序,则当我尝试连接外围设备时不会显示配对弹出窗口。如果我重新启动 iDevices,没关系,会显示配对警报。
  • 这可能是 Core Bluetooth 的故障。问题是重置后是否可以连接到外围设备。
  • @allprog。重置 iDevice 后,我可以配对和连接我的外围设备一次。如果我重新启动应用程序,没有连接。
  • 如果您也重置设备会怎样?正如@tdevoy 指出的那样,您的外围设备的固件而不是应用程序的代码可能存在一些问题。

标签: ios7 core-bluetooth bluetooth-lowenergy


【解决方案1】:

您需要发布您实际连接到这些外围设备的方式以便我们确定,但新的 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:。

【讨论】:

  • 由于检索 API 似乎返回了一些外围设备,我猜标识符是好的。代码中可能还有其他内容,但我们需要列出来确定。
  • @allprog 字。虽然新的 api 并没有破坏任何东西......实际上我必须自己尝试一下,哈哈
  • 请放心,我感谢您的尝试,并通过提供声誉来表达这一点。 :)
  • @allprog back atchaaa
  • @tdevoy。我使用使用存储在用户首选项中的字符串创建的标识符。 [[NSUUID 分配] initWithUUIDString:strUUID]。我将此标识符添加到数组并调用方法retrievePeripheralsWithIdentifiers。此方法返回一个外围设备数组。此方法有效,但我无法重新连接外围设备。我调用 [centralManager connectPeripheral:peripheral options:nil];但他的代表 (didConnectPeripheral) 从未被调用。
【解决方案2】:

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

如果这样做了,但 CBPeripheralState 永远不会从 CBPeripheralStateConnecting 更改为 CBPeripheralStateConnected,只需完全重新加载(完全关闭/打开)您的 iPhone / iPad。

【讨论】:

  • 强引用是我的问题!
【解决方案3】:

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

【讨论】:

  • 我认为这是错误的——retrievePeripherals 的整个想法是避免冗长的扫描过程。
【解决方案4】:

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

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

代码:

- (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-01-30
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多