Atualização Obrigatória / Opcional — iOS
RemoteConfigService · AppUpdateChecker · AppVersionStatus
Equivalente Android: RemoteConfigHelper
Controle de versão mínima via Firebase Remote Config, sem depender da API e sem novo deploy. Bloqueia versões antigas demais (hard block) ou apenas sugere atualização. O update aponta para a App Store.
Onde roda:
AppUpdateChecker.enforceUpdateIfNeeded() é chamado no LoginViewController. O RemoteConfigService (singleton .shared) decide a obrigatoriedade; o AppUpdateChecker exibe o alerta e abre a loja.
Chaves no Firebase Remote Config
| Chave | Exemplo | Significado |
|---|---|---|
min_required_version_ios | 1.0.39 | Menor CFBundleShortVersionString aceito. Abaixo disso → bloqueio total. |
latest_version_ios | 1.0.41 | Última versão publicada. Abaixo disso (mas ≥ mínima) → sugestão dispensável. |
update_message | Nova versão disponível… | Mensagem opcional no alerta. Vazia → string local (update.optional.message etc). |
Fail-safe: valores remotos vazios/inválidos ou erro no
fetch → tratado como upToDate; nunca bloqueia por engano. Mesma estratégia do Android.
Estados de Versão
RemoteConfigService.shared.versionStatus() retorna um AppVersionStatus:
| Estado | Condição | Comportamento |
|---|---|---|
.mandatory | versão < min_required_version_ios | Alerta bloqueante, único botão "Atualizar" → App Store. Sem dispensar. |
.optional | versão < latest_version_ios | Alerta dispensável, exibido uma vez por sessão (optionalPrompted). |
.upToDate | versão ≥ última publicada | Nada a fazer. |
Abertura da App Store
A URL da loja é resolvida pelo bundleId (independente da versão — a decisão é do Remote Config) via iTunes Lookup API, obtendo o trackId:
itms-apps://itunes.apple.com/app/id{trackId}
// fallback:
itms-apps://itunes.apple.com/lookup?bundleId={bundleId}
Paridade Android: o fluxo
.mandatory equivale ao In-App Update IMMEDIATE (hard block) do Android. O .optional equivale ao prompt dispensável. As chaves diferem apenas no sufixo de plataforma (_ios vs _android); update_message é compartilhada.