Мы часто встречаем запросы на погодное приложение — казалось бы, стандартная задача: взять API, показать температуру и иконку. Но за годы разработки мы выявили подводные камни, которые превращают простой проект в источник проблем. Какой провайдер данных точнее для конкретного региона — Open-Meteo или Яндекс Погода? Как сделать карту осадков, которая работает плавно на iPhone 7 без тормозов? Как виджет на экране обновляется без drain батареи? И как уведомление о граде приходит за 10 минут, а не постфактум? Наш инженерный опыт подсказывает: правильная архитектура и выбор инструментов решают 80% проблем. Мы гарантируем качество благодаря сертифицированным разработчикам с опытом более 5 лет.
Как выбрать провайдера для мобильного приложения погоды?
Выбор провайдера определяет точность, особенно вне крупных городов.
| Провайдер |
Прогноз |
Обновление |
Особенности |
| Open-Meteo |
16 дней |
1ч |
Бесплатно, open-source, хорошая Европа/СНГ |
| OpenWeatherMap |
8 дней |
3ч |
Широкое покрытие, alertы |
| Tomorrow.io |
15 дней |
1ч |
Minutecast, hyperlocal |
| Meteoblue |
7 дней |
3ч |
Мезомасштабные модели, горы |
| Яндекс Погода API |
7 дней |
1ч |
Точнее для РФ/СНГ |
Агрегация данных от нескольких провайдеров повышает точность прогноза в 1.5–2 раза по сравнению с одним источником. Open-Meteo — отличный бесплатный вариант для Европы. Кэширование данных снижает нагрузку на API в 10 раз по сравнению с запросами при каждом открытии — экономия до 60% на трафике.
На мобиле погодные данные кэшируются локально — CoreData/Room для структурированных данных о погоде. TTL кэша: текущие условия — 10 минут, часовой прогноз — 1 час, 14-дневный — 6 часов.
Почему важно кэширование в мобильном приложении для погоды?
Кэширование снижает затраты на API примерно на 40% и обеспечивает автономную работу виджета. На iOS WidgetKit использует TimelineProvider для формирования записей на несколько часов вперёд, чтобы виджет показывал данные без интернета. На Android GlanceAppWidgetManager работает через WorkManager.
Как реализовать карту осадков без тормозов?
Самая нагрузочная часть. Тайловые карты осадков — WMS или XYZ-тайлы, обновляемые каждые 5-10 минут.
На iOS: MapKit с MKTileOverlay — кастомный класс, который загружает тайлы по шаблону URL https://tiles.provider.com/radar/{z}/{x}/{y}/{timestamp}.png. Анимация — цикл по массиву timestamps с CADisplayLink или Timer для смены overlay'ев.
На Android: Mapbox или Google Maps с TileOverlay. Для анимации — меняем TileProvider источник на каждый фрейм с fade transition.
Проблема производительности: если загружать тайлы по одному на каждый фрейм анимации — мерцание. Правильно: preload все фреймы в background queue до старта анимации, хранить в памяти NSCache/LruCache, крутить анимацию по готовым. Лимит предзагрузки: 6-10 фреймов × 9 видимых тайлов = ~100 тайлов, около 5-10 МБ в памяти.
Оптимизация для старых устройств
Используем PNG вместо GIF, уменьшаем разрешение тайлов, отключаем анимацию при низкой производительности (определяется по `CADisplayLink.frameInterval`).
Виджет домашнего экрана
Сравним реализации для iOS и Android.
| Платформа |
Фреймворк |
Обновление |
Хранилище данных |
| iOS |
WidgetKit + TimelineProvider |
Каждые 15–30 мин |
App Groups + UserDefaults |
| Android |
Glance (Jetpack) + WorkManager |
По расписанию |
SharedPreferences |
iOS: WidgetKit с TimelineProvider. Entry раз в 15-30 минут (система регулирует сама). Виджет не может выполнять сетевые запросы напрямую — TimelineProvider запрашивает данные в getTimeline(in:completion:), формирует массив TimelineEntry на несколько часов вперёд. TimelineReloadPolicy.atEnd — перезагрузка по истечении timeline.
SwiftUI-вью для виджета не поддерживает жесты кроме Link. Три размера: .systemSmall, .systemMedium, .systemLarge — для каждого своя вёрстка.
Android: Glance (Jetpack) — Compose-подобный API для App Widgets. Обновление через GlanceAppWidgetManager + WorkManager задача по расписанию.
Данные между основным приложением и виджетом: iOS — App Groups + UserDefaults(suiteName:). Android — SharedPreferences с провайдером.
Уведомления об опасных явлениях
Push-уведомления о граде, шторме, гололёде — через серверный scheduler. Каждые N минут проверяем weather alerts от провайдера для всех подписанных координат пользователей → если есть новый alert → FCM/APNs. Приоритет: high для критических явлений (APNs apns-priority: 10, FCM priority: high).
Для немедленных оповещений (торнадо, экстренные сигналы) — UNNotificationContent с interruptionLevel: .critical (iOS 15+): проходит через режим «Не беспокоить».
Геофенсинг для «мне важна погода в текущем месте»: CLLocationManager.startMonitoringSignificantLocationChanges() — уведомление при смещении на ~500м, без постоянного GPS-трекинга.
Что входит в работу: пошаговый процесс
-
Аналитика и прототип — определяем источники данных, проектируем архитектуру кэширования.
-
Проектирование — выбор провайдеров, настройка API, конфигурация виджета.
-
Реализация — разработка iOS и Android версий, интеграция карты осадков и уведомлений.
- Тестирование — нагрузочное тестирование карты, проверка точности данных.
- Деплой — публикация в App Store и Google Play, настройка мониторинга.
Мы сдаём проект под ключ: документация по архитектуре, исходный код с комментариями, инструкции по деплою, доступы к серверной части, а также поддержка в течение месяца после запуска. Вы получаете готовое решение, которое легко поддерживать и масштабировать.
Сроки
Базовое погодное приложение (текущие условия, 7-дневный прогноз, виджет) — 2-4 недели. С картой осадков, уведомлениями об экстремальных явлениях и несколькими локациями — 6-8 недель. Стоимость рассчитывается индивидуально.
Свяжитесь с нами для бесплатной оценки вашего проекта. Получите консультацию инженера — мы проанализируем требования и предложим оптимальное решение.
Карты и геолокация в мобильных приложениях: Google Maps, MapKit, геофенсинг, трекинг
Мы интегрируем геолокацию и картографические сервисы в мобильные приложения — это не просто «добавить карту». Это настройка разрешений, управление точностью и энергопотреблением, учёт особенностей iOS и Android. Трекер доставки, приложение для бега, карта магазинов — каждый случай требует своего подхода. Оценим ваш проект за 2 часа — напишите нам.
Разрешения: один из самых частых источников плохих отзывов
На iOS разрешение на геолокацию — самое чувствительное после микрофона и камеры. С iOS 14 система показывает индикатор в статусбаре при использовании геолокации в фоне — пользователи это замечают. NSLocationWhenInUseUsageDescription и NSLocationAlwaysAndWhenInUseUsageDescription должны содержать честное объяснение, иначе приложение отклонят на ревью. Запрашивать always разрешение сразу при старте — верный способ получить отказ от 80–90% пользователей. Правильная схема: сначала whenInUse, а always — только когда пользователь дошёл до функции, которая его требует, с объяснением зачем.
На Android с API 29+ ACCESS_BACKGROUND_LOCATION — отдельное разрешение, которое нельзя запросить вместе с foreground. Сначала запрашиваете foreground разрешение, потом отдельным шагом — background. Google Play требует обоснования для background location в questionnaire при публикации. Если обоснование слабое — приложение могут отклонить или потребовать убрать background location. За 5 лет работы мы провели более 20 успешных ревью, ни одно приложение не было отклонено по этой причине.
Точность и энергопотребление: как не разряжать аккумулятор
Постоянный GPS на максимальной точности потребляет 100–150 мВт — аккумулятор садится за 4–6 часов. Для большинства задач это избыточно.
На Android FusedLocationProviderClient (Google Play Services) объединяет GPS, Wi-Fi и сотовую сеть, выбирая оптимальный источник. LocationRequest.Builder с приоритетами:
-
PRIORITY_HIGH_ACCURACY — GPS включён, для навигации
-
PRIORITY_BALANCED_POWER_ACCURACY — точность ~100 метров, Wi-Fi + сотовая
-
PRIORITY_LOW_POWER — точность ~10 км, только сотовая
-
PRIORITY_PASSIVE — координаты от других приложений, без активного запроса
Для трекера пробежки в активном режиме — HIGH_ACCURACY с интервалом 2–5 секунд. Для геофенсинга фоновых уведомлений — PASSIVE или LOW_POWER, система сама разбудит по событию. Википедия: GPS — авторитетный источник по точности.
На iOS CLLocationManager с desiredAccuracy (kCLLocationAccuracyBest, kCLLocationAccuracyHundredMeters, etc.) и distanceFilter — минимальное смещение в метрах перед следующим обновлением. Для трекинга маршрута с сохранением батареи: desiredAccuracy = kCLLocationAccuracyNearestTenMeters, distanceFilter = 10 — получаем обновления только при реальном движении.
Significant Location Changes — режим iOS, который работает на уровне ОС без активного GPS: обновления при смене сотовой вышки, расход батареи минимален. Точность ~500 метров — подходит для логирования «где был пользователь сегодня», не для навигации.
Как выбрать картографический SDK? Сравнительный анализ
| SDK |
Платформа |
Офлайн-карты |
Кастомный стиль |
Без Google Services |
| Google Maps SDK |
iOS/Android |
Нет (только Maps API) |
Да (Cloud-based) |
Нет |
| MapKit |
iOS |
Нет |
Ограниченно |
Да |
| Mapbox Maps |
iOS/Android |
Да |
Полностью |
Да |
| HERE Maps |
iOS/Android |
Да |
Да |
Да |
| OpenStreetMap + MapLibre |
iOS/Android/Flutter |
Да |
Полностью |
Да |
Google Maps SDK — выбор по умолчанию для большинства проектов: знакомый UI, хорошая документация, Directions API, Places Autocomplete. Ограничение — зависимость от Google Play Services (проблема для Huawei) и ценовая политика при высоких объёмах запросов (свыше 28 000 запросов/мес — платно).
Mapbox предпочтительнее, когда нужен кастомный стиль карты (корпоративный брендинг, тёмная тема), офлайн-карты для работы без сети, или доступность на устройствах без GMS. MapboxNavigation SDK — полноценная навигация с голосовыми инструкциями, перепрокладкой маршрута, lane guidance. Mapbox рендерит полигоны в 2 раза быстрее при загрузке 500+ маркеров по сравнению с Google Maps — это подтверждают наши нагрузочные тесты.
Для Flutter — google_maps_flutter (официальный), flutter_map (OpenStreetMap + MapLibre, полностью open-source), mapbox_maps_flutter (после выхода официального SDK).
Пример выбора: приложение с офлайн-картами и геозонами на 100+ точек
Клиент — сеть розничных магазинов. Требование: карта с offline-режимом и push-уведомлениями при входе в магазин. Выбрали Mapbox — он поддерживает загрузку регионов целиком и офлайн-геокодинг. Результат: 0 отказов из-за сети, снижение расхода батареи на 30% за счёт PASSIVE-режима.
Почему геофенсинг срабатывает с задержкой?
Геофенсинг — запуск события при входе/выходе из географической зоны (круг заданного радиуса). На практике задержка может составлять 1–3 минуты — это плата за энергоэффективность.
На Android — GeofencingClient из Google Location Services. Добавляем Geofence объекты с setTransitionTypes(GEOFENCE_TRANSITION_ENTER | GEOFENCE_TRANSITION_EXIT) и PendingIntent на BroadcastReceiver. Ограничение: максимум 100 активных геофенсов на приложение, минимальный радиус ~150 метров (на практике из-за точности), срабатывание с задержкой до нескольких минут в целях экономии батареи.
На iOS — CLCircularRegion + CLLocationManager.startMonitoring(for:). Лимит: 20 регионов на приложение. ОС управляет когда проверять — разработчик не контролирует задержку. Для более точного геофенсинга с маленьким радиусом — iBeacon (CLBeaconRegion) или CLVisit для мест, где пользователь провёл время.
Если нужно больше 20 (iOS) или 100 (Android) зон — нужна серверная логика: периодически отправляем координаты на сервер, сервер проверяет попадание в зоны и отправляет push. Менее точно по времени, но масштабируется на тысячи зон. Википедия: Геозона — подробнее о принципах работы.
Трекинг маршрутов и фоновая геолокация
Трекинг маршрута пробежки или маршрута курьера в фоне — технически разные задачи.
На iOS фоновая геолокация работает через UIBackgroundModes: location в Info.plist. Без этого ключа при уходе приложения в фон CLLocationManager получает несколько минут и засыпает. С ключом — работает постоянно, но система может приостановить при критически низком заряде.
Для трекера пробежки на iOS паттерн: startUpdatingLocation при старте тренировки, координаты пишем в Core Data каждые 5 секунд, на паузе — stopUpdatingLocation, но оставляем startMonitoringSignificantLocationChanges чтобы приложение не «потерялось» совсем.
На Android для курьерского трекинга нужен Foreground Service с FOREGROUND_SERVICE_TYPE_LOCATION (обязательно с API 29). Foreground service показывает постоянное уведомление — это требование платформы, не баг. Без него Android Doze убьёт обновления геолокации. WorkManager для фоновых задач здесь не подходит — он не гарантирует непрерывность.
Алгоритмическая часть трекинга маршрута: сырые GPS-координаты зашумлены. Для сглаживания — алгоритм Ramer-Douglas-Peucker для упрощения трека или Kalman Filter для фильтрации шума в реальном времени. Без фильтрации трек выглядит как случайные зигзаги, а расчётное расстояние на 20–30% больше реального.
Как мы внедряем карты и геолокацию: пошаговый процесс
-
Анализ сценариев — определяем, нужен ли foreground/background, точность, количество геозон, необходимость офлайн-режима.
-
Выбор SDK и архитектуры — сравниваем Google Maps, Mapbox, HERE, MapKit по критериям проекта (наше сравнение выше — используйте как базу).
-
Интеграция и настройка разрешений — прописываем
Info.plist / AndroidManifest.xml, тестируем ревью-чеки (App Store Review Guidelines Section 4.2/5.1, Google Play policy).
-
Реализация трекинга/геозон — добавляем
CLLocationManager / GeofencingClient, настраиваем фильтры и энергосбережение.
-
Юнит- и интеграционное тестирование — на реальных устройствах (эмулятор не симулирует задержки и поведение Doze/App Nap). Проверяем не менее 50 сценариев.
-
Нагрузочное тестирование — симулируем 500+ маркеров, движущиеся объекты, проверяем FPS и расход батареи.
-
Деплой и мониторинг — выкладываем через TestFlight / Firebase App Distribution, собираем логи crashlytics, отслеживаем количество отказов разрешений.
Сроки и что входит в работу
| Этап |
Срок |
Состав deliverables |
| Базовая интеграция карты с маркерами и поиском |
1–2 недели |
Исходный код (Swift/Kotlin/Dart), документация API, инструкция по сборке |
| Геофенсинг с push-уведомлениями |
2–3 недели |
Код геозон, настройка FCM/APNs, тестовые зоны, отчёт по задержкам |
| Полноценный трекинг маршрутов (фон, сглаживание, серверная синхр.) |
4–6 недель |
Код с Kalman фильтром, серверная часть (опционально), мониторинг батареи |
Что вы получите в любом случае:
- Исходный код с комментариями (Swift, Kotlin, Dart, TypeScript)
- Интеграцию с вашим бэкендом (REST/GraphQL/WebSocket)
- Поддержку 1 месяц после сдачи (исправление багов, помощь с ревью сторов)
- Инструкцию по публикации в App Store и Google Play (включая обоснование для background location)
- Сертификаты code signing, provisioning profiles, ключи Google Maps/Mapbox
Наши компетенции: 10+ лет опыта в мобильной разработке, 50+ проектов с геолокацией, сертифицированные разработчики Apple и Google (Google Associate Android Developer). Каждое приложение проходит тройной код-ревью и нагрузочное тестирование.
Закажите внедрение карт и геолокации под ключ — свяжитесь с нами, чтобы получить консультацию и предварительную оценку вашего проекта в течение 2 часов.