📱 Native build · Capacitor (iOS + Android)¶
Phase 4 Sprint 4.6. Web-приложение готово, упаковываем в .apk / .ipa.
✅ Что уже настроено¶
tourist-app/capacitor.config.ts— appIdru.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, и т.д.)CapacitorHttpenabled — нативный 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)¶
lib/push.ts::initPush(userId)вызывается при логине- Запрашивает permission через
@capacitor/push-notifications - Получает device token (FCM на Android, APNs на iOS)
- Регистрирует токен через
platformApi.registerPush(token, platform, version)→ POST/api/v1/push/register(platform-svc) - Сервер сохраняет в Redis
push_devices:user:{uid} - При событии (новая бронь/сообщение) бэк публикует в
realtime:user:{uid}:* - OneSignal SDK на бэке (Phase 4 Sprint 4.7) рассылает по device tokens
Web (PWA)¶
- То же
initPush(userId), но через Notification API - Fake-token
web-{uid}-{ts}регистрируется - Foreground-уведомления через WS (см.
lib/inbox.ts) - Background — через Service Worker + Web Push (Phase 4 Sprint 4.7)
Deep links¶
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¶
- Google Play Console → Internal testing track (закрытая бета)
- Upload signed
.aab(Android App Bundle, не.apkдля production) - Заполнить store listing: описание, скриншоты (минимум 2), иконка 512×512, feature graphic 1024×500
- Privacy policy URL:
https://arkhyz-club.ru/privacy - Promotion → review (~3-5 дней)
Apple App Store¶
- App Store Connect → Internal testing (TestFlight, до 100 internal + 10000 external)
- Upload через Xcode Archive → Distribute App
- Заполнить metadata: описание (до 4000 символов), скриншоты (6.5"+ 5.5"+ 12.9"), иконка 1024×1024
- Privacy nutrition labels (что собираем: имя, email, location, photos, etc.)
- 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.