Разработка встроенного DApp-браузера в мобильном криптокошельке

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

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

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

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

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

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

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

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    860
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    747
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1163
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1036
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    970
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    564

Реализация встроенного DApp-браузера в мобильном криптокошельке

Встроенный DApp-браузер — один из сложнейших компонентов криптокошелька. Он загружает произвольные веб-приложения, внедряет провайдер window.ethereum, обрабатывает подписи транзакций и при этом не должен стать способом атаки на активы пользователя. Наш опыт в мобильной разработке и десятки успешно запущенных продуктов позволяют выполнить такую интеграцию под ключ с гарантией безопасности. Типичный кейс: пользователь открывает Uniswap в браузере кошелька, DApp проверяет наличие window.ethereum, вызывает eth_requestAccounts — и сразу видит список своих аккаунтов. Если инжекция провайдера выполнена неправильно, DApp либо не обнаружит кошелек, либо будет уязвим для фишинга. Пример из практики: в одном проекте мы обнаружили, что на Android провайдер инжектировался после загрузки страницы, и DApp не успевали зарегистрироваться, что приводило к ошибке "No Ethereum provider found". Решение — предзагрузка скрипта до onPageStarted.

Основа браузера — нативный WebView с инжекцией JavaScript-провайдера. На iOS это WKWebView, на Android — WebView с addJavascriptInterface. MetaMask, Trust Wallet и Coinbase Wallet реализуют этот паттерн одинаково. Провайдер window.ethereum должен реализовывать интерфейс EIP-1193: метод request(method, params) для всех RPC-запросов. DApp обращается к этому объекту, а нативный код обрабатывает запросы.

Архитектура и инжекция провайдера

Схема работы:

DApp (JS) → window.ethereum.request({method: 'eth_sendTransaction'})
  → постMessage в нативный слой
  → нативный код показывает диалог подтверждения
  → пользователь одобряет/отклоняет
  → ответ возвращается в JS через postMessage
  → Promise разрешается в DApp

Инжекция на iOS (WKWebView). Скрипт провайдера инжектируем через WKUserScript с injectionTime: .atDocumentStart. Критично — именно atDocumentStart, иначе DApp может проверить window.ethereum до инжекции и решить, что кошелька нет.

let providerScript = loadProviderJS() // Читаем из бандла
let userScript = WKUserScript(
    source: providerScript,
    injectionTime: .atDocumentStart,
    forMainFrameOnly: false
)
webView.configuration.userContentController.addUserScript(userScript)
webView.configuration.userContentController.add(self, name: "ethereum")

JS-провайдер отправляет сообщения через webkit.messageHandlers.ethereum.postMessage({...}). Нативный код получает в userContentController(_:didReceive:). Ответы передаём обратно через webView.evaluateJavaScript("window.ethereum._resolveResponse(\(id), \(result))").

Инжекция на Android.

webView.addJavascriptInterface(EthereumProvider(this), "AndroidEthereum")
webView.settings.javaScriptEnabled = true

На Android JS-интерфейс работает синхронно, что создаёт проблему: методы @JavascriptInterface не могут возвращать Promise. Обходим через callback-паттерн: JS вызывает AndroidEthereum.request(id, method, paramsJson), нативный код в итоге вызывает webView.evaluateJavascript("resolveCallback($id, $result)", null).

Важно: addJavascriptInterface потенциально опасен. Методы, аннотированные @JavascriptInterface, видны для всего JavaScript на странице, включая вредоносные iframe. Аннотируйте только необходимые методы и никогда не добавляйте интерфейс с широким API.

Сравнение платформ

Параметр iOS (WKWebView) Android (WebView)
Инжекция кода WKUserScript, инжект до загрузки addJavascriptInterface, гонка условий
Асинхронность через postMessage, native callback требуется callback-паттерн
Безопасность изоляция встроенная требуется дополнительная проверка
Скорость загрузки на 30–50% выше зависит от версии Chromium

Как обеспечить безопасность при инжекции провайдера?

Безопасность — главный приоритет. Основные меры:

  • Изоляция сессии. Каждая DApp должна иметь отдельный cookie-jar и localStorage. Не позволяйте DApp A читать данные DApp B. На iOS — отдельные WKWebViewConfiguration и WKWebsiteDataStore для каждой вкладки.
  • Фишинг-защита. Проверяем SSL-сертификат, показываем URL в адресной строке, которую пользователь не может скрыть, блокируем alert() и prompt() из JS. На iOS обрабатываем webView(_:runJavaScriptAlertPanelWithMessage:) и заменяем нативным UIAlertController.
  • eth_signTypedData_v4 (EIP-712). Это структурированные данные — DApp просит подписать типизированный объект. Нужно распарсить JSON schema и показать пользователю, что именно подписывается в человекочитаемом виде. Подписание вслепую — риск для пользователя.

Почему важно изолировать сессии DApp?

Изоляция предотвращает утечку данных между DApp. Если пренебречь этим, вредоносное DApp сможет прочитать сохранённые пароли или ключи другого DApp. На практике мы используем отдельные WKWebsiteDataStore для каждой вкладки на iOS и отдельные каталоги для WebView на Android.

Реализация window.ethereum провайдера

Минимальная реализация поддерживает методы EIP-1193:

// Инжектируемый провайдер (упрощённо)
window.ethereum = {
  isMetaMask: true, // многие DApp проверяют этот флаг
  chainId: '0x1',
  selectedAddress: null,

  request: async function({ method, params }) {
    return new Promise((resolve, reject) => {
      const id = generateId();
      pendingRequests[id] = { resolve, reject };
      webkit.messageHandlers.ethereum.postMessage({ id, method, params });
    });
  },

  on: function(event, handler) {
    // chainChanged, accountsChanged, connect, disconnect
    eventHandlers[event] = eventHandlers[event] || [];
    eventHandlers[event].push(handler);
  }
};

Обязательные методы: eth_requestAccounts, eth_accounts, eth_chainId, eth_sendTransaction, personal_sign, eth_signTypedData_v4, wallet_switchEthereumChain.

Multi-tab и производительность

Браузер с одной вкладкой — минимум. Реализуем:

  • Вкладки с изолированными данными
  • Историю просмотров (опционально, многие пользователи кошельков предпочитают конфиденциальность)
  • Закладки для часто используемых DApp
  • Список популярных DApp (curated) для onboarding

На iOS несколько WKWebView можно держать в памяти — они ленивые, пока не видимы. На Android WebView тяжёлый, для экономии памяти уничтожаем WebView неактивной вкладки и восстанавливаем URL при возврате.

Производительность WebView зависит от платформы. На устаревших Android-устройствах (WebView на базе Chromium 80) сложные DeFi DApp могут тормозить. Мониторим через WebViewClient.onPageStarted/onPageFinished, показываем прогресс-бар. Предзагрузка WebView при старте приложения сокращает cold-start время с ~800 мс до ~200 мс.

Что входит в работу

Этап Что получаете
Базовый WebView Навигация, адресная строка, прогресс-бар
Инжекция провайдера Поддержка EIP-1193 методов: requestAccounts, accounts, chainId, sendTransaction, personal_sign, signTypedData_v4
Диалог транзакции Читаемое отображение, подписание, отправка через RPC
Multi-tab Изолированные сессии, вкладки, история, закладки
Безопасность Фишинг-защита, SSL-валидация, изоляция, аудит
Документация и код-ревью Полная документация API, руководство по интеграции

Процесс разработки

  1. Базовый WebView с навигацией, адресной строкой, прогресс-баром
  2. Инжекция провайдера и поддержка eth_requestAccounts, eth_accounts, eth_chainId
  3. Диалог транзакции — отображение, подписание, отправка через RPC
  4. Расширенные методы — personal_sign, eth_signTypedData_v4, wallet_switchEthereumChain
  5. Безопасность — изоляция, фишинг-защита, аудит
  6. Multi-tab и UX-полировка

Сроки: базовый браузер с eth_sendTransaction — 3–4 недели. Полноценный браузер с multi-tab, EIP-712 отображением, security-аудитом — 2–3 месяца. Стоимость рассчитывается индивидуально. Повторное использование компонентов позволяет сэкономить до 40% бюджета при типовой интеграции.

Получите консультацию по вашему проекту: мы оценим архитектуру и предложим оптимальное решение под ключ. Свяжитесь с нами, чтобы обсудить детали.

Интеграция API в мобильное приложение: с чего начать

Запрос уходит, ответ не приходит, timeout — 30 секунд. Пользователь смотрит на спиннер. Сети нет — мобильная карта в метро. Или сеть есть, но сервер вернул 200 с HTML-страницей ошибки вместо JSON — и приложение крашит при JSONDecoder.decode(). Мы видим такие кейсы на каждом втором проекте. Поэтому интеграция API в мобильное приложение — это не просто вызов endpoint'а, а проектирование надёжного сетевого слоя: обработка ошибок, кэширование, offline-режим, certificate pinning. Закажите аудит текущего сетевого слоя — оценим проект за 1 день.

Почему стандартные библиотеки недостаточны? URLSession и OkHttp предоставляют базовый HTTP-клиент, но для production нужны retry с exponential backoff, валидация статус-кодов, типизированная десериализация и мониторинг состояния сети. Без этого приложение теряет данные и пользователей. Мы уже 5 лет занимаемся мобильной разработкой и реализовали более 30 проектов с интеграцией API на iOS, Android и Flutter — от стартапов до enterprise-решений.

Как выбрать протокол для интеграции API?

Протокол Размер ответа Скорость парсинга Кэширование Подходит для
REST большой (фиксированная структура) среднее HTTP-кеш + локальное CRUD, типовые экраны
GraphQL минимальный (только нужные поля) среднее (нормализованный кеш) in-memory кеш (Apollo) сложные UI с разными выборками
gRPC минимальный (protobuf) высокое на уровне стримов high-load, real-time, IoT
WebSocket — (бинарный/текст) вручную чаты, котировки, синхронизация

REST остаётся стандартом для большинства проектов. Но когда на экране профиля нужно 5 полей из 40, GraphQL исключает over-fetching и сокращает трафик на 30–60%. gRPC оправдан при тысячах запросов в минуту (trading, IoT) — бинарная сериализация в 3–5 раз быстрее JSON. WebSocket — единственный выбор для real-time без polling (сообщения, уведомления).

Пример из практики: для финтех-приложения мы заменили REST (40 полей) на GraphQL — размер ответа сократился с 12 КБ до 2,5 КБ, время рендера экрана упало на 70%. Экономия трафика составила около 15 000 ₽ в месяц при 100 000 активных пользователей.

Как обеспечить надёжность соединения и offline-first

Пользователи теряют сеть в метро, лифте, тоннеле. Мобильное приложение обязано работать без интернета — хотя бы в read-only режиме. Мы внедряем паттерн offline-first:

  1. При открытии экрана сначала показываем данные из локального кеша (Core Data / Room).
  2. Параллельно выполняем сетевой запрос, обновляем UI после ответа.
  3. Если сеть недоступна — показываем кешированные данные и метку «нет соединения».
  4. При восстановлении сети автоматически синхронизируем изменения.

Для кэширования HTTP-ответов используем URLCache (iOS) и OkHttp Cache (Android) с поддержкой Cache-Control. Для структурированных данных — SwiftData / Room. NWPathMonitor / ConnectivityManager.NetworkCallback отслеживают состояние сети и триггерят обновление.

REST и выбор клиентской библиотеки

Alamofire (iOS) — де-факто стандарт для Swift-проектов. Поверх URLSession добавляет request chaining, response validation, automatic retry, certificate pinning через ServerTrustManager. AF.request() с .validate() возвращает ошибку для любого статус-кода вне 200–299. Без .validate() Alamofire считает 404 и 500 успешными ответами. С Swift Concurrency — async-версия через serializingDecodable.

Retrofit (Android) — аннотационный HTTP-клиент поверх OkHttp. Интерфейс с аннотациями компилируется в реализацию. @GET, @POST, @Path, @Query, @Body — декларативное описание API. OkHttp под капотом: connection pooling, transparent gzip, HTTP/2 multiplex. HttpLoggingInterceptor — логирование в debug-сборке. Authenticator — автоматический refresh токена при 401.

Ktor (KMM/Flutter) — мультиплатформенный HTTP-клиент. На iOS работает через Darwin engine (URLSession), на Android — через OkHttp. Единый код для обеих платформ при KMM-архитектуре.

GraphQL: когда REST не справляется

REST возвращает фиксированную структуру. Экран профиля требует name, avatar, email — сервер отдаёт 40 полей. Over-fetching. GraphQL решает это: клиент запрашивает ровно нужные поля. Это критично для мобайла, где трафик и время парсинга — реальные ограничения. Apollo iOS и Apollo Kotlin генерируют типизированные классы по схеме: schema.graphql + query-файлы → строгие типы на этапе компиляции. Subscriptions через WebSocket — real-time без polling. Ограничение: GraphQL сложнее кешировать на уровне HTTP. Apollo использует нормализованный in-memory кеш InMemoryNormalizedCache — запросы с пересекающимися данными обновляют кеш без дублирования. Apollo GraphQL Documentation

WebSocket: real-time без лишнего трафика

Polling (setInterval каждые 5 секунд) — трата батареи и трафика. WebSocket — постоянное двунаправленное соединение. iOS: URLSessionWebSocketTask (нативный, iOS 13+). Android: OkHttp WebSocket. Обязательная обработка reconnect: при onFailure — экспоненциальный backoff (1с → 2с → 4с → 8с → максимум 60с). Socket.IO — надстройка с автоматическим reconnect, но для новых проектов предпочтительнее нативный WebSocket (меньше зависимостей).

gRPC: для высоконагруженных сервисов

gRPC с protobuf — бинарная сериализация: меньше размер, быстрее парсинг. grpc-swift для iOS, grpc-kotlin для Android. Protobuf-схема компилируется в типизированные классы. Streaming (server-side, client-side, bidirectional) — нативная возможность. Порог применения: высокая частота запросов (trading, IoT) или критичная latency. Для обычного CRUD REST проще в дебаге и мониторинге.

Certificate Pinning и безопасность

Корпоративный proxy может перехватить HTTPS через подмену сертификата. Certificate pinning предотвращает это: приложение принимает только конкретный сертификат или публичный ключ. Alamofire: ServerTrustManager с PinnedCertificatesTrustEvaluator. OkHttp: CertificatePinner с SHA-256 хешем. Операционная сложность: при ротации сертификата старые версии приложения перестают работать. Решение — pinning на публичный ключ CA или поддержка нескольких пинов с grace period. Подробнее о certificate pinning на Wikipedia

Что входит в работу

Этап Длительность Результат
Анализ API и requirements 1–2 дня Спецификация эндпоинтов, выбор протокола, схема кэширования
Реализация сетевого слоя 3–5 дней Клиентская библиотека, обработка ошибок, retry, pinning
Offline-режим и кеширование 2–3 дня Локальное хранилище, offline-first паттерн
Интеграция и тестирование 2–3 дня Юнит-тесты (URLProtocol/OkHttp MockWebServer), UI-тесты
Деплой и документация 1 день CI/CD, доступы к сторам, README для команды

Мы передаём: исходный код сетевого слоя, документацию по используемым библиотекам, инструкцию по ротации сертификатов, поддержку в течение 2 недель после сдачи.

Сроки и стоимость

Реализация сетевого слоя с REST, retry, кэшированием и offline-режимом — 1–2 недели. Добавление GraphQL или WebSocket — ещё 1–2 недели. gRPC — 2–3 недели, включая кодогенерацию. Стоимость рассчитывается индивидуально после анализа API и требований к offline-поведению. Оценим проект за 1 день — свяжитесь для консультации.