Обнаружение маяков через iBeacon Monitoring & Ranging vs CoreBluetooth scanForPeripheralsWithServices
Существует много путаницы в отношении ограничений, применяемых iOS для приложений, которые хотят сканировать BACK-маяки\периферийные устройства.
После прочтения нескольких блогов и ответов на переполнение стека, я хочу узнать, правильно ли я понял все проблемы. Пожалуйста, поправьте меня, если есть что-то, что я неправильно понял или пропустил. Я отношусь только к iOS 7 и выше и сосредоточен на обнаружении, а не на подключении (можете ли вы подключиться к CLBeacon с помощью iBeacon Monitoring and Ranging API?).
Параметры для маяков понятны. Используйте периферийные устройства BLE общего назначения или используйте периферийное устройство BLE, которое рекламируется в формате iBeacon (также нестандартное периферийное устройство может рекламировать в формате iBeacon в adv-пакете и в другом формате в пакете scan-response).
Общие ограничения
- iBeacon Ranging сообщит вам, какие маяки вокруг вас. Вы должны указать ProximityUUID, что маяки рекламируют заранее (нет "общего" сканирования).
didRangeBeacons
будет вызываться каждую секунду с массивом объектов CLBeacon, которые были найдены недавно. Расстояние от маяка и его точность вычисляются iOS с использованием некоторого конфиденциального алгоритма, который действительно знают разработчики Apple (алгоритм основан на значениях rssi и байтах калибровки rssi-1-meter, которые рекламируют маяк). Вы также можете использовать iBeacon Monitoring для вызова делегата каждый раз, когда вы входите или выходите из региона - снова вы должны указать запрашиваемый ProximityUUID (вы также можете указать основной и второстепенный). "Выход из региона" определяется некоторым временем не получения рекламы и, следовательно, не может быть немедленным. Количество регионов, которые могут варьироваться\контролироваться одновременно для каждого устройства, ограничено 20. Это означает, что если другие приложения одновременно контролируют\диапазон, ваше приложение, возможно, не сможет контролировать\диапазон (правильно?).
- CoreBluetooth - вы также можете обнаружить другие рекламные структуры в рекламе маяковых радиостанций. Если маяк также рекламирует формат iBeacon, вы не можете видеть поля iBeacon (ProximityUUID, major, minor...), несмотря на то, что они отправляются по стандартной рекламной структуре "Производитель", которую вы можете видеть в других случаях,
Запуск в Foreground - менее ограниченный прецедент:
- iBeacon Ranging and Monitoring - никаких дополнительных ограничений.
- CoreBluetooth - передача
nil
в serviceUUIDs
of scanForPeripheralsWithServices
будет проверять все периферийные устройства. Передача CBCentralManagerScanOptionAllowDuplicatesKey
в качестве YES
в параметрах приведет к тому, что didDiscoverPeripheral
будет вызываться несколько раз для одного и того же периферийного \beacon (я предполагаю, что использование таймера, которое вы обнаружили, не было получено в течение некоторого времени, и предположить, что пользователь вышел из "региона" ).
Работа в фоновом режиме. Более ограниченный прецедент:
- iBeacon Ranging не будет работать напрямую. iBeacon Monitoring вызовет
didEnterRegion
и даст время выполнения приложения 6 секунд - в котором вы можете запустить Ranging (например, для обнаружения основных и второстепенных). Обнаружение может быть не сразу, так как iOS включает и выключает сканирование, чтобы сохранить заряд батареи. Если вы введете область с несколькими маяками с одним и тем же ProximityUUID, и вы будете контролировать этот UUID без специального основного и/или второстепенного, didEnterRegion
будет вызываться, когда вы начнете получать сигнал с первого маяка, однако, если вы не сделали этого, выйдите из области первого маяка, и вы также войдете в область второго маяка, приложение не будет разбужено снова (didEnterRegion
больше не будет вызываться), поэтому вы не можете начать мигать, чтобы обнаружить второго маяка и майора. Приложение не может просто выходить на передний план, но может создавать локальные уведомления и другие фоновые операции.
- CoreBluetooth - согласно Основная фоновая обработка Bluetooth
scanForPeripheralsWithServices
может работать в фоновом режиме, но вы должны указать хотя бы один serviceUUID. didDiscoverPeripheral
будет предоставлено время работы 10 секунд. Использование CBCentralManagerScanOptionAllowDuplicatesKey
не будет работать - didDiscoverPeripheral
будет вызываться один раз для каждого периферийного устройства. Поэтому вы не можете обнаружить "выход" из региона и "повторный вход". Я полагаю, вы можете использовать нестандартное периферийное устройство BLE, которое меняет свой MAC-адрес для преодоления этой проблемы. Приложение не может просто выходить на передний план, но может создавать локальные уведомления и другие фоновые операции. Обнаружение может быть не сразу, так как iOS включает и выключает сканирование, чтобы сохранить заряд батареи.
Запуск после того, как приложение было убито
- iBeacon Monitoring - работает! Даже если пользователь убил приложение или устройство было перезапущено.
- CoreBluetooth - приложение будет разбужено, если оно было убито iOS (из-за неактивности или ограничений памяти). Однако, если пользователь явно убил приложение, он не проснется (что делает первый случай трудным для тестирования). Я не знаю, что произойдет после перезагрузки устройства...
У кого-нибудь есть больше опыта с этими ограничениями? Может ли scanForPeripheralsWithServices
использоваться в качестве лучшей альтернативы iBeacon Monitoring в некоторых случаях использования?
Спасибо!
Ответы
Ответ 1
В основном вы правы с вашим описанием. Всего два пояснения:
-
Ограничение в 20 регионах не для каждого устройства, оно зависит от приложения. Независимо от того, что другие приложения делают на мобильном устройстве, вашему приложению по-прежнему разрешено контролировать до 20 регионов iOS. Тем не менее, существуют определенные аппаратные ограничения, специфичные для устройства, о том, сколько регионов можно контролировать в фоновом режиме с помощью аппаратной поддержки. Эти ограничения недокументированы. Если вы превысите эти недокументированные лимиты, вероятно, потребуется намного больше времени для обнаружения маяков в фоновом режиме. (Несмотря на это, нет гарантии ОС, когда приходят обнаружения).
-
Вы не можете подключиться к CLBeacon
с помощью API мониторинга и ранжирования. Эти API-интерфейсы работают только с рекламными пакетами BLE, которые без установления соединения.
Да, в качестве альтернативы можно использовать scanForPeripheralsWithServices
. Это то, что делают маячки в кармане, чтобы внедрить проприетарную систему. Однако существуют реальные недостатки в отношении времени обнаружения и надежности фона.