Перейти к содержанию

📱 Native build · Capacitor (iOS + Android)

Phase 4 Sprint 4.6. Web-приложение готово, упаковываем в .apk / .ipa.


✅ Что уже настроено

  • tourist-app/capacitor.config.ts — appId ru.arkhyzclub.app, name "Архыз.CLUB"
  • 13 Capacitor plugins установлены: app, browser, camera, clipboard, core, geolocation, haptics, network, preferences, push-notifications (Sprint 4.6), share, splash-screen, status-bar, toast
  • Native проекты под git: tourist-app/android/, tourist-app/ios/
  • lib/push.ts грейсфул: native плагин подгружается dynamic-import-ом, fallback на web Notification API если плагин не доступен
  • lib/native.ts — bridge функции (pickImage через Capacitor Camera, share, и т.д.)
  • CapacitorHttp enabled — нативный stack обходит CORS/SSL проблемы webview

🚀 Пайплайн билда

Один раз (после клона репо):

cd tourist-app
npm install
npx cap sync   # копирует web в android/ + ios/, обновляет нативные deps

Каждый релиз:

cd tourist-app
npm run build           # Vite сборка → dist/
npx cap sync            # синхронизация в android + ios

Android (можно собрать на любой ОС):

npm run android:open    # → Android Studio открывается
# В Studio: Build → Generate Signed Bundle / APK
# или CLI:
cd android && ./gradlew assembleRelease
# .apk в android/app/build/outputs/apk/release/

iOS (только macOS + Xcode):

npm run ios:open        # → Xcode открывается
# В Xcode: Product → Archive → Distribute App → App Store Connect

🔑 Подписи / signing

Android

  • Keystore лежит вне репо: ~/.android/arkhyz-release.jks
  • Конфиг в android/app/build.gradle::signingConfigs.release
  • gradle.properties: ARKHYZ_STORE_PASSWORD, ARKHYZ_KEY_PASSWORD через env

iOS

  • Apple Developer аккаунт (99$ /год)
  • Provisioning profile ru.arkhyzclub.app через Xcode → Signing & Capabilities
  • Push-сертификат APNs (отдельный — для prod / для dev)

📦 Push notifications

Native (iOS/Android)

  1. lib/push.ts::initPush(userId) вызывается при логине
  2. Запрашивает permission через @capacitor/push-notifications
  3. Получает device token (FCM на Android, APNs на iOS)
  4. Регистрирует токен через platformApi.registerPush(token, platform, version) → POST /api/v1/push/register (platform-svc)
  5. Сервер сохраняет в Redis push_devices:user:{uid}
  6. При событии (новая бронь/сообщение) бэк публикует в realtime:user:{uid}:*
  7. OneSignal SDK на бэке (Phase 4 Sprint 4.7) рассылает по device tokens

Web (PWA)

  1. То же initPush(userId), но через Notification API
  2. Fake-token web-{uid}-{ts} регистрируется
  3. Foreground-уведомления через WS (см. lib/inbox.ts)
  4. Background — через Service Worker + Web Push (Phase 4 Sprint 4.7)
  • data.deep_link в push payload → lib/push.ts::onMessage парсит и window.location.assign(deep_link)
  • iOS / Android универсальные ссылки: https://arkhyz-club.ru/...

🎨 App icons + splash

  • Лого: tourist-app/public/logo.svg
  • Иконки сгенерированы через @capacitor/assets:
    npx @capacitor/assets generate --iconBackgroundColor '#1F2A6B' \
      --iconBackgroundColorDark '#0F1822' \
      --splashBackgroundColor '#7796F9'
    
  • Splash: фон #7796F9 (primary), AI-ромб лого (синий+красный+белый) центрирован

🧪 Тестирование

Live-reload во время разработки

# Терминал 1
npm run dev   # vite на :9006

# Терминал 2 (устройство в той же Wi-Fi сети)
npm run android:dev   # или ios:dev
# Изменения в коде → live-reload на устройстве

Локальный билд APK для теста

cd tourist-app
npm run build
npx cap sync android
cd android
./gradlew assembleDebug   # для дебага
# .apk в android/app/build/outputs/apk/debug/
adb install app-debug.apk

📤 Публикация в Store

Google Play

  1. Google Play Console → Internal testing track (закрытая бета)
  2. Upload signed .aab (Android App Bundle, не .apk для production)
  3. Заполнить store listing: описание, скриншоты (минимум 2), иконка 512×512, feature graphic 1024×500
  4. Privacy policy URL: https://arkhyz-club.ru/privacy
  5. Promotion → review (~3-5 дней)

Apple App Store

  1. App Store Connect → Internal testing (TestFlight, до 100 internal + 10000 external)
  2. Upload через Xcode Archive → Distribute App
  3. Заполнить metadata: описание (до 4000 символов), скриншоты (6.5"+ 5.5"+ 12.9"), иконка 1024×1024
  4. Privacy nutrition labels (что собираем: имя, email, location, photos, etc.)
  5. Submit for review (~1-3 дня)

📊 Итог Sprint 4.6

✅ Capacitor config готов (appId, splash, statusbar, плагины) ✅ Native проекты под git (android/, ios/) ✅ @capacitor/push-notifications добавлен в deps ✅ lib/push.ts использует platform-svc /push/register (Sprint 4.4) ✅ Build instructions написаны

Что нужно сделать вручную (требует macOS / Android Studio): 1. npm install после git pull (подтянуть push-notifications) 2. npx cap sync для копирования в native 3. Подписать keystore + provisioning profile 4. Test на физическом устройстве 5. Upload в Store

Phase 4 Sprint 4.7 — TestFlight + Google Play closed beta.