Пробуждение приложения iOS из события Bluetooth

В настоящее время наше приложение использует CoreBluetooth для связи со смарт-часами. Проблема заключается в том, что если приложение (предположительно) было отключено (возможно, после ночного фонового режима), единственным событием Bluetooth, которое, по-видимому, пробуждает приложение и инициирует повторное подключение, является выключение/включение Bluetooth из iOS.

Я реализую следующие методы, чтобы убедиться, что повторные подключения происходят, и что подключения происходят, когда приложение извлекает подключенные периферийные устройства (код был урезан до необходимого):

NSArray * connectedPeripherals = [_centralManager retrieveConnectedPeripheralsWithServices:@[kMyServiceUUID]];
for ( CBPeripheral * peripheral in connectedPeripherals )
{
    if ( peripheral.state == CBPeripheralStateConnected )
        continue;
    else
        [_centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnDisconnectionKey:[NSNumber numberWithBool:TRUE]}];
}

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
    [_centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnDisconnectionKey:[NSNumber numberWithBool:TRUE]}];
}

Как я могу убедиться, что мое приложение может повторно подключиться к часам, если оно работало в фоновом режиме, скажем, ночью?

В том же духе, как я могу гарантировать, что приложение просыпается или может получать данные от часов, если приложение на самом деле было удалено?


person WrightsCS    schedule 09.05.2014    source источник
comment
Смотрю. Хотел бы узнать больше о CoreBluetooth и iBeacon.   -  person Ricky    schedule 09.05.2014
comment
Что ты в итоге сделал? Мне трудно восстановиться после прерванного сеанса приложения. Как приложение будет разбужено в этом случае?   -  person TruMan1    schedule 19.07.2016


Ответы (1)


CBConnectPeripheralOptionNotifyOnDisconnectionKey сообщает Core Bluetooth, что вы используете периферийное устройство в режиме события. То есть каждое событие обрабатывается iOS, и пользователю предоставляется уведомление, когда что-то происходит, но ваше приложение просыпается только в том случае, если уведомление пролистывается/нажимается пользователем. Это описано в документации этого перечисления:

Значением этого ключа является объект NSNumber. Этот ключ полезен для приложений, в которых не указан фоновый режим bluetooth-central и которые не могут отображать собственное оповещение. Если более одного приложения запросили уведомление для данного периферийного устройства, предупреждение получает то, которое последним было на переднем плане. Если ключ не указан, по умолчанию используется значение NO.

Вместо этого вам нужен режим подключения. Укажите фоновый режим bluetooth-central в plist вашего приложения и соответствующим образом реализуйте свою бизнес-логику. Кроме того, вам также следует рассмотреть возможность реализации функций восстановления. Все это довольно хорошо задокументировано в вопросах здесь по SO и в n /apple_ref/doc/uid/TP40013257-CH7-SW1" rel="nofollow">Основное руководство по программированию Bluetooth.

person allprog    schedule 09.05.2014
comment
К сожалению, я тоже всеми ими пользуюсь. Флаг info.plist и функции восстановления. - person WrightsCS; 09.05.2014
comment
Затем ваше приложение должно проснуться. Приложение должно всегда поддерживать соединение. Так же, как и вы: после разъединения немедленно выполнить реконнект. Что еще вы видите? Если приложение реагирует на включение/выключение BT, то оно не убивается, поэтому проблема будет либо в баге CB, либо в вашем коде. Нам нужно больше информации для лучшего анализа. - person allprog; 09.05.2014
comment
Я просмотрю и посмотрю, что еще будет актуально, и обновлю вопрос, спасибо - person WrightsCS; 09.05.2014