Віджети криптовалют для Home Screen: iOS (WidgetKit), Android (Glance)

Курс біткоїна змінюється щосекунди, а вам набридло відкривати застосунок, щоб стежити за ним? Ми розробляємо віджети криптовалют для Home Screen на iOS та Android, які завжди тримають актуальні котирування перед очима. Наша команда реалізує проєкт під ключ — від концепції до підтримки, забезпечуючи надійну роботу та своєчасне оновлення даних.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Віджети криптовалют для Home Screen: iOS (WidgetKit), Android (Glance)
Середній
~3-5 днів
Часті запитання

Трейдер хоче бачити курс біткоїна на головному екрані, не відкриваючи додаток. Але віджет криптовалюти — не просто гарна картинка: він має жити за правилами мобільної ОС. На iOS це WidgetKit + SwiftUI, на Android — Jetpack Glance або класичний AppWidgetProvider. Обидва працюють за принципом snapshot: система запитує актуальний UI в певні моменти, і те, що відобразиться — наша відповідальність. Спираємося на понад 30 реалізованих рішень для криптобірж та 5+ років досвіду мобільної розробки. Оптимізація бюджету проєкту починається з правильного вибору архітектури віджета.

Чому віджет на Home Screen складніший, ніж здається?

На перший погляд віджет здається простим UI-елементом. Але його обмеження щодо оновлення даних, особливо для криптовалют, потребують продуманої архітектури. Розберемо ключові проблеми та їх рішення — на власному досвіді.

Як WidgetKit обмежує оновлення?

WidgetKit не дозволяє віджету робити мережеві запити в реальному часі. Віджет отримує дані через TimelineProvider, який повертає масив TimelineEntry з заздалегідь підготовленими даними та часовими мітками. Система сама вирішує, коли перемалювати віджет.

Для криптовіджета типова стратегія — оновлення кожні 15–30 хвилин через TimelineReloadPolicy.atEnd або .after(date:):

struct CryptoPriceEntry: TimelineEntry {
    let date: Date
    let symbol: String
    let price: Decimal
    let change24h: Double
}

struct CryptoPriceProvider: TimelineProvider {
    func getTimeline(in context: Context, completion: @escaping (Timeline<CryptoPriceEntry>) -> Void) {
        Task {
            let price = try? await CryptoAPIClient.shared.fetchPrice(symbol: "BTC")
            let entry = CryptoPriceEntry(date: .now, symbol: "BTC", price: price?.usd ?? 0, change24h: price?.change24h ?? 0)
            let nextUpdate = Calendar.current.date(byAdding: .minute, value: 15, to: .now)!
            let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
            completion(timeline)
        }
    }
}
Детальніше про механізм TimelineProvider `TimelineProvider` — це протокол, який визначає три методи: `placeholder`, `getSnapshot` та `getTimeline`. `getTimeline` повертає масив записів, кожен з яких містить дату та дані. Система використовує ці записи для відображення віджета у відповідні моменти часу. Після відображення останнього запису віджет запитує новий timeline. Цей цикл дозволяє економити ресурси, але обмежує частоту оновлень.

Важливий нюанс: Apple регулює бюджет оновлень. Віджет з високою частотою оновлень на пристроях з низьким зарядом батареї отримує урізаний бюджет — оновлення починають приходити рідше, ніж запрошено. Для трейдингових додатків з вимогою «дані не старше 1 хвилини» віджет не підходить — потрібно чесно пояснити це клієнту до початку розробки. Ми завжди аналізуємо бізнес-вимоги та пропонуємо альтернативи, наприклад, push-сповіщення або Live Activity. Дотримання гайдлайнів допомагає уникнути відхилення в App Store та економить бюджет на доопрацювання.

Передача даних між основним додатком та віджетом — через App Groups + UserDefaults(suiteName:) або FileManager з shared container. @AppStorage всередині віджета працює тільки з App Group suite — без цього віджет не побачить дані, записані основним додатком.

Розміри та адаптація UI

WidgetKit підтримує 4 розміри: .systemSmall, .systemMedium, .systemLarge, .systemExtraLarge (тільки iPad). Для криптовіджета зазвичай робимо small (символ + ціна + зміна) та medium (кілька монет у рядок). SwiftUI у віджеті не підтримує анімації, ScrollView, натискання на довільні області — тільки Link для deep link.

Як Android вирішує ті самі завдання?

Jetpack Glance проти класичного AppWidgetProvider

Характеристика Jetpack Glance AppWidgetProvider
API Compose-подібний RemoteViews
Дата появи Відносно недавно З самого початку
Складність Нижча (декларативний) Вища (імперативний)
Обмеження Не всі Compose-модифікатори Повний контроль

Jetpack Glance — Compose-подібний API для віджетів, з'явився відносно недавно. Помітно зручніший за класичний RemoteViews, але має обмеження: підтримуються не всі Compose-модифікатори, а частина API працює інакше, ніж у звичайному Compose.

Оновлення даних через GlanceAppWidgetManager.updateIf + WorkManager з періодичним завданням:

class CryptoPriceWidget : GlanceAppWidget() {
    override suspend fun provideGlance(context: Context, id: GlanceId) {
        val prefs = currentState<Preferences>()
        val price = prefs[priceKey] ?: "—"
        val change = prefs[changeKey] ?: "0.0"
        provideContent {
            Column(
                modifier = GlanceModifier.fillMaxSize().background(Color.DarkGray).padding(12.dp)
            ) {
                Text("BTC", style = TextStyle(color = ColorProvider(Color.White), fontSize = 12.sp))
                Text(price, style = TextStyle(color = ColorProvider(Color.White), fontSize = 20.sp))
                Text("$change%", style = TextStyle(
                    color = ColorProvider(if (change.startsWith("-")) Color.Red else Color.Green)
                ))
            }
        }
    }
}

Мінімальний інтервал оновлення через AppWidgetManager — 30 хвилин (обмеження Android). Для частіших оновлень потрібен WorkManager з PeriodicWorkRequest, але на Android 12+ фонові завдання регулюються Battery Optimizer — в Doze mode інтервали розтягуються.

Порівняння механізмів оновлення iOS та Android

Параметр iOS WidgetKit Android Jetpack Glance
Мінімальний інтервал 15-30 хвилин (регулюється системою) 30 хвилин (WorkManager може більше)
Механізм оновлення TimelineProvider GlanceAppWidget + WorkManager
Обмеження Battery budget на рівні ОС Doze mode, Battery Optimizer
Рекомендація Для віджетів, що не потребують real-time Аналогічно

Як налаштувати WidgetKit для криптовіджета? (покроково)

  1. Додати Widget Extension target в Xcode, увімкнути WidgetKit.
  2. Створити структуру TimelineEntry з потрібними полями (ціна, зміна, дата).
  3. Реалізувати TimelineProvider: методи placeholder, getSnapshot, getTimeline.
  4. У getTimeline виконати запит до API, сформувати entry, вказати наступну дату оновлення.
  5. Створити SwiftUI View для віджета, використовуючи Widget та StaticConfiguration.
  6. Налаштувати App Groups для обміну даними з основним додатком.
  7. Підтримати кілька розмірів через supportedFamilies.

Типові помилки при розробці криптовіджетів

  • Ігнорування бюджетів оновлень на iOS — віджет перестає оновлюватися при низькому заряді.
  • Відсутність fallback UI при недоступності мережі — користувач бачить порожній віджет.
  • Використання неправильного suite для App Groups — дані не передаються.
  • Занадто часті оновлення на Android — конфлікт з Battery Optimizer.

Що входить у роботу

  • iOS: WidgetKit extension, TimelineProvider, SwiftUI-верстка, App Groups для shared data.
  • Android: Jetpack Glance widget, WorkManager для оновлень.
  • Інтеграція з API курсів (CoinGecko, Binance, CoinMarketCap або власний бекенд).
  • Підтримка кількох розмірів віджета.
  • Deep link з віджета в потрібний екран додатку.
  • Тестування поведінки при відсутності мережі та застарілих даних.
  • Гарантія на працездатність в App Store та Google Play (дотримання гайдлайнів).

Приклад робочого процесу (наш кейс)

На одному з проєктів — криптогаманець з портфелем — ми реалізували віджет для iOS. Запит клієнта: оновлення кожні 5 хвилин. Довелося використовувати комбінацію WidgetKit + background task для підтримки актуальності. На Android — Glance + WorkManager з політикою 15-хвилинного інтервалу. Підсумок: користувачі в 2 рази частіше повертаються в додаток з віджета.

Терміни

3–5 днів на кожну платформу. Якщо потрібні обидві — 5–8 днів сумарно з урахуванням спільної логіки отримання даних. Вартість розраховується індивідуально — напишіть нам, і ми оцінимо ваш проєкт за 1 робочий день. Якщо вам потрібен віджет для криптовалютного додатку, отримайте консультацію нашої команди.

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

Останні роботи

  • Розробка мобільного додатка для компанії FEEDME
    Розробка мобільного додатка для компанії FEEDME
    1010
  • Розробка мобільного додатку для компанії XOOMER
    Розробка мобільного додатку для компанії XOOMER
    903
  • Розробка мобільного додатку для компанії RHL
    Розробка мобільного додатку для компанії RHL
    1332
  • Розробка мобільного додатку для компанії ZIPPY
    Розробка мобільного додатку для компанії ZIPPY
    1180
  • Розробка мобільного додатку для компанії Affhome
    Розробка мобільного додатку для компанії Affhome
    1107
  • Розробка мобільного додатку для компанії FLAVORS
    Розробка мобільного додатку для компанії FLAVORS
    714