Deployments Canary en Swift: cómo implementar funciones sin miedo

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué Canary no es sobre pajaritos?

\n\n

Imagine: lanza una nueva función en su aplicación. Todo está probado, el CI/CD está en verde, la revisión de código está hecha. Una hora después: una avalancha de reseñas negativas, errores, caídas. ¿Le suena familiar?

\n\n

En el mundo del desarrollo iOS hay una solución elegante: Canary deployments (despliegues canarios). Es una técnica donde solo un pequeño porcentaje de usuarios (normalmente del 1 al 5%) recibe la nueva versión de la función. Si todo va bien, se despliega para todos. Si no, se revierte con un daño mínimo.

\n\n

En este artículo, analizaremos cómo implementar Canary deployments en Swift usando feature flags y Firebase Remote Config. Sin magia, solo código funcional y prácticas reales.

\n\n

¿Qué es un Canary deployment y por qué es necesario en Swift?

\n\n

El término proviene de la industria minera: los mineros llevaban canarios para que su estado alertara sobre fugas de gas. En TI es lo mismo: un pequeño grupo de usuarios actúa como "canario", mostrando si la nueva versión funciona.

\n\n

¿Por qué es importante para los desarrolladores de Swift?

\n\n
    \n
  • Seguridad: No arriesga a todos los usuarios a la vez
  • \n
  • Pruebas A/B: Puede comparar métricas de la función antigua y la nueva
  • \n
  • Flexibilidad: La reversión toma segundos, no días
  • \n
  • Control: Puede activar la función selectivamente para testers o usuarios beta
  • \n
\n\n

En Swift usamos feature flags (banderas de funcionalidad) — son variables booleanas que activan/desactivan funcionalidades sin una nueva compilación. Las combinamos con configuración remota (Firebase, LaunchDarkly) y obtenemos un Canary deployment completo.

\n\n

Arquitectura de Canary deployment en Swift

\n\n

Construyamos un sistema simple pero robusto. Necesitaremos:

\n\n
    \n
  1. Feature Flag Provider — servicio que proporciona el estado de la función
  2. \n
  3. Remote Config — almacenamiento remoto de banderas (usamos Firebase)
  4. \n
  5. Lógica de distribución — quién entra en el grupo canario
  6. \n
  7. Monitoreo — recopilamos métricas e informes de fallos
  8. \n
\n\n

Paso 1: Configuración de Firebase Remote Config

\n\n

Primero, agregamos Firebase al proyecto. Si aún no lo ha hecho, siga la documentación oficial. Luego, creamos los parámetros de Remote Config:

\n\n
    \n
  • new_checkout_enabled — activa el nuevo proceso de pago
  • \n
  • new_checkout_percentage — porcentaje de usuarios que lo verán (0.0–1.0)
  • \n
  • new_checkout_deadline — fecha de activación completa (opcional)
  • \n
\n\n

En la consola de Firebase, establecemos los valores por defecto: false, 0.0, nil.

\n\n

Paso 2: Feature Flag Provider en Swift

\n\n

Creamos un protocolo y su implementación. Esto permitirá cambiar fácilmente entre Firebase, banderas locales o mocks para pruebas.

\n\n
import 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 "" // ISO8601 string\n        }\n    }\n}\n\n// MARK: - Firebase Implementation\nfinal class FirebaseFeatureFlagProvider: FeatureFlagProvider {\n    private let remoteConfig = RemoteConf                

Blogs

Book Recommendations