iOS 7 BLE не может повторно подключить сопряженные устройства

На iOS 6 нет проблем, я могу повторно подключить сопряженные устройства Bluetooth.

я использую

- (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, но он такой же. Нет соединения.


person MrP    schedule 25.09.2013    source источник
comment
Парень сообщил о подобных проблемах на форумах разработчиков Apple. Его ситуация разрешилась после удаления пар. Вы можете попробовать это?   -  person allprog    schedule 26.09.2013
comment
@allprog. Если я удалю сопряжение (в настройках iOS->Bluetooth) и перезапущу приложение, всплывающее окно сопряжения не будет отображаться при попытке подключить периферийное устройство. Если я перезагружаю iDevices, все в порядке, отображается предупреждение об очистке.   -  person MrP    schedule 26.09.2013
comment
Это, вероятно, сбой в Core Bluetooth. Вопрос можно ли после сброса подключиться к периферии или нет.   -  person allprog    schedule 26.09.2013
comment
@allprog. После сброса iDevice я могу выполнить сопряжение и подключить свое периферийное устройство один раз. Если я перезапускаю приложение, нет связи.   -  person MrP    schedule 27.09.2013
comment
Что, если вы перезагрузите устройство? Как указал @tdevoy, проблема может быть связана с прошивкой вашего периферийного устройства, а не с кодом приложения.   -  person allprog    schedule 27.09.2013


Ответы (4)


Вам нужно опубликовать, как вы на самом деле подключаетесь к этим периферийным устройствам, чтобы мы были уверены, но с новым методом 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: перед подключением периферийного устройства.

person Tommy Devoy    schedule 25.09.2013
comment
Поскольку некоторые периферийные устройства, по-видимому, возвращаются API извлечения, я думаю, что идентификаторы хороши. В коде может быть что-то еще, но нам нужен листинг, чтобы быть уверенным. - person allprog; 25.09.2013
comment
слово @allprog. Определенно ничего не сломалось с новым API, хотя ... пришлось просто попробовать самому, на самом деле, лол - person Tommy Devoy; 25.09.2013
comment
Будьте уверены, я ценю ваши усилия и выражаю это, давая репутацию. :) - person allprog; 25.09.2013
comment
@allprog вернулся на чаааа - person Tommy Devoy; 25.09.2013
comment
@тдевой. Я использую идентификатор, созданный со строкой, хранящейся в пользовательских настройках. [[NSUUID alloc] initWithUUIDString:strUUID]. Я добавляю этот идентификатор в массив и вызываю метод retrievePeripheralsWithIdentifiers. Этот метод возвращает массив периферийных устройств. Этот метод работает, но я не могу повторно подключить периферийные устройства. Я вызываю [centralManager connectPeripheral: параметры периферии: ноль]; но его делегат (didConnectPeripheral) никогда не вызывается. - person MrP; 26.09.2013
comment
Тогда у вас может быть проблема с прошивкой. Какой чипсет? - person Tommy Devoy; 26.09.2013
comment
@tdevoy Я использую BlueGiga BLE 113 - person MrP; 27.09.2013

Прежде всего, убедитесь, что вы сохраняете сильную ссылку на интересующий вас CBPeripheral.

Если это сделано, но CBPeripheralState никогда не меняется с CBPeripheralStateConnecting на CBPeripheralStateConnected, просто полностью перезагрузите (полностью выключите/включите) свой iPhone/iPad.

person OlDor    schedule 26.08.2015
comment
сильная ссылка была моей проблемой! - person nexuzzz; 28.05.2016

Ваш код мало что говорит, но чтобы подключиться к периферийному устройству, которое вы получили от retrievePeripheralsWithIdentifiers, вам нужно сначала отсканировать, а затем подключиться.

person Gili Ariel    schedule 25.01.2016
comment
Я думаю, что это неправильно - вся идея retrievePeripherals состоит в том, чтобы избежать длительного процесса сканирования. - person DrMickeyLauer; 10.06.2016

Вам не следует переподключаться в 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];

    }
}
person Kartik 123    schedule 26.10.2016