Appearance
Runbook: Publicação do app mobile nas lojas (Apple + Google)
Guia completo para configurar e publicar o app Contrasync na App Store e na Google Play. Pressupõe que você já possui:
- Conta Apple Developer Program (paga, ativa)
- Conta Google Play Console (desenvolvedor registrado)
- Binários prontos:
.ipa(iOS) e.aab(Android)Este runbook cobre o primeiro envio manual (obrigatório nas duas lojas) e a configuração pós-publicação (backend, credenciais EAS, revisão de loja).
Identificadores do projeto
| Campo | Valor |
|---|---|
| Nome exibido | Contrasync |
| Slug Expo | contrasync-app |
| Owner Expo | contrasync |
| Projeto EAS | @contrasync/contrasync-app |
| Project ID EAS | 409313df-bb14-45e4-a689-87c83d3edf7d |
| Bundle ID iOS | com.contrasync |
| Package Android | com.contrasync |
Versão semver (app.json) | 1.0.0 |
| Scheme deep link | contrasync:// |
| Firebase project | contrasync (705803465844) |
| Política de privacidade | https://contrasync.com/privacy-policy |
| Site | https://contrasync.com |
Repositório: contrasync-reactnative-app.
Decisão rápida: qual caminho usar?
Você já criou o registro do app na loja (primeira vez)?
├─ NÃO → siga este runbook do início (seções Google Play + App Store)
└─ SIM → pule para "Enviar binário" em cada plataforma
e depois "Pós-publicação"
Quer submeter o .ipa/.aab que já tem localmente?
├─ SIM → upload manual nas consoles (seções abaixo)
└─ NÃO → use EAS Submit (ver runbook eas-pipeline.md)Checklist geral (antes de submeter)
Binários
- [ ] iOS
.ipa: assinado com certificado de App Store Distribution e provisioning profile paracom.contrasync. - [ ] Android
.aab: assinado com o mesmo keystore que será usado em todas as releases futuras (guarde backup seguro — perder o keystore impede atualizações). - [ ] Versão do binário (
CFBundleShortVersionString/versionName) =1.0.0(ou a versão que você quer publicar). - [ ] Build number (
CFBundleVersion/versionCode) único e maior que qualquer build já enviado. - [ ] Build aponta para API de produção (
EXPO_PUBLIC_API_URL), não ngrok.
Contas e contratos
- [ ] Apple Developer Program ativo e PLA aceito (Program License Agreement — ver troubleshooting no eas-pipeline).
- [ ] App Store Connect → Business → Agreements, Tax, and Banking completo (contrato pago, impostos, dados bancários).
- [ ] Google Play Console → perfil de desenvolvedor verificado e conta de pagamento (se app pago; Contrasync é gratuito).
Materiais de listing
- [ ] Ícone 1024×1024 (sem transparência, sem cantos arredondados — a loja arredonda).
- [ ] Screenshots (ver seção "Assets visuais").
- [ ] Descrição curta e longa (PT-BR; EN opcional).
- [ ] URL da política de privacidade:
https://contrasync.com/privacy-policy. - [ ] E-mail de suporte ao usuário (ex.:
suporte@contrasync.com). - [ ] Categoria sugerida: Produtividade ou Negócios.
Permissões declaradas no app
O app.json declara estas permissões — todas precisam aparecer nos formulários de privacidade das lojas:
| Permissão | Uso no app | Justificativa para loja |
|---|---|---|
| Câmera | Login via QR code | Escanear QR gerado no painel web |
| Localização (when in use) | Lançamento de horas | Registrar posição no registro de horas |
| Notificações push | Alertas operacionais | Avisos de contratos, compliance, aprovações |
Microfone (RECORD_AUDIO) | Dependência do expo-camera | Declarar se solicitado; o app não grava áudio |
Criptografia: ITSAppUsesNonExemptEncryption: false — responda "Não" à pergunta de criptografia de exportação na App Store (usa apenas HTTPS padrão).
Google Play Console
1. Criar o app (primeira vez)
- Acesse https://play.google.com/console.
- Criar app → nome Contrasync.
- Tipo: App (não game).
- Gratuito ou pago: Gratuito.
- Declarações iniciais: marque conforme aplicável (políticas, exportação EUA, etc.).
2. Configurar ficha da loja (Store listing)
Painel → Crescer → Presença na loja → Ficha principal da loja
| Campo | Orientação |
|---|---|
| Nome do app | Contrasync (máx. 30 caracteres) |
| Descrição curta | Até 80 caracteres. Ex.: "Gestão de prestadores, horas, compliance e contratos digitais." |
| Descrição completa | Até 4000 caracteres. Use texto da proposta de valor. |
| Ícone do app | 512×512 PNG, 32-bit, máx. 1 MB |
| Gráfico de recursos | 1024×500 PNG/JPEG (banner da loja) |
| Screenshots telefone | Mín. 2, máx. 8. Resolução conforme guidelines (ex.: 1080×1920 ou 1440×2560) |
| Screenshots tablet 7" | Opcional (app suporta tablet no iOS; Android edge-to-edge) |
| Screenshots tablet 10" | Opcional |
| Categoria | Produtividade ou Negócios |
| E-mail de contato | E-mail de suporte visível ao usuário |
| Site | https://contrasync.com |
| Política de privacidade | https://contrasync.com/privacy-policy |
Idioma padrão: Português (Brasil). Adicione Inglês (EUA) se quiser alcance internacional.
3. Classificação de conteúdo
Painel → Política → Classificação de conteúdo
- Preencha o questionário IARC.
- Para Contrasync (B2B, sem conteúdo sensível): espere classificação Livre ou equivalente (sem violência, jogos de azar, conteúdo adulto).
- Salve e aplique a classificação.
4. Público-alvo e conteúdo
Painel → Política → Público-alvo e conteúdo
- Público-alvo: 18+ (app corporativo B2B).
- Não é app infantil.
- Declarações de anúncios: Não contém anúncios (salvo se mudar no futuro).
5. Segurança dos dados (Data safety)
Painel → Política → Segurança dos dados
Preencha com base no que o app coleta:
| Dado | Coletado? | Compartilhado? | Obrigatório? | Finalidade |
|---|---|---|---|---|
| Nome, e-mail, CPF (perfil) | Sim | Não (exceto processadores) | Sim (conta) | Funcionalidade da conta |
| Localização aproximada/precisa | Sim | Não | Não (opt-in) | Lançamento de horas |
| Fotos (câmera/QR) | Sim (frame da câmera) | Não | Não | Login QR |
| Identificadores do dispositivo | Sim | Não | Sim | Push notifications, sessão |
| Arquivos e documentos | Sim | Não | Depende do fluxo | Upload de compliance/contratos |
| Logs de diagnóstico | Sim (interno) | Não | Não | Estabilidade |
Marque:
- Dados criptografados em trânsito (HTTPS).
- Usuário pode solicitar exclusão (fluxo de exclusão de conta/empresa na plataforma).
- Política de privacidade vinculada.
6. Acesso ao app (revisão Google)
Painel → Política → Acesso ao app
O app não permite login livre — exige QR code do painel web ou master key.
- Selecione "Todo ou parte do app é restrito".
- Em Instruções de acesso, informe:
O app Contrasync é complementar ao painel web (contrasync.com).
Para acessar:
1. Abra o app.
2. Na tela de login, cole a chave de acesso fornecida abaixo
(campo "Código" / QR).
3. A sessão será criada automaticamente.
Chave de acesso para revisão:
[INSERIR MASTER_KEY DE PRODUÇÃO — ver seção "Credenciais para revisão"]
Conta de teste associada: usuário e empresa de demonstração pré-configurados
no backend. Não é necessário painel web ativo para login com a master key.
Funcionalidades principais após login:
- Lista de contratos e workflows
- Monitoramento de horas
- Compliance e documentos
- Notificações push- Se a master key expirar ou for rotacionada, atualize este campo antes de cada nova submissão.
Documentação de negócio: app-qr-login.
7. Declaração de permissões sensíveis
Painel → Política → Permissões sensíveis do app
Se solicitado para ACCESS_FINE_LOCATION:
- Justificativa: registro de localização no lançamento de horas do prestador.
- Vídeo demo opcional (30–60 s mostrando o fluxo de horas).
Para CAMERA:
- Justificativa: leitura de QR code para autenticação com o painel web.
8. Enviar o AAB
Painel → Testar e publicar → Produção (ou Teste interno na primeira validação)
Opção A — Upload manual (você já tem o .aab)
- Criar nova versão → faixa Produção (ou Teste interno para validar primeiro).
- Fazer upload do arquivo
.aab. - Preencha Notas da versão (o que mudou — ex.: "Versão inicial").
- Revise App bundle explorer (versão, permissões, tamanho).
Opção B — EAS Submit
bash
cd contrasync-reactnative-app
eas submit --platform android --path /caminho/para/app.aab --profile productionRequer Service Account configurada no EAS (ver eas-pipeline).
9. Países e preço
Painel → Crescer → Presença na loja → Países/regiões
- Selecione Brasil (mínimo) e demais países desejados.
- Preço: Gratuito.
10. Enviar para revisão
- Verifique que todas as seções obrigatórias estão com ✓ verde.
- Revisar versão → Iniciar lançamento para produção (ou teste interno).
- Tempo médio de revisão: algumas horas a 7 dias (primeira submissão pode demorar mais).
11. Após aprovação
- Copie a URL pública da Play Store (formato:
https://play.google.com/store/apps/details?id=com.contrasync). - Registre no backend (seção "Backend e URLs de loja" abaixo).
App Store Connect (Apple)
1. Pré-requisitos Apple
- https://developer.apple.com/account — PLA aceito, membership ativo.
- https://appstoreconnect.apple.com → Business → Agreements, Tax, and Banking — tudo verde.
- Certificados: se o
.ipajá foi gerado via EAS, certificados já existem no EAS. Para upload manual, confirme que o.ipaestá assinado para App Store.
2. Criar o app (primeira vez)
- Apps → + → Novo app.
- Plataformas: iOS (e iPadOS se quiser — app declara
supportsTablet). - Nome: Contrasync.
- Idioma principal: Português (Brasil).
- Bundle ID:
com.contrasync(deve existir em Certificates, Identifiers & Profiles → Identifiers). - SKU: ex.
contrasync-ios-001(identificador interno, imutável). - Acesso total ou limitado: Acesso total (salvo se usar TestFlight restrito).
3. Informações do app (App Information)
| Campo | Valor |
|---|---|
| Nome | Contrasync |
| Subtítulo | Até 30 caracteres. Ex.: "Gestão de prestadores PJ" |
| Categoria primária | Produtividade ou Negócios |
| Categoria secundária | Negócios ou Produtividade |
| URL de suporte | https://contrasync.com ou página de suporte |
| URL de marketing | https://contrasync.com (opcional) |
| Política de privacidade | https://contrasync.com/privacy-policy |
| Direitos de conteúdo | Marque conforme possui os direitos |
4. Preços e disponibilidade
- Preço: Gratuito (Tier 0).
- Disponibilidade: Brasil + países desejados.
5. Privacidade do app (App Privacy)
App Privacy → Get Started
Declare tipos de dados coletados (espelhe a tabela Data Safety do Google):
| Categoria Apple | Dados | Vinculado ao usuário? | Rastreamento? |
|---|---|---|---|
| Informações de contato | Nome, e-mail, telefone | Sim | Não |
| Identificadores | ID do usuário, ID do dispositivo | Sim | Não |
| Localização | Localização precisa | Sim | Não |
| Conteúdo do usuário | Documentos, fotos enviadas | Sim | Não |
| Diagnóstico | Dados de crash | Pode ser não vinculado | Não |
Finalidade: Funcionalidade do app, Análise (se aplicável).
Tracking: responda Não — o app não faz tracking cross-app para ads.
6. Classificação etária
Questionário App Store → espere 4+ ou 12+ (app corporativo sem conteúdo adulto).
7. Versão 1.0 — metadata da loja
Na aba App Store da versão:
| Campo | Orientação |
|---|---|
| Screenshots iPhone 6.7" | Obrigatório (iPhone 15 Pro Max). Mín. 1, recomendado 3–5 |
| Screenshots iPhone 6.5" | Obrigatório se suportar |
| Screenshots iPad 12.9" | Obrigatório se supportsTablet: true |
| Texto promocional | Opcional, 170 caracteres |
| Descrição | Até 4000 caracteres |
| Palavras-chave | Até 100 caracteres, separadas por vírgula |
| URL de suporte | Obrigatório |
| URL de marketing | Opcional |
| Versão | 1.0.0 (deve bater com o binário) |
| Copyright | Ex.: 2026 Contrasync |
8. Informações de revisão (Review Notes)
App Review Information
| Campo | Valor |
|---|---|
| Informações de contato | Nome, telefone, e-mail de quem responde à Apple |
| Notas | Ver texto abaixo |
| Anexo | Opcional — screenshot do fluxo de login |
Texto sugerido para Notas:
Contrasync é o app mobile complementar à plataforma web contrasync.com,
focada em gestão de prestadores de serviço (PJ), horas, compliance e contratos.
LOGIN:
O app não possui cadastro próprio. O usuário autentica com:
(a) QR code gerado no painel web logado, ou
(b) chave de acesso fornecida abaixo para revisão.
Chave de acesso para revisão:
[INSERIR MASTER_KEY DE PRODUÇÃO]
Cole a chave no campo de código na tela inicial do app.
PERMISSÕES:
- Câmera: escanear QR code de login
- Localização (when in use): registrar posição no lançamento de horas
- Notificações: alertas operacionais
CRIPTOGRAFIA:
O app usa apenas HTTPS/TLS padrão (ITSAppUsesNonExemptEncryption = false).9. Enviar o IPA
Opção A — Transporter (upload manual)
- Instale Apple Transporter (Mac) ou use
xcrun altool/iTMSTransporter. - Faça login com Apple ID do time de desenvolvimento.
- Arraste o
.ipa→ Deliver. - Aguarde processamento (5–30 min). Erros comuns: assinatura inválida, bundle ID divergente, versão/build duplicada.
Opção B — EAS Submit
bash
cd contrasync-reactnative-app
eas submit --platform ios --path /caminho/para/app.ipa --profile productionRequer App Store Connect API Key no EAS (ver eas-pipeline).
10. Selecionar build e enviar
- Após processamento, o build aparece em TestFlight e na versão da App Store.
- Na versão 1.0.0, seção Build → + → selecione o build enviado.
- Preencha Export Compliance: Não usa criptografia não isenta (já declarado no Info.plist).
- Adicionar para revisão → Enviar para análise.
11. TestFlight (recomendado antes da produção)
- TestFlight → build processado → adicionar testadores internos.
- Valide login (master key), push, câmera, localização.
- Quando estável, promova a mesma versão para App Store.
12. Após aprovação
- Lançar esta versão (manual ou automático após aprovação).
- URL pública do app:
https://apps.apple.com/br/app/contrasync/id6782732793. - Registre no backend (próxima seção).
Assets visuais
Ícones (já no repositório)
| Asset | Caminho | Uso |
|---|---|---|
| Ícone principal | assets/images/icon.png | iOS 1024×1024, base |
| Adaptive foreground | assets/images/android-icon-foreground.png | Android |
| Adaptive background | assets/images/android-icon-background.png | Android |
| Monochrome | assets/images/android-icon-monochrome.png | Android 13+ / notificações |
| Splash | assets/images/splash-icon.png | Não vai para listing |
Screenshots recomendados (mínimo 3 telas)
Capture no device ou simulador com dados realistas:
- Login / QR — tela inicial
- Home / Contratos — lista principal
- Monitoramento / Horas — diferencial do produto
- Compliance ou Prestadores — segundo módulo forte
- Detalhe de contrato — opcional
Resoluções de referência:
| Plataforma | Tamanho |
|---|---|
| iPhone 6.7" | 1290 × 2796 px |
| iPhone 6.5" | 1284 × 2778 px |
| iPad 12.9" | 2048 × 2732 px |
| Android phone | 1080 × 1920 px mínimo |
Dica: use frames do Figma ou ferramentas como screenshots.pro para apresentação profissional.
Backend e URLs de loja
Após publicação, configure o backend para o modal de atualização do app.
1. URLs das lojas (storeUrl)
Endpoint: GET /app/versions — campo storeUrl por plataforma.
Registre na tabela app_versions (ou painel admin, se existir):
| platform | storeUrl |
|---|---|
ios | https://apps.apple.com/br/app/contrasync/id6782732793 |
android | https://play.google.com/store/apps/details?id=com.contrasync |
Documentação: business/app-versions, api/app-versions.
2. Versão inicial no backend
Crie registro para cada plataforma:
json
{
"version": "1.0.0",
"platform": "ios",
"type": "release",
"delivery": "store",
"forceUpdate": false,
"title": "Contrasync disponível na App Store",
"description": "Baixe a versão mais recente na loja.",
"storeUrl": "https://apps.apple.com/br/app/contrasync/id6782732793",
"minSupportedVersion": "1.0.0",
"launchAt": "2026-06-21T12:00:00.000Z"
}Repita para android com a URL da Play Store.
3. Master key para revisão de loja
Variável no backend (nome exato conforme deploy): chave administrativa trocada por sessão em POST /app/exchange-token.
- Usada por revisores Google/Apple e QA interno.
- Deve apontar para usuário/empresa de demonstração com dados realistas.
- Rotacionar após publicação se a chave foi exposta nas notas de revisão.
Documentação: authentication, app-qr-login.
4. API de produção no build
O app lê EXPO_PUBLIC_API_URL em build time (config/api.ts).
Confirme que o .ipa/.aab foram compilados com a URL de produção, não ngrok. Para rebuild:
bash
EXPO_PUBLIC_API_URL=https://[URL-PRODUCAO-API] eas build --platform all --profile productionFirebase e push notifications
| Item | Status no projeto |
|---|---|
google-services.json | Presente, package com.contrasync |
Expo Push (expo-notifications) | Usa projectId do EAS |
| FCM / APNs | Configurados via EAS credentials no build |
Para iOS em produção, o EAS configura APNs key automaticamente no primeiro build iOS. Se push falhar pós-publicação:
- Verifique certificado APNs no EAS:
eas credentials→ iOS. - Confirme permissão de notificação no device.
- Teste token via Expo push tool.
Automação futura (EAS + CI)
Depois do primeiro envio manual, configure automação conforme eas-pipeline:
| Item | Onde configurar |
|---|---|
EXPO_TOKEN | GitHub Secrets |
| Android Service Account JSON | EAS credentials |
| App Store Connect API Key (.p8) | EAS credentials |
| Track Android | eas.json → hoje internal; mudar para production quando estável |
Comando manual equivalente ao CI:
bash
eas build --platform all --profile production --auto-submitSubmit de binário local (sem rebuild):
bash
eas submit --platform ios --path ./app.ipa --profile production
eas submit --platform android --path ./app.aab --profile productionChecklist pós-publicação
- [ ] URLs
storeUrlregistradas no backend (iOS + Android). - [ ] Registro
app_versionspara1.0.0em ambas plataformas. - [ ] Master key de revisão rotacionada (se exposta).
- [ ] TestFlight / teste interno validado por QA.
- [ ] Push notifications testadas em produção.
- [ ] Login QR testado com painel web de produção.
- [ ] Credenciais EAS Submit configuradas para releases futuras.
- [ ]
eas.jsontrack Android ajustado (internal→productionquando pronto). - [ ] Site
contrasync.commenciona links das lojas (marketing).
Troubleshooting
Google Play: "You need to upload an APK or Android App Bundle"
Crie uma versão na faixa correta (Produção ou Teste interno) e faça upload do .aab assinado.
Google Play: rejeição por login
Forneça master key válida em Acesso ao app e repita submissão. Confirme que POST /app/exchange-token responde 200 em produção.
Apple: build não aparece na versão
Aguarde processamento (até 30 min). Verifique e-mail de "Invalid Binary" da Apple.
Apple: Missing Compliance
Na versão, responda export compliance: No (non-exempt encryption).
Apple: Guideline 2.1 — App Completeness
Inclua credenciais funcionais nas notas de revisão. Teste a master key antes de enviar.
Apple: 403 PLA / Access forbidden
Account Holder deve aceitar Program License Agreement em https://developer.apple.com/account. Detalhes: eas-pipeline.
Versão/build duplicada
Incremente versionCode (Android) ou buildNumber (iOS). Com EAS, autoIncrement: true no perfil production faz isso automaticamente.
Keystore Android perdido
Impossível atualizar o app existente na Play Store. Contate Google support em casos extremos; sempre faça backup do keystore do EAS: eas credentials → Android → download keystore.