native-app-webviev
Описание
Нативные мобильные приложения c WebView. Проект включает Android и iOS версии, которые загружают произвольный сайт
Языки
- Java46,4%
- Shell26,4%
- Swift26,2%
- Ruby1%
Native WebView App Template
Production-ready шаблон для создания WebView мобильных приложений
Универсальный шаблон нативных мобильных приложений на базе WebView с полным набором enterprise-функций. Проект включает Android и iOS версии, оптимизированные для быстрого ребрендинга под любой веб-сервис.
Текущая конфигурация (пример):
- URL: https://bxstore.ru
- User-Agent: BX_STORE_APP
- Package/Bundle ID: app.bxstore.ru
🚀 Быстрый старт
Требования
- Android: Android Studio, JDK 17+, Android SDK 29+
- iOS: macOS, Xcode 15+, CocoaPods
- Общее: ImageMagick (для генерации иконок)
Сборка и запуск
Android
iOS
✨ Основные возможности
🎯 Production-ready функционал
- ✅ Потоковая геолокация - event-driven обновления координат в реальном времени (без таймеров)
- ✅ Обработка ошибок сети - custom UI с автовосстановлением последней успешной страницы
- ✅ Модульная архитектура - разделение ответственности через сервисы (iOS) и callbacks (Android)
- ✅ Централизованная конфигурация -
enum (iOS), константы (Android)AppConfiguration - ✅ Персистентное хранилище - сохранение состояния через UserDefaults/SharedPreferences
- ✅ Полноэкранный WebView - нативный UI без видимых элементов браузера
🔧 Интеграции
- ✅ JavaScript Bridge - двустороннее взаимодействие между нативным кодом и веб-страницей
- ✅ Firebase Cloud Messaging - push-уведомления для Android и iOS
- ✅ SwipeRefreshLayout / Pull-to-refresh - ручное обновление страницы
🛠 Инструменты для ребрендинга
- ✅ update_app_config.sh - автоматизация изменения URL, User-Agent, Package ID
- ✅ generate_icons.sh - генерация иконок для всех разрешений из одного исходника
📋 Технические характеристики
Платформы
- Android: Минимум API 29 (Android 10.0), целевая API 35 (Android 15)
- iOS: Минимум iOS 17.0+
Разрешения
- Android:
,INTERNET,ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION,ACCESS_BACKGROUND_LOCATIONPOST_NOTIFICATIONS - iOS: Location When In Use, Push Notifications
Архитектура геолокации
- Механизм: Event-driven потоковое обновление (не таймеры!)
- Точность: Высокая точность GPS
- Провайдеры:
- Android: FusedLocationProviderClient + системный LocationManager (dual fallback)
- iOS: CLLocationManager с делегатом
- Обновления: Моментально при изменении координат
Обработка ошибок сети
- Custom Error UI: Полноэкранное сообщение "Проблемы с интернет соединением"
- Кнопка "Обновить": Повторная попытка загрузки
- URL Persistence: Сохранение последнего успешного URL
- Автовосстановление: Загрузка сохранённой страницы при ошибке
- Защита от системных ошибок: Предотвращение показа стандартных страниц браузера
🌐 JavaScript API
Приложения предоставляют единый JavaScript API для взаимодействия с веб-страницей:
Глобальные переменные
События
Callback функции
Нативный API
🔧 Ребрендинг приложения
📝 Изменение названия приложения
Название приложения (отображаемое на экране устройства) настраивается в следующих файлах:
Android
Файл:
iOS
Файл:
Найдите и измените значение в двух местах (для Debug и Release конфигураций):
INFOPLIST_KEY_CFBundleDisplayName = "Ваше Название";
Примечание: В
это значение встречается дважды — для Debug и Release сборок. Измените оба вхождения.project.pbxproj
Автоматический способ (рекомендуется)
Используйте скрипт для полной настройки приложения:
Скрипт запросит:
- Старый Application ID (например,
)app.bxstore.ru - Новый Application ID (например,
)app.mycompany.com - App Name для SharedPreferences (например,
)MyApp - User-Agent (например,
)MY_CUSTOM_APP - Домен (например,
)mycompany.com
Что обновит скрипт:
iOS:
- ✅
- базовый URL приложенияAppConfiguration.Network.baseURL - ✅
- User-AgentAppConfiguration.Network.customUserAgent - ✅
в Info.plist - Bundle IDCFBundleIdentifier - ✅
в Info.plist - домен для ATSNSExceptionDomains
Android:
- ✅
константа в MainActivity - URL приложенияTARGET_URL - ✅
константа - User-AgentCUSTOM_USER_AGENT - ✅
константа - имя SharedPreferencesPREFS_NAME - ✅
в build.gradlenamespace - ✅
в build.gradleapplicationId - ✅
в AndroidManifest.xmlpackage - ✅ Перемещение Java файлов в новый package
- ✅ Обновление package declarations во всех .java файлах
- ✅ Оба домена в network_security_config.xml (основной + www)
Ручная настройка (не рекомендуется)
Показать инструкции для ручной настройки
iOS (ViewController.swift)
Android (MainActivity.java)
iOS (Info.plist)
Android (build.gradle, AndroidManifest.xml, Java files)
См. содержимое скрипта для деталей
🖼 Генерация иконок
Подготовка
- Создайте квадратное изображение высокого разрешения (рекомендуется 2048x2048 px)
- Сохраните как RESOURCES/ALL/ICO.png
- Убедитесь, что установлен ImageMagick: brew install imagemagick
Запуск
Скрипт автоматически создаст:
- Android: все разрешения в ANDROID/app/src/main/res/mipmap-*
- iOS: все размеры в IOS/NeutralApp/Assets.xcassets/AppIcon.appiconset/
🔥 Firebase Cloud Messaging (Push-уведомления)
Настройка
- Создайте проект в Firebase Console
- Скачайте конфигурационные файлы:
- Android:
→google-services.jsonANDROID/app/ - iOS:
→GoogleService-Info.plistIOS/NeutralApp/
- Android:
- Замените заглушки в проекте на реальные файлы
- Пересоберите приложение
Реализация
Android
- Сервис:
обрабатывает входящие уведомленияMyFirebaseMessagingService - FCM токен: Автоматически генерируется при запуске
- Конфигурация: ANDROID/app/google-services.json
iOS
- Инициализация: Firebase SDK в AppDelegate.swift
- FCM токен: Запрашивается при старте
- Background mode: Поддержка remote-notification
- Конфигурация: IOS/NeutralApp/GoogleService-Info.plist
🏗️ Архитектура кода
iOS - Модульная архитектура с сервисами
Файл: (~650 строк)
Компоненты:
1. AppConfiguration
Централизованное хранение конфигурации приложения.
2. LocationService
Отвечает за получение и обработку геолокации с использованием делегата.
3. ErrorViewService
Управляет отображением custom error UI при проблемах с сетью.
4. URLStorageService
Персистентное хранение последнего успешного URL через UserDefaults.
5. JavaScriptBridge
Централизованная генерация JavaScript-кода для взаимодействия с WebView.
Преимущества:
- ✅ Чистая архитектура с разделением ответственности
- ✅ Легкая тестируемость через protocols и delegates
- ✅ Переиспользуемость компонентов
- ✅ Централизованная конфигурация
Android - Callback-based архитектура
Файлы: ,
Ключевые компоненты:
1. Константы конфигурации
2. Streaming Location Callback
Непрерывная передача координат без таймеров.
3. Error Layout Management
4. URL Persistence (SharedPreferences)
5. LocationManagerHelper (Dual Provider)
🔍 Отличия от базовых WebView-приложений
❌ Что НЕ используется (устаревшие подходы):
Таймеры для обновления геолокации→ Event-driven потокиМонолитный ViewController→ Модульная архитектураСистемные страницы ошибок→ Custom error UIОтсутствие персистенции→ UserDefaults/SharedPreferences
✅ Что реализовано (production best practices):
- Streaming location updates - координаты в реальном времени
- Error recovery - автовосстановление с сохранением состояния
- Modular architecture - разделение ответственности
- Centralized configuration - единая точка настройки
- Persistent storage - сохранение последнего успешного URL
📱 Использование шаблона
Сценарий 1: Создание нового WebView-приложения
- Клонируйте репозиторий
- Подготовьте иконку RESOURCES/ALL/ICO.png
- Запустите
:./update_app_config.sh- Старый ID: app.bxstore.ru
- Новый ID: app.yourcompany.com
- App Name: YourApp
- User-Agent: YOUR_APP_AGENT
- Домен: yourcompany.com
- Старый ID:
- Запустите ./generate_icons.sh
- Замените Firebase конфигурации
- Соберите проект:
или./START_ANDROID.sh./START_IOS.sh
Сценарий 2: Серия приложений для разных доменов
Сценарий 3: Кастомизация функционала
Модульная архитектура позволяет легко добавлять новые сервисы:
iOS: создайте новый сервис, например
Android: расширьте MainActivity или создайте helper
🛡️ Безопасность и конфиденциальность
Network Security
- Android:
- контроль доступа к доменамnetwork_security_config.xml - iOS:
в Info.plistNSAppTransportSecurity
Разрешения
- Location: Запрашивается только "When In Use" (не Always)
- Notifications: Опциональные push-уведомления
- Internet: Ограничено списком доверенных доменов
Data Persistence
- Минимальное хранение: Только последний успешный URL
- UserDefaults/SharedPreferences: Локальное хранение без облака
- No Analytics: Шаблон не содержит встроенной аналитики
🚢 Публикация в сторы
Google Play Store (Android)
- Обновите конфигурацию через update_app_config.sh
- Создайте keystore для подписи:
- Настройте
:ANDROID/app/build.gradle - Соберите release APK/AAB:
Apple App Store (iOS)
- Откройте
в XcodeIOS/NeutralApp.xcworkspace - Настройте Signing & Capabilities:
- Team: ваш Apple Developer аккаунт
- Bundle Identifier: обновлённый через скрипт
- Архивируйте: Product → Archive
- Загрузите в App Store Connect
🧪 Тестирование
Локальная разработка
Android с локальным сервером:
iOS с локальным сервером:
Обновите (Android) для разрешения HTTP.
Отладка JavaScript Bridge
В веб-коде добавьте:
В Android:
В iOS:
📚 Дополнительные ресурсы
Документация
Полезные команды
Android:
iOS:
🤝 Поддержка и вклад
Известные ограничения
- iOS требует HTTPS для production (можно обойти в Info.plist для разработки)
- Android emulator может не поддерживать геолокацию (используйте реальное устройство)
- Push-уведомления требуют валидные Firebase конфигурации
Структура проекта
native-webviev-app/
├── ANDROID/ # Android проект (Gradle)
│ └── app/
│ ├── src/main/java/app/bxstore/ru/
│ │ ├── MainActivity.java
│ │ └── LocationManagerHelper.java
│ └── build.gradle
├── IOS/ # iOS проект (Xcode + CocoaPods)
│ └── NeutralApp/
│ └── ViewController.swift
├── RESOURCES/
│ └── ALL/
│ └── ICO.png # Исходная иконка
├── update_app_config.sh # Скрипт ребрендинга
├── generate_icons.sh # Генерация иконок
├── START_ANDROID.sh # Быстрый запуск Android
├── START_IOS.sh # Быстрый запуск iOS
└── README.md # Данная документация
📄 Лицензия
Проект является универсальным шаблоном для коммерческого и некоммерческого использования.
Создано как production-ready шаблон для быстрого развёртывания WebView-приложений с enterprise-функционалом.