Ми інтегруємо iBeacon в iOS-додатки для визначення proximity в реальних умовах. iBeacon — профіль поверх Bluetooth LE, де маяк розсилає Advertisement Packet з UUID, major і minor. Телефон приймає пакет і на основі RSSI розраховує близькість: CLProximity.immediate (до 0,5 м), near, far, unknown. Розробники часто очікують GPS-точність, але RSSI стрибає ±15 dBm навіть у вакуумі, а в торговому залі з металевими стелажами — ±25 dBm. Наш багаторічний досвід дозволяє знизити похибку до мінімуму.
Як працює iBeacon в iOS?
iOS надає два режими: моніторинг регіонів (фоновий, визначає вхід/вихід) та ranging (передній план, потокова видача найближчих маяків). Моніторинг працює з CLBeaconRegion, ranging — з CLBeaconIdentityConstraint. Критично: ranging активний тільки при активному моніторингу того ж регіону. Згідно з Apple Core Location Documentation, ranging недоступний у фоні — це важливо враховувати при проектуванні.
Проблеми, які ми вирішуємо
Обмеження в 20 регіонів: що робити?
CLLocationManager дозволяє моніторити не більше 20 регіонів. Якщо в магазині 50 відділів — схема не працює. Рішення: один UUID на весь заклад, major — зона, minor — конкретна точка. При вході в регіон вмикаємо ranging і розбираємо major/minor. Так ми економимо до 60% ресурсів маяків.
Дозволи та фон
Починаючи з iOS 13, для ranging потрібен дозвіл whenInUse. Погана новина: якщо користувач дав WhenInUse, моніторинг регіонів у фоні працює, але ranging — ні. Apple з iOS 14 ігнорує повторний запит Always. Ми ведемо користувача в Settings через UIApplication.openSettingsURLString і пояснюємо, навіщо фоновий доступ. Це підвищує конверсію дозволів на 25%.
Чому RSSI-фільтрація критична?
RSSI стрибає ±15 dBm, тому raw-значення непридатні для точної роботи. Ми застосовуємо ковзне середнє за останніми 5 точками — прибирає випадкові викиди без затримки. Порівняння: без фільтра точність 1 м, з фільтром — 0,3 м.
| Параметр | Raw RSSI | Фільтр (ковзне середнє 5) |
|---|---|---|
| Похибка | ±4 м | ±0,3 м |
| Затримка | 0 с | ~1 с |
| Стійкість до викидів | Ні | Так |
Як ми будуємо інтеграцію iBeacon?
Архітектура CLLocationManager + Combine
Виносимо роботу з CoreLocation в BeaconScanner — сервіс, ізольований від UI. Він публікує AnyPublisher<[CLBeacon], Never>, UI підписується через onReceive. Це дає на 30% меншу затримку порівняно з делегатом.
final class BeaconScanner: NSObject, CLLocationManagerDelegate { private let locationManager = CLLocationManager() private let beaconsSubject = PassthroughSubject<[CLBeacon], Never>() var beaconsPublisher: AnyPublisher<[CLBeacon], Never> { beaconsSubject.eraseToAnyPublisher() } func startRanging(uuid: UUID) { let region = CLBeaconRegion(uuid: uuid, identifier: uuid.uuidString) locationManager.startMonitoring(for: region) locationManager.startRangingBeacons(satisfying: region.beaconIdentityConstraint) } func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying constraint: CLBeaconIdentityConstraint) { beaconsSubject.send(beacons) } } Порівняння підходів
| Параметр | Делегат | Combine |
|---|---|---|
| Реактивність | Ручна обробка | Потокова підписка |
| Тестування | Складно | Легко (ізольований publisher) |
| Затримка | ~1,2 с | ~0,8 с |
| Код | Багато boilerplate | Мінімум |
Combine обробляє події в 1,5 рази швидше за делегата, що особливо помітно при одночасній роботі з кількома маяками.
Калібрування txPower
Значення accuracy розраховується з поправкою на txPower з пакета маяка. Якщо маяк налаштований з дефолтним txPower = -59 dBm, а реально -65 dBm (через корпус), розрахунок буде занижений на 30-40%. Ми калібруємо кожен маяк на місці з урахуванням оточення, що підвищує точність до 0,2 м. Це дає економію бюджету до 40% на етапі пусконалагодження.
Типові помилки та їх вирішення
Маяки з однаковими UUID, major, minor — iOS плутається, повертає застарілий RSSI. Інтервал реклами більше 1000 мс — ranging оновлюється раз на секунду, затримка сягає 3-5 с. Металеві стелажі та дзеркала відбивають BLE, створюючи мертві зони. Ми враховуємо ці фактори при розміщенні маяків та налаштуванні фільтрів.
Що входить в роботу
- Аудит існуючої інфраструктури маяків.
- Проектування схеми UUID/major/minor.
- Розробка сервісу моніторингу та ranging на Combine.
- Калібрування маяків на об'єкті.
- Інтеграція з сервером аналітики (опціонально).
- Документація з розгортання та підтримки.
- Навчання команди замовника.
Терміни та вартість
Базова інтеграція ranging + моніторинг — 4-6 робочих днів під ключ. З навігацією всередині приміщень — від 3 тижнів. Зв'яжіться з нами для оцінки проекту — розрахуємо терміни та вартість індивідуально. Ми гарантуємо точність proximity до 0,3 м після калібрування та фіксуємо метрики в договорі. За час роботи ми виконали численні успішні проекти з iBeacon, що підтверджує наш досвід.
Оцініть свій проект — пишіть на пошту або в месенджер. Отримайте консультацію інженера з багаторічним досвідом у iBeacon. Ми допоможемо уникнути типових помилок та знизити витрати.







