API v1

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

ChaveExemploSignificado
min_required_version_ios1.0.39Menor CFBundleShortVersionString aceito. Abaixo disso → bloqueio total.
latest_version_ios1.0.41Última versão publicada. Abaixo disso (mas ≥ mínima) → sugestão dispensável.
update_messageNova 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:

EstadoCondiçãoComportamento
.mandatoryversão < min_required_version_iosAlerta bloqueante, único botão "Atualizar" → App Store. Sem dispensar.
.optionalversão < latest_version_iosAlerta dispensável, exibido uma vez por sessão (optionalPrompted).
.upToDateversão ≥ última publicadaNada 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.