2013-09-25 56 views
4

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

我用

- (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>" 

但没有任何反应

我试图用这个方法适用于ios6,但它是一样的。无连接。

+0

一个人在Apple开发者论坛报告了类似的问题。删除配对后,他的情况得到了解决。你可以试试这个吗? – allprog

+0

@allprog。如果我删除配对(在iOS设置 - >蓝牙),我重新启动应用程序,配对弹出并不显示当我尝试连接外设。如果我重新启动iDevices,没关系,会显示配对警报。 – Mao

+0

这可能是Core Bluetooth的一个小故障。问题是复位后是否可以连接到外设。 – allprog

回答

2

你需要发布你如何实际连接到这些外设供我们确定,但是新的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

+0

@allprog单词。 Def没有用新的api破坏,但是...不得不自己尝试一下,我自己实际上大声笑 –

+0

放心,我感谢你的尝试,并通过声誉表达这一点。 :) – allprog

2

首先,请确保您保留对感兴趣的CBPeripheral的强烈参考。

如果这样做,但CBPeripheralState永不改变从CBPeripheralStateConnectingCBPeripheralStateConnected,只需完全重新加载(完全关闭/开启)你的iPhone/iPad。

+0

强烈的参考是我的问题! – nexuzzz

0

您的代码并不多说,但要连接到从retrievePeripheralsWithIdentifiers检索到的外围设备,您需要先扫描然后再进行连接。

+1

我认为这是错误的 - retrievePeripherals的整个想法是为了避免漫长的扫描过程。 – DrMickeyLauer

0

你不应该在viewDidLoad重新成为了当时CBCentralManager状态未知

你应该做的是,在centralManagerDidUpdateState方法时的状态是CBCentralManagerStatePoweredOn

代码:

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

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


    if ([central state] == CBCentralManagerStatePoweredOn) { 

     [self tryToReconnect]; 

    } 
} 

Helper方法:

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

    } 
}