Реалізація поиску припаркованого автомобіля через мобільний додаток
Користувач припаркувався в торговому центрі, вийшов через годину — не пам'ятає, де машина. Це проста задача, яка вирішується збереженням GPS-координати в момент парковки. Але наївна реалізація дає погрішність 10–20 метрів усередину паркингу або в щільній міській забудові — користувач все одно бродить.
Як коректно визначити момент парковки
Найнадійніший тригер — відключення від Bluetooth автомобіля. Коли користувач глушить машину та уходить, телефон втрачає Bluetooth-з'єднання (CarPlay, Android Auto або просто аудіосистема). Це подія — чіткий сигнал «машина припаркована тут».
На iOS: CoreBluetooth + CBCentralManagerDelegate.centralManager(_:didDisconnectPeripheral:error:). При розриві — зберігаємо останню відому координату з CLLocationManager. Проблема: фіксується розрив по конкретному CBPeripheral.identifier, який потрібно заздалегідь прив'язати до автомобіля користувача.
На Android: BluetoothAdapter.ACTION_ACL_DISCONNECTED broadcast + фільтрація по імені/адресу пристрою. Працює в background через BroadcastReceiver.
Альтернатива — алгоритм на основі активності: Google Activity Recognition API (DetectedActivity) визначає, коли користувач переходить з IN_VEHICLE в ON_FOOT. У цей момент — зберігаємо координату. Не потребує Bluetooth, але спрацьовує з затримкою ~30–60 секунд.
На iOS аналог: CMMotionActivityManager — визначає смену режиму активності через акселерометр/барометр.
Збереження та відображення мітки
Координата зберігається локально — UserDefaults/SharedPreferences для простого випадку, або Core Data/Room якщо потрібна історія парковок. Мітка на карті — кастомний MKAnnotationView / Marker з іконкою автомобіля.
Точність GPS у місті погіршується від відображень (urban canyon effect). Усередняємо 3–5 останніх точок перед збереженням замість однієї — знижує випадкові викиди. CLLocation.horizontalAccuracy > 50 метрів — не зберігаємо, чекаємо кращої точності.
Усередину багатоповерхового паркингу GPS часто зовсім не працює. У цьому випадку фіксуємо останню точку перед в'їздом в підземний паркінг (GPS ще працював) + номер це тажу/рівня введений вручну.
Навігація до машини
Напрямок та відстань до збереженої точки — компас з CLHeading (iOS) або SensorManager.SENSOR_DELAY_UI + TYPE_ROTATION_VECTOR (Android). Стрілка повертається по мірі руху користувача.
Для навігації «відкрити в картах» — deep link у Google Maps / Apple Maps з координатами паркинку як destination. Пішохідний маршрут будується в нативному додатку карт, не у нашому.
AR-режим пошуку — накладення стрілки через камеру з відстанню. ARKit (iOS) або ARCore (Android). Виглядає ефектно, практично корисно в складних паркінгах. Додає 3–4 дні розробки поверх базової реалізації.
Історія парковок та заметки
Якщо потрібна історія («де я припарковувався у цього офісу звичайно») — Core Data / Room з таблицею parked_locations: координата, адреса (reverse geocoding через CLGeocoder / Geocoder), timestamp, опціональна заметка користувача («3й етаж, секція B»).
Список останніх міст — TableView / RecyclerView з ячейками: адреса, дата, мініатюра карти через MKMapSnapshotter (iOS) або статична карта Google Maps Static API (Android). Тап по записі — відкриває маршрут до цього місця. Корисно для повторюваних поїздок.
Ліміт зберігання — останні 20–50 міст, старі видаляються автоматично. Хмарна синхронізація (iCloud через NSUbiquitousKeyValueStore або Firebase Firestore) — якщо користувач змінює пристрої.
Графік
Базова реалізація (збереження по Bluetooth-событією + відображення на карті + компас): 4–8 годин. З AR-режимом, історією парковок та розумним визначенням через Activity Recognition: 1–2 робочих дні. Вартість розраховується індивідуально.







