shivao-projeto/mobile/README.md
PontualTech / Karlão 7a523b8873 feat(mobile): scaffold Capacitor pra Android Play Store + adapter nativo
ESTRUTURA NOVA: mobile/ + scripts/sync-html.mjs

- mobile/package.json: Capacitor 6 + plugins (geolocation, local-notifications, network, preferences, status-bar)
- mobile/capacitor.config.json: appId br.com.pontualtech.shivao, allowNavigation pra OSM/Windy/CDNs
- mobile/.gitignore: protege keystore (NUNCA commitar chaves privadas)
- mobile/README.md: setup completo (JDK + Android Studio + keystore + build APK/AAB + Play Store submission + iOS futuro + troubleshooting)
- scripts/sync-html.mjs: copia app/diario-bordo.html → server/public + mobile/www (1 fonte da verdade)

ADAPTER NATIVO no HTML (sincronizado app/ + server/public/):
- isNative() / nativePlatform() detecta Capacitor
- nativeWatchPosition() usa Capacitor.Geolocation (background-capable) com fallback navigator.geolocation
- nativeNotify() usa Capacitor.LocalNotifications com fallback toast
- initServiceWorker() pula registro no Capacitor (WebView nativo já tem cache próprio)

NÃO INCLUI (ainda):
- Build local: precisa JDK 17 + Android Studio (~3GB) — instruções no README
- Keystore: gerar 1 vez via keytool (script no README)
- AAB pra Play Store: comandos no README
- Conta Google Play Developer: $25 1× pelo dono

Próximo passo manual: instalar JDK + Android Studio, rodar 'npm install && npx cap add android'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:02:34 -03:00

213 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Shivao Mobile · Capacitor Android (e iOS futuro)
Wrapper Capacitor pra empacotar o Shivao web como app nativo Android (.apk pra sideload, .aab pra Play Store) e iOS no futuro.
**Arquitetura:** o frontend HTML mora em `app/diario-bordo.html` (1 fonte de verdade). Um script (`scripts/sync-html.mjs`) copia pra `server/public/index.html` (Express serve) e `mobile/www/index.html` (Capacitor empacota).
---
## 🛠️ Pré-requisitos (instalar 1 vez)
### Windows (recomendado pra você)
1. **JDK 17+** — Adoptium Temurin é a melhor escolha:
```
winget install EclipseAdoptium.Temurin.17.JDK
```
Verificar: `java -version` deve mostrar `17.x`
2. **Android Studio** — instala SDK + emulador + tudo:
```
winget install Google.AndroidStudio
```
Após abrir, ir em **Tools → SDK Manager** e instalar:
- Android SDK Platform 34 (Android 14)
- Android SDK Build-Tools 34.0.0
- Android SDK Command-line Tools (latest)
- Android SDK Platform-Tools
3. **Variáveis de ambiente** (Painel de Controle → Sistema → Variáveis de Ambiente):
- `JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.0.x` (ajuste path)
- `ANDROID_HOME=C:\Users\pontu\AppData\Local\Android\Sdk`
- Adicionar ao PATH: `%JAVA_HOME%\bin`, `%ANDROID_HOME%\platform-tools`
4. Reiniciar terminal. Verificar:
```bash
java -version
adb --version
```
**Tempo total de instalação:** ~30-45 min (download de ~3GB).
---
## 🚀 Build inicial (faz 1 vez)
```bash
cd mobile
# Instala deps Capacitor + plugins
npm install
# Sincroniza HTML do app/ pra mobile/www/
node ../scripts/sync-html.mjs
# Adiciona projeto Android (gera mobile/android/)
npx cap add android
# Sincroniza plugins nativos no projeto Android
npx cap sync android
```
### Permissões Android (editar manualmente após `cap add android`)
Abra `mobile/android/app/src/main/AndroidManifest.xml` e adicione DENTRO do `<manifest>`:
```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.sensor.barometer" android:required="false" />
<uses-feature android:name="android.hardware.sensor.compass" android:required="false" />
```
---
## 🔐 Keystore PERMANENTE (CRÍTICO — gera 1 vez, guarda pra sempre)
```bash
cd mobile/android/app
keytool -genkey -v -keystore shivao-release.keystore -alias shivao -keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=Karlao, O=PontualTech, L=Sao Paulo, ST=SP, C=BR"
# Senha forte (mínimo 8 chars). ANOTE em local seguro — perda = perda permanente do app na Play Store.
```
**BACKUP IMEDIATO:**
```bash
cp shivao-release.keystore C:/Users/pontu/Downloads/Shivao-keystore-backup/shivao-release.keystore
echo "Senha keystore: SUA_SENHA_AQUI" >> C:/Users/pontu/Downloads/Shivao-keystore-backup/keystore-passwords.txt
echo "Alias: shivao" >> C:/Users/pontu/Downloads/Shivao-keystore-backup/keystore-passwords.txt
```
E também faça upload em Drive privado, HD externo etc — perdeu = não publica update na Play Store nunca mais.
### Configurar signing no Gradle
Edite `mobile/android/app/build.gradle`, dentro de `android { ... }`:
```gradle
signingConfigs {
release {
storeFile file('shivao-release.keystore')
storePassword System.getenv('SHIVAO_KEYSTORE_PWD') ?: 'SUA_SENHA_AQUI'
keyAlias 'shivao'
keyPassword System.getenv('SHIVAO_KEY_PWD') ?: 'SUA_SENHA_AQUI'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
}
}
```
---
## 📦 Build do APK (sideload) e AAB (Play Store)
```bash
cd mobile
# Sincroniza última versão do HTML antes de build
npm run sync
# APK assinado pra sideload (~3-5 min primeira vez, ~1 min em rebuilds)
npm run android:build:apk
# Output: mobile/android/app/build/outputs/apk/release/app-release.apk
# AAB pra Play Store (formato preferido)
npm run android:build:aab
# Output: mobile/android/app/build/outputs/bundle/release/app-release.aab
```
---
## 🌐 Alternativa: Build na nuvem (sem instalar nada local)
Se não quiser instalar 3GB de Android Studio:
### Opção A: Codemagic (mais simples)
- 500min grátis/mês, suficiente pra ~10 builds
- Conecta ao Forgejo, push detecta e roda
- Configura assinatura no painel
### Opção B: Container Docker no Coolify (mais self-hosted)
- Subir imagem `mingc/android-build-box` no Coolify
- Cron job ou webhook do Forgejo dispara build
- APK/AAB salvo em volume persistente
Ambas opções: vamos preparar quando você decidir.
---
## 🎮 Submeter Play Store
1. **Conta Google Play Developer:** $25 1× em https://play.google.com/console
2. Após aprovado (~24h), criar novo app:
- Nome: "Shivao - Diário de Bordo"
- Categoria: "Maps & Navigation"
- Idioma: pt-BR
3. **Subir AAB:** Production → Releases → Create new release → upload `app-release.aab`
4. **Conteúdo obrigatório:**
- Política de privacidade (URL pública — vou criar uma rota `/politica-privacidade` no servidor)
- Screenshots: mínimo 2 (vou gerar via Playwright se quiser)
- Ícone 512×512 (vou gerar do icon.svg)
- Descrição curta (80 chars) e completa
5. **Content rating:** preencher questionário (~5min)
6. **Pricing:** Free (cobrança vai por dentro do app via Asaas, não Google IAP — economia de 30%)
7. **Submit pra review:** Google revisa em 1-7 dias
---
## 📱 iOS (FASE 4 futura)
Requer:
- Mac (mini M4 ~R$5k mais barato)
- Apple Developer Program $99/ano
- Xcode
```bash
npx cap add ios
npx cap sync ios
npx cap open ios # abre Xcode
# Build Archive → Distribute → App Store Connect
```
---
## 🐛 Troubleshooting
**`adb: command not found`** — adicione `%ANDROID_HOME%\platform-tools` ao PATH
**`SDK location not found`** — crie `mobile/android/local.properties`:
```
sdk.dir=C:\\Users\\pontu\\AppData\\Local\\Android\\Sdk
```
**Build muito lento** — primeiro build baixa Gradle + dependências (~500MB). Próximos builds usam cache.
**APK muito grande** — habilitar minify em `build.gradle`:
```gradle
buildTypes.release.minifyEnabled true
buildTypes.release.shrinkResources true
```