2013-09-25 59 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]; 

    } 
}