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, которое явно сканирует их.
Если все приложения, размещающие рекламу, находятся в фоновом режиме, частота, с которой ваше периферийное устройство отправляет рекламные пакеты, может уменьшиться.