Мобільний застосунок для моніторингу погоди
Погодні застосунки — обманливо проста задача. Взяти API, показати температуру та іконку. Але в прод з'являються питання: який провайдер даних точніше для конкретного регіону, як зробити карту осадків яка не гальмує на слабких пристроях, як віджет на екрані оновлюється без постійного drain батареї, та як сповіщення про град приходить за 10 хвилин а не постфактум.
Джерела погодних даних
Вибір провайдера визначає точність, особливо поза великими містами.
| Провайдер | Прогноз | Оновлення | Особливості |
|---|---|---|---|
| Open-Meteo | 16 днів | 1ч | Безплатно, open-source, добра Європа/СНГ |
| OpenWeatherMap | 8 днів | 3ч | Широке покриття, оповіщення |
| Tomorrow.io | 15 днів | 1ч | Minutecast, hyperlocal |
| Meteoblue | 7 днів | 3ч | Мезомасштабні моделі, гори |
| Яндекс Погода API | 7 днів | 1ч | Точніше для РФ/СНГ |
Для максимальної точності — агрегація кількох джерел з ваговим усередненням по історичним даним для конкретної точки. Для більшості проектів достатньо одного провайдера.
На мобілі погодні дані кешуються локально — CoreData/Room для структурованих даних про погоду. TTL кеша: поточні умови — 10 хвилин, погодинний прогноз — 1 годину, 14-денний — 6 годин.
Карта осадків
Найнагрузочніша частина. Тайлові карти осадків (radar tiles) — 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 МБ в пам'яті.
Віджет домашнього екрану
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-трекирования.
Терміни
Базовий погодний застосунок (поточні умови, 7-денний прогноз, віджет) — 2-4 тижні. З картою осадків, сповіщеннями про екстремальні явища та кількома локаціями — 6-8 тижнів. Вартість розраховується індивідуально.







