Introdução: Por que Canary não é só sobre pássaros?
\n\nImagine: você lança um novo recurso no seu aplicativo. Tudo foi testado, o CI/CD está verde, o code review foi aprovado. Uma hora depois — uma enxurrada de avaliações negativas, bugs, crashes. Parece familiar?
\n\nNo mundo do desenvolvimento iOS, existe uma solução elegante — os Canary deployments (implantação canário). É uma técnica onde a nova versão de um recurso é liberada apenas para uma pequena porcentagem de usuários (geralmente 1–5%). Se tudo correr bem, é distribuída para todos. Se não, é revertida com danos mínimos.
\n\nNeste artigo, vamos explorar como implementar Canary deployments em Swift usando feature flags e Firebase Remote Config. Sem mágica — apenas código funcional e práticas reais.
\n\nO que é Canary deployment e por que usá-lo em Swift?
\n\nO termo vem da indústria de mineração: mineiros levavam canários para detectar vazamentos de gás. Em TI, é a mesma coisa: um pequeno grupo de usuários serve como "canário", indicando se a nova versão funciona corretamente.
\n\nPor que isso é importante para desenvolvedores Swift?
\n\n- \n
- Segurança: Você não arrisca todos os usuários de uma vez \n
- Teste A/B: É possível comparar métricas entre a versão antiga e a nova \n
- Flexibilidade: O rollback leva segundos, não dias \n
- Controle: Você pode ativar o recurso seletivamente para testadores ou usuários beta \n
Em Swift, usamos feature flags (flags de recurso) — variáveis booleanas que ativam/desativam funcionalidades sem um novo build. Combinamos isso com configuração remota (Firebase, LaunchDarkly) — e temos um Canary deployment completo.
\n\nArquitetura do Canary deployment em Swift
\n\nVamos construir um sistema simples, mas robusto. Precisaremos de:
\n\n- \n
- Feature Flag Provider — serviço que informa o status do recurso \n
- Remote Config — armazenamento remoto das flags (usaremos Firebase) \n
- Lógica de distribuição — quem entra no grupo canário \n
- Monitoramento — coleta de métricas e relatórios de crash \n
Passo 1: Configuração do Firebase Remote Config
\n\nPrimeiro, adicione o Firebase ao projeto. Se ainda não fez isso, siga a documentação oficial. Em seguida, crie os parâmetros do Remote Config:
\n\n- \n
new_checkout_enabled— ativa o novo checkout \n new_checkout_percentage— porcentagem de usuários que verão o recurso (0.0–1.0) \n new_checkout_deadline— data para ativação total (opcional) \n
No console do Firebase, defina os valores padrão: false, 0.0, nil.
Passo 2: Feature Flag Provider em Swift
\n\nCrie um protocolo e sua implementação. Isso permite alternar facilmente entre Firebase, flags locais ou mocks para testes.
\n\nimport Foundation\nimport FirebaseRemoteConfig\n\n// MARK: - Protocol\nprotocol FeatureFlagProvider {\n func isFeatureEnabled(_ feature: FeatureFlag) -> Bool\n func percentage(for feature: FeatureFlag) -> Double\n func fetchRemoteConfig(completion: @escaping (Bool) -> Void)\n}\n\n// MARK: - Feature Flags\nenum FeatureFlag: String, CaseIterable {\n case newCheckout = "new_checkout_enabled"\n case newCheckoutPercentage = "new_checkout_percentage"\n case newCheckoutDeadline = "new_checkout_deadline"\n \n var defaultValue: Any {\n switch self {\n case .newCheckout: return false\n case .newCheckoutPercentage: return 0.0\n case .newCheckoutDeadline: return "" // string ISO8601\n }\n }\n}\n\n// MARK: - Implementação com Firebase\nfinal class FirebaseFeatureFlagProvider: FeatureFlagProvider {\n private let remoteConfig = RemoteConf\n