Реалізація прямого геокодування (координати за адресою) у мобільному додатку
Коли користувач вводить адресу в поле доставки або реєстрації, а додатку потрібні координати — це прямое геокодування. Задача проста, поки не стикнешся з частковими вводами, опечатками, адресами без індексу і корпусами, які Google не знає.
Типові проблеми
CLGeocoder.geocodeAddressString(_:completionHandler:) на iOS приймає довільну строку і повертає массив CLPlacemark. Проблема — немає параметра регіону за замовчуванням: строка «Ленина 5» без міста повернеме placemark з Казахстану або взагалі nil. Обов'язково передавати CLRegion з центром і радіусом, що відповідає цільовому рынку.
На Android Geocoder.getFromLocationName(address, maxResults) до Android 13 виконується в основному потоці і легко вызивает NetworkOnMainThreadException, якщо забути винести в IO dispatcher або фоновий потік. Ще одна особливість: на еміляторе без Google Play Services повертає пустий список без помилки — баг, який ловять тільки при тестуванні на реальному пристрої.
Як реалізуємо
Для точності використовуємо Google Maps Geocoding API напрямо: maps.googleapis.com/maps/api/geocode/json?address=…®ion=ru&language=uk&key=…. Відповідь містить geometry.location з координатами і geometry.viewport — прямокутник, який зручно передавати в CameraUpdate.newLatLngBounds() для правильного зуму карти після переходу.
У кейсі з російськими адресами додаємо DaData як перший провайдер: їхній suggestions/api/4_1/rs/geocode/ краще справляється з корпусами, будівлями і промзонами. Якщо DaData повернув пустий результат — fallback на Google. Така двохрівнева схема покриває 98%+ адрес.
На Flutter — geocoding пакет для платформенного варіанту або прямий HTTP-клієнт (Dio) до Geocoding API. Результат кешуємо в Hive або sqlite з TTL 24 години: однакові адреси запитуються повторно рідко, але кеш економить квоту API-ключа.
Строк реалізації: один-два дні залежно від кількості провайдерів і вимог до офлайн-поведінки.







