Я хочу подключиться к устройству BLE после того, как устройство выведено/завершено пользователем или системой/переустановлено в фоновом режиме.Повторное подключение BLE
Я знаю, что это возможно: - see this question with description
Вопрос - Как я могу настроить centralManager
для автоматического повторного подключения к периферийным в фоновом режиме, если приложение было прекращено? Может кто-нибудь описать шаг за шагом, как это можно сделать?
Несколько слов о текущей реализации:
Я создаю centralManager с опциями, как:
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{
CBCentralManagerOptionRestoreIdentifierKey: @"myCentralManagerIdentifier",
CBCentralManagerRestoredStatePeripheralsKey : @YES,
CBCentralManagerRestoredStateScanServicesKey : @YES,
CBCentralManagerRestoredStateScanOptionsKey : @YES
}];
После этого я начинаю сканировать BLE устройства
[self.centralManager scanForPeripheralsWithServices:[self discoverableCharacteristics] options:nil];
в - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
я подключиться к периферийному :
NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];
[self.centralManager stopScan];
peripheral.delegate = self;
[self.centralManager connectPeripheral:peripheral options: @{
CBConnectPeripheralOptionNotifyOnNotificationKey : @YES
}];
После этого я могу обнаружить сервисы и характеристики - все выглядит нормально. Когда я обнаружить, характеристика и чтение/запись данных я cancelPeripheralConnection
в didDisconnect я подключиться к устройству
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error
{
[central connectPeripheral:peripheral options:nil];
}
я также реализовать centralManager:willRestoreState:
как:
NSArray *peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey];
for (CBPeripheral *peripheral in peripherals) {
[central connectPeripheral:peripheral options:nil];
peripheral.delegate = nil;
}
В PLIST. добавлен требуемый ключ App communicates using CoreBluetooth
.
В настоящее время, если я подключен к устройству и завершаю его - он автоматически перезапускается и подключается к устройству - все в порядке, но если оно завершено снова - ничего не происходит.
Также, если я перешел из периферии и вернусь - ничего не произошло.
Update
относительно точки 5 - мое падение - следует использовать этот ключ с connectPeripheral
в WillRestoreState:
NSArray *peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey];
if (!peripherals.count) {
peripherals = [central retrievePeripheralsWithIdentifiers:[self discoverableCharacteristics]];
}
if (peripherals.count) {
for (CBPeripheral *peripheral in peripherals) {
[central connectPeripheral:peripheral options:@{
CBCentralManagerRestoredStatePeripheralsKey : @YES,
CBCentralManagerRestoredStateScanServicesKey : @YES,
CBCentralManagerRestoredStateScanOptionsKey : @YES
}];
}
} else {
[self startScanning];
}
Текущий результат - приложение будет возобновлен, если он не прокатывается из лоток. Я использую свой mac как периферийное устройство, поэтому несколько раз, когда я не запускаю приложение, которое выполняет роль периферийного центра, можно подключиться к Mac самому себе не к требуемому сервису.
Другим вопрос - это это хороший вариант, чтобы подключиться к периферийному времени потеряло соединение для поддержания связи, как:
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error
{
[central connectPeripheral:peripheral options:@{
CBCentralManagerRestoredStatePeripheralsKey : @YES,
CBCentralManagerRestoredStateScanServicesKey : @YES,
CBCentralManagerRestoredStateScanOptionsKey : @YES
}];
}
Также попробуйте изменить уведомит характеристику на периферийном и прочитать его на устройстве. Если все сделано на переднем плане - все работает отлично, но в случае, если соединение было выполнено в фоновом режиме несколько раз didUpdateValueForCharacteristic
не вызвано вообще, но didUpdateNotificationStateForCharacteristic
вызывается без ошибок - это означает (я думаю), что что-то было сделано неправильно с моей стороны.Может быть, вы можете посоветовать, где проблема может быть
И еще один вопрос - есть ли какие-то ограничения в написании данных по характеристикам? потому что в образце яблока он настроен на 20 байтов.
Большое спасибо за ваш ответ. Я обновляю свой код - в настоящее время он выглядит как работающий нормально, если я не удаляю форму приложения «стек приложений». Пожалуйста, см. Обновление в вопросе – gbk
Что касается номера 3 выше, действительно, к сожалению, в документации Core Bluetooth четко не указано «Эй, ваше приложение должно быть в списке MRU/приостановленных приложений », но он говорит такие вещи, как« система пробуждает его из приостановленного состояния, чтобы он мог обрабатывать события, связанные с Bluetooth », что, кажется, является их способом сказать вам, что , Во всяком случае, @Anton благодарит за ваш ответ. Я уверен, что это поможет многим другим, борющимся с этим аспектом разработки с iOS и BLE с Core Bluetooth! :) –
Спасибо Антон. Apple еще не обновила свои api? –