IOS Developpement: фоновое сканирование BLE

В настоящее время я пытаюсь разработать приложение, связанное с фоновым Bluetooth, и у меня возникают проблемы при сканировании в фоновом режиме.

Я прошел весь учебник Apple IOS Bluetooth Background, но не могу понять, почему сканирование не работает в фоновом режиме (мой info.plist правильно настроен для управления фоновыми задачами BLE, как центральными, так и периферийными).

Что я тестировал до сих пор:

1 - Когда мои два устройства находятся в зоне действия и на переднем плане, сканирование работает хорошо.

2 - Когда периферийное устройство находится в фоновом режиме, а центральное становится активным на переднем плане, сканирование также работает, периферийное устройство хорошо обнаружено.

Здесь прибывает неприятности

3 - сначала я запускаю периферийное устройство и помещаю приложение в фоновый режим. Затем на периферийном устройстве я выключаю Bluetooth, запускаю приложение, помещаю его в фоновый режим и включаю Bluetooth. В моем коде -(void)centralManagerDidUpdateState:(CBCentralManager *)central вызывает сканирование [centralmgr scanForPeripheralsWithServices:[NSArray arrayWithObject:servicesUUID] options:scanOptions];, функция, которая отлично работает на переднем плане. Но ничего не произошло, периферия никогда не обнаруживается центральным.

4 - запускаю центральный, активирован bluetooth, и ставлю его в фоновом режиме. Затем я взял свое периферийное устройство, вышел из диапазона Bluetooth (в конкретном случае я пошел в свой супермаркет, чтобы купить пива, чтобы утопить мою печаль), я запускаю его там - также активирован Bluetooth - я поставил его в фоновом режиме, и я вернулся в непосредственной близости от моего периферийного устройства. Еще раз ничего не произошло, центральные не обнаружили периферийные устройства.

Кроме того, после случаев 3 и 4, если я просто поставлю центральную часть на передний план (периферийное устройство остается на заднем плане), обнаружение перезапускается, не делая ничего другого. Как будто сканирование было успешно запущено в случае 4, но ожидание, когда приложение станет активным, чтобы фактически начать обнаруживать другие устройства.

У кого-нибудь есть идеи о том, как продолжить / преодолеть проблему?

Спасибо!

Ps: я извиняюсь за мой английский, я немного ржавый

1 ответ

Привет для деталей вы можете увидеть этот ответ

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

Причина: для вас центральное сканирование только с предоставлением сервисных UUID периферийного устройства.

и на заднем плане периферийное устройство не может рекламировать свои UUID, поэтому, даже находясь там, они просто не знают о присутствии друг друга

Кроме того, некоторые более заметные вещи о фоновом сканировании

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

CBAdvertisementDataLocalNameKey Рекламный ключ игнорируется, а локальное имя периферийного устройства не рекламируется.

Все UUID службы, содержащиеся в значении CBAdvertisementDataServiceUUIDsKey рекламные ключи размещаются в специальной области "переполнения"; они могут быть обнаружены только устройством iOS, которое явно сканирует их.

Если все приложения, размещающие рекламу, находятся в фоновом режиме, частота, с которой ваше периферийное устройство отправляет рекламные пакеты, может уменьшиться.

Посмотреть Apple Docs

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