Пробуждение 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]}];
}

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

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

1 ответ

Решение

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

Значением этого ключа является объект NSNumber. Эта клавиша полезна для приложений, которые не указали центральный режим Bluetooth и не могут отображать свое собственное предупреждение. Если более чем одно приложение запросило уведомление для данного периферийного устройства, последнее, которое было на переднем плане, получило предупреждение. Если ключ не указан, значением по умолчанию является НЕТ.

Вместо этого вы хотите режим подключения. Укажите bluetooth-central фоновый режим в списке приложений и соответственно реализуйте свою бизнес-логику. Кроме того, вы должны рассмотреть возможность реализации функций восстановления. Все это довольно хорошо задокументировано в вопросах здесь о SO и в Руководстве по программированию n Core Bluetooth.

Другие вопросы по тегам