Реализация поиска по адресу с подсказками в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация поиска по адресу с подсказками в мобильном приложении
Средний
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация поиска по адресу с подсказками в мобильном приложении

Поле ввода адреса с подсказками — один из самых конверсионных UI-элементов в приложениях доставки и логистики. Пользователь вводит «Тверск» и за 300 миллисекунд видит список вариантов. Технически за этим стоит выбор провайдера, дебаунс, кэширование сессий и правильная обработка выбора.

Провайдеры и когда что выбирать

Провайдер Сильные стороны Слабые стороны
Google Places Autocomplete API Лучшее покрытие глобально, POI, бизнесы Дорого при высоком трафике, слабее по корпусам в РФ
DaData Лучший по адресам России (ФИАС/КЛАДР) Только РФ
Nominatim (OpenStreetMap) Бесплатно, глобально Нет SLA, медленнее, хуже по качеству
HERE Geocoding Хорошо в Европе, есть офлайн-пакеты Дороже Google для малых объёмов
Yandex Geocoder Хорошо по СНГ Требует аккаунт, ограничения по условиям

Для большинства российских проектов — связка DaData + Google: DaData как первый приоритет, Google как fallback для зарубежных адресов.

Google Places SDK: правильная интеграция

На iOS — GooglePlaces pod. Используем GMSPlacesClient.findAutocompletePredictions(fromQuery:filter:sessionToken:callback:). Ключевой момент — GMSAutocompleteSessionToken: один токен на всю сессию поиска (от первого символа до выбора результата). Это снижает стоимость в 3-5 раз по сравнению с запросом без токена.

let token = GMSAutocompleteSessionToken()
let filter = GMSAutocompleteFilter()
filter.type = .address
filter.countries = ["RU", "BY", "KZ"]

placesClient.findAutocompletePredictions(
    fromQuery: query,
    filter: filter,
    sessionToken: token
) { results, error in
    guard let results else { return }
    self.suggestions = results.map { $0.attributedFullText.string }
}

После выбора адреса вызываем fetchPlace(fromPlaceID:placeFields:sessionToken:) для получения координат — и обнуляем токен. Без fetchPlace координаты не получить через автодополнение.

На Android — Places.initialize(context, apiKey) + PlacesClient. В Jetpack Compose:

val placesClient = Places.createClient(context)
val request = FindAutocompletePredictionsRequest.builder()
    .setQuery(query)
    .setSessionToken(AutocompleteSessionToken.newInstance())
    .setTypesFilter(listOf(PlaceTypes.ADDRESS))
    .setCountries("RU", "BY")
    .build()

placesClient.findAutocompletePredictions(request)
    .addOnSuccessListener { response ->
        _suggestions.value = response.autocompletePredictions
    }

Дебаунс и UX-детали

Без дебаунса каждое нажатие клавиши — отдельный API-запрос. При среднем вводе 4 символа в секунду это 4 запроса вместо одного.

На iOS через Combine:

searchTextField.textPublisher
    .debounce(for: .milliseconds(350), scheduler: DispatchQueue.main)
    .removeDuplicates()
    .sink { [weak self] query in
        guard query.count >= 3 else { return }
        self?.fetchSuggestions(for: query)
    }

На Android через StateFlow:

searchQuery
    .debounce(350)
    .filter { it.length >= 3 }
    .distinctUntilChanged()
    .flatMapLatest { fetchSuggestions(it) }
    .stateIn(viewModelScope, SharingStarted.Lazily, emptyList())

flatMapLatest отменяет предыдущий запрос при новом вводе — без этого старые результаты могут перекрыть актуальные.

Офлайн и кэш

Последние 10-20 выбранных адресов храним локально (UserDefaults / SharedPreferences) и показываем при пустом поле ввода. Это решает самый частый кейс: пользователь каждый раз заказывает домой.

Для истории поиска — Room / Core Data с колонками address_string, lat, lon, last_used_at. При вводе сначала ищем по локальной базе (LIKE-запрос), потом параллельно запрашиваем API — показываем сначала локальный результат, заменяем на API-результат при приходе.

Срок реализации: два-четыре дня — провайдер, UI-компонент, дебаунс, кэш истории, тестирование на граничных строках.