Подтвердить что ты не робот

Core Bluetooth рекламирует и сканирует в фоновом режиме

Я пытаюсь настроить приложение, чтобы устройство как сканировало периферийные устройства, так и рекламировало их как периферию. Цель состоит в том, чтобы два устройства были разбужены в фоновом режиме, когда они стали рядом друг с другом через обнаружение Bluetooth. Из документации Apple кажется, что вы должны иметь возможность запускать BLE в фоновом режиме (с включенными режимами bluetooth-central и bluetooth-периферийного фона), и мое приложение работает, когда одно устройство находится на переднем плане. Во-первых, я рекламирую данные следующим образом:

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral",
                              CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]};

// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData]; 

Затем я устанавливаю устройство для сканирования данных:

NSArray *services = @[[CBUUID UUIDWithString:identifier]];

[centralManager scanForPeripheralsWithServices:services options:nil];

Однако, когда оба идут в фоновое (устройство должно быть заблокировано), Bluetooth не может обнаружить и

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

никогда не вызывается на любом устройстве. Как я могу это исправить? Благодаря

4b9b3361

Ответ 1

Я боюсь, что вы пытаетесь это сделать не получится. Я пытался добиться того же.

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

Периферийные: Трансляция как периферия снова работает по-разному на переднем плане и на заднем плане. На переднем плане он работает, как и любая обычная периферийная периферия BT. В фоновом режиме у него очень ограниченное пространство для работы, поэтому ваш UUID периферийных устройств скрыт и не транслируется. Только когда центральное устройство (iPhone на переднем плане) запрашивает информацию из него, оно пробудит ваше приложение и покажет его UUID.

Итак, 2 отменяют друг друга. Поскольку фоновое сканирование может сканировать только устройства с определенным UUID, а ваше фоновое периферийное устройство не может рекламировать свой UUID, они не могут видеть друг друга.

1 ваших устройств (периферийных или центральных) должно работать на переднем плане.

Это несколько раз обсуждалось в списке писем Apple Bluetooth.

Ответ 2

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

1.) Сканирование отключается, когда устройства iOS находятся в фоновом режиме.

  • При сканировании на переднем плане, вероятно, сразу же обнаружит рекламу устройства рядом с ним, открытие в фоновом режиме может занять до ~ 60 раз дольше. Система iOS не делает предположений, что пользователь предпочел бы, чтобы одно приложение обладало лучшей функциональностью Bluetooth, чем другое (или только одно приложение хочет использовать его). И поскольку это общая функциональность, они хотят, чтобы пользователи имели единый опыт в приложениях. Вы должны проверить технические характеристики в отношении интервалов рекламы и сканирования, чтобы лучше понять, что Apple должна делать под обложками.

2.) Ваши устройства, возможно, уже обнаружили друг друга перед входом в фоновый режим.

  • Мы должны помнить, что Apple отключает флаг сканирования CBCentralManagerScanOptionAllowDuplicatesKey при вводе фона. Так как вы даже не указали этот флаг, по умолчанию он будет равно NO. Поэтому, если они даже видели друг друга один раз, вы не получите другого обратного вызова, когда они находятся в фоновом режиме.

Ответ 3

Мне лично нужна такая функция, и я разработал компонент с открытым исходным кодом: https://github.com/omergul123/Discovery

Может быть очень полезно, если вы хотите обменять ID, даже если одноранговые приложения работают в фоновом режиме.