Клиент приходит с задачей объединить балансы с Binance, MetaMask и Bybit в одном экране. Типичная проблема: данные разрозненны, форматы различаются, ручной ввод занимает часы. Мы берем на себя агрегацию портфеля — сбор данных из биржевых API, on-chain кошельков и ручного ввода с актуальными ценами. Наш опыт интеграции более 50 криптосервисов позволяет предвидеть нюансы и гарантировать корректную работу с первого запуска. За 5 лет работы мы выполнили более 15 проектов по трекингу криптопортфеля для мобильных приложений. Результат — полноценный трекинг портфеля криптоактивов, доступный в режиме реального времени.
В статье разберем техническую реализацию: откуда берутся данные, как кэшировать, обновлять в фоне и типичные ошибки. Используем Swift 5.9+ на iOS, Kotlin + Jetpack Compose на Android, Flutter или React Native для кросс-платформы. Все примеры кода — из реальных проектов. Это мобильное приложение для крипты, которое объединяет всю картину.
Как организовать трекинг криптопортфеля: сбор данных с бирж и кошельков
Три источника данных, каждый со своими особенностями. Мы обеспечиваем бесшовную интеграцию независимо от протокола. Для агрегации балансов бирж используем read-only API.
Биржевые API
Binance /api/v3/account возвращает балансы спот-кошелька, но требует HMAC-SHA256 подпись с timestamp и recvWindow (по умолчанию 5000 мс). Bybit V5 /v5/account/wallet-balance — аналогично. Мы храним ключи зашифрованными на устройстве (iOS Keychain, Android Keystore), приватные ключи никуда не передаются — только read-only API keys с IP-белым списком, если биржа поддерживает.
On-chain кошельки
Для Ethereum-кошельков используем Alchemy или Infura: /eth_getBalance плюс alchemy_getTokenBalances для ERC-20. Для Solana — getTokenAccountsByOwner через Helius или QuickNode. Адрес публичный, ключи не нужны — это самый безопасный канал. Один запрос к ноде возвращает баланс за 100–300 мс, а для 10+ токенов — до 2 секунд.
Ручной ввод
Часть активов (стейкинг, p2p, аппаратные кошельки) пользователи добавляют вручную. Простая форма: тикер + количество. Мы объединяем их с автоматическими источниками и показываем общую картину.
Актуальные цены — через CoinGecko API /simple/price (до 30 тикеров за запрос) или CoinMarketCap Pro API. CoinGecko бесплатный план ограничен 30 запросами/минуту — для приложения с фоновым обновлением хватает, если кэшировать цены с TTL 60 секунд.
Пример агрегации на Swift с параллельными запросами
// iOS, Swift — агрегация портфеля actor PortfolioAggregator { private let exchangeService: ExchangeService private let priceService: PriceService private let walletService: WalletService func aggregate() async throws -> Portfolio { async let exchangeBalances = exchangeService.fetchAll() async let onchainBalances = walletService.fetchAll() let (exchange, onchain) = try await (exchangeBalances, onchainBalances) let allTickers = (exchange + onchain).map(\.ticker) let prices = try await priceService.getPrices(tickers: allTickers) let positions = (exchange + onchain).map { balance in PortfolioPosition( ticker: balance.ticker, amount: balance.amount, priceUsd: prices[balance.ticker] ?? 0, source: balance.source ) } return Portfolio(positions: positions, updatedAt: .now) } } Использование async let позволяет запрашивать биржи и on-chain балансы параллельно — агрегация укладывается в 1–2 секунды вместо последовательных 4–5. Это в 2–3 раза быстрее, что критично для пользовательского опыта.
Как кэшировать данные и обновлять их в фоне
Балансы кэшируются локально — SQLite через drift (Flutter) или CoreData/SwiftData (iOS). Это важно для offline-режима: пользователь открывает приложение без сети и видит последние актуальные данные с меткой времени.
Фоновое обновление на iOS — через BGAppRefreshTask. Планируется при переходе в фон, система вызывает задачу раз в 15–30 минут. На Android — WorkManager с PeriodicWorkRequest(15, TimeUnit.MINUTES). Ниже сравнение подходов:
| Функция | iOS BGAppRefreshTask | Android WorkManager |
|---|---|---|
| Минимальный интервал | 15–30 мин (зависит от iOS) | 15 мин |
| Управление системой | iOS решает, когда запускать | Гарантированное выполнение в окне |
| Сложность реализации | Простая, одна задача | Гибкие цепочки и условия |
| Offline-поддержка | Приоритет на последние данные | Кэш + повтор при появлении сети |
Пошаговая настройка фонового обновления на iOS
- Добавьте capability Background Modes -> Background fetch.
- Зарегистрируйте задачу в AppDelegate:
BGTaskScheduler.shared.register(forTaskWithIdentifier: "refreshPortfolio", using: nil) { task in ... } - Запланируйте:
BGAppRefreshTaskRequest(identifier: "refreshPortfolio")с earliestBeginDate.
Обновление в реальном времени для цен — WebSocket. Binance предоставляет wss://stream.binance.com:9443/stream?streams=btcusdt@ticker/ethusdt@ticker. При открытом приложении подключаемся к стриму, при сворачивании — отключаемся и полагаемся на кэш.
Типичные проблемы при интеграции и их решения
Clock skew на биржевых запросах
Binance требует, чтобы timestamp в запросе отличался от серверного времени не более чем на recvWindow (по умолчанию 5000 мс). На Android-устройствах часы иногда уходят. Решение: перед первым запросом синхронизировать время через /api/v3/time и применять offset.
Rate limits при множестве бирж
Если пользователь добавил 5 бирж, одновременные запросы могут исчерпать лимиты. Нужна очередь с контролем частоты: один exchange — один слот в очереди, задержка 200 мс между запросами к одному endpoint.
Разные форматы тикеров
Binance возвращает BTC, Bybit — BTC, CoinGecko принимает bitcoin (id), не символ. Нужна таблица маппинга тикер → CoinGecko id, которую периодически синхронизируем через /coins/list.
Что входит в нашу работу
- Интеграция Binance / Bybit / OKX API с HMAC-SHA256 подписью
- Загрузка on-chain балансов (EVM через Alchemy, Solana опционально)
- Кэширование в локальной БД с offline-поддержкой
- Фоновое обновление (BGAppRefreshTask / WorkManager)
- Дашборд: общая стоимость, 24h change, pie chart по активам
- Хранение API-ключей в Keychain / Keystore
Сроки
| Объем работ | Время |
|---|---|
| 2 биржи + on-chain + дашборд | 5–8 рабочих дней |
| Каждая дополнительная биржа | +1–2 дня |
| Добавление on-chain Solana | +2 дня |
Стоимость рассчитывается индивидуально после анализа требований. Для обсуждения вашего проекта свяжитесь с нами — мы подберем оптимальное решение. Получите консультацию по вашему проекту уже сегодня.







