Firebase Remote Config
🐾 NutriPaw App

Remote Config — Guía de Implementación

Feature flags dinámicos, A/B testing y configuración sin publicar actualizaciones en tienda · Proyecto: nutripaw-prod-es

Firebase Project nutripaw-prod-es
5 parámetros configurados
Plataformas: Android (Kotlin) + iOS (Swift)
Usuarios activos: 4.200
⚙️

Plantilla Remote Config — Parámetros de NutriPaw

Live
Parámetro Tipo Valor por defecto Estado Descripción
welcome_message string "Bienvenido a NutriPaw" activo Mensaje en pantalla de inicio. Editable sin update.
is_ai_photo_enabled boolean false rollout 20% Análisis IA de fotos — solo iOS/España ≤20% usuarios.
discount_banner_pct number 0 oculto % descuento en banner de inicio (0 = banner oculto).
ai_photo_max_daily number 3 activo Límite de análisis IA por usuario por día.
onboarding_variant string "A" A/B test Variante de onboarding activa para el segmento test.
📄

remote_config.json — Plantilla generada

Desplegada v4
JSON · remote_config.json
{ "conditions": [ { "name": "iOS Spain 20pct rollout", "expression": "device.os == 'ios' && device.country in ['es'] && percent <= 20", "tagColor": "ORANGE" }, { "name": "Black Friday", "expression": "dateTime >= dateTime('2026-11-27T00:00:00', 'Europe/Madrid')", "tagColor": "BLUE" } ], "parameters": { "welcome_message": { "defaultValue": { "value": "Bienvenido a NutriPaw" }, "description": "Mensaje pantalla inicio — editable sin update" }, "is_ai_photo_enabled": { "defaultValue": { "value": "false" }, "conditionalValues": { "iOS Spain 20pct rollout": { "value": "true" } }, "description": "Feature flag análisis IA fotos — rollout iOS/ES 20%" }, "discount_banner_pct": { "defaultValue": { "value": "0" }, "conditionalValues": { "Black Friday": { "value": "15" } }, "description": "% descuento banner (0 = oculto)" }, "ai_photo_max_daily": { "defaultValue": { "value": "3" } }, "onboarding_variant": { "defaultValue": { "value": "A" } } }, "version": { "versionNumber": "4", "updateOrigin": "REST_API", "updateType": "INCREMENTAL_UPDATE" } }
⚠️
Revisión obligatoria antes de desplegar Revisar el archivo remote_config.json y confirmar que las condiciones y valores son correctos. Una vez verificado, ejecutar el comando de deploy.
bash · CLI commands
# 1. Obtener plantilla actual npx -y firebase-tools@latest remoteconfig:get -o remote_config.json # 2. Editar remote_config.json (añadir condiciones y valores) # 3. Mapear en firebase.json # { "remoteconfig": { "template": "remote_config.json" } } # 4. Desplegar (solo tras revisión del usuario) npx -y firebase-tools@latest deploy --only remoteconfig # 5. Verificar historial de versiones npx -y firebase-tools@latest remoteconfig:versions:list
🎯

Condiciones configuradas

iOS Spain 20% rollout ACTIVA
device.os == 'ios' && device.country in ['es'] && percent <= 20
is_ai_photo_enabled → true
Black Friday 2026 PROGRAMADA
dateTime >= dateTime('2026-11-27T00:00:00', 'Europe/Madrid')
discount_banner_pct → 15
💡
Extensión futura Cuando la IA supere un 7-día retention >15%, ampliar el rollout al 100% editando solo percent <= 100 y redeployando. Sin pasar por tienda.
🚀

Flujo de despliegue

  • Inicializar proyecto Firebase

    Login con Firebase CLI. Proyecto nutripaw-prod-es creado. google-services.json y GoogleService-Info.plist en los módulos de cada plataforma.

  • Dependencias Gradle / Swift Package

    BoM Firebase 32.7.0 añadido. firebase-config-ktx + firebase-analytics-ktx (Android). FirebaseRemoteConfig + FirebaseAnalytics (iOS SPM).

  • Defaults en app

    Valores por defecto en remote_config_defaults.xml (Android) y RemoteConfigDefaults.plist (iOS) para garantizar comportamiento offline.

  • 4

    Desplegar plantilla v4

    Revisar remote_config.json → ejecutar firebase deploy --only remoteconfig.

    npx -y firebase-tools@latest deploy --only remoteconfig
  • 5

    Monitorizar & expandir rollout

    Analítica de retención en Firebase Analytics. Si target superado → ampliar condición al 100% sin update de tienda.

🤖

SDK Android — Kotlin

Código para MainActivity.kt — NutriPaw Android

Kotlin · remote_config_defaults.xml
<defaultsMap> <entry> <key>welcome_message</key> <value>Bienvenido a NutriPaw</value> </entry> <entry> <key>is_ai_photo_enabled</key> <value>false</value> </entry> <entry> <key>discount_banner_pct</key> <value>0</value> </entry> <entry> <key>ai_photo_max_daily</key> <value>3</value> </entry> </defaultsMap>
Kotlin · NutriPawActivity.kt
val remoteConfig = Firebase.remoteConfig remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults) // Fetch + Activate al iniciar remoteConfig.fetchAndActivate() .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Feature flag análisis IA val aiEnabled = remoteConfig .getBoolean("is_ai_photo_enabled") toggleAiPhotoButton(aiEnabled) // Mensaje bienvenida dinámico val msg = remoteConfig .getString("welcome_message") binding.tvWelcome.text = msg // Banner descuento val pct = remoteConfig .getLong("discount_banner_pct") if (pct > 0) showDiscountBanner(pct) } }
🍎

SDK iOS — Swift

Código para AppDelegate.swift + HomeViewController.swift

Swift · RemoteConfigDefaults.plist
<dict> <key>welcome_message</key> <string>Bienvenido a NutriPaw</string> <key>is_ai_photo_enabled</key> <false/> <key>discount_banner_pct</key> <integer>0</integer> <key>ai_photo_max_daily</key> <integer>3</integer> </dict>
Swift · HomeViewController.swift
import FirebaseRemoteConfig let remoteConfig = RemoteConfig.remoteConfig() remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults") remoteConfig.fetchAndActivate { status, error in guard error == nil else { return } // Feature flag — análisis IA fotos let aiEnabled = remoteConfig["is_ai_photo_enabled"] .boolValue self.toggleAiPhotoButton(aiEnabled) // Mensaje de bienvenida let msg = remoteConfig["welcome_message"] .stringValue ?? "Bienvenido" self.welcomeLabel.text = msg // Banner Black Friday let pct = remoteConfig["discount_banner_pct"] .numberValue.intValue if pct > 0 { self.showDiscountBanner(pct) } }

Estrategias de carga recomendadas

Activar en arranque Recomendada

Activar valores ya descargados al iniciar app. Descargar nuevos en background para la próxima sesión. Minimiza tiempo de espera.

Real-time listener Avanzada

SDK escucha cambios del servidor y actualiza la app al instante. Ideal para experimentos que requieren activación inmediata.

ℹ️
Throttling de fetchs Firebase limita los fetchs a 5 por hora en producción. Usar el intervalo mínimo recomendado (12h para producción, 0s en debug). remoteConfig.settings.minimumFetchInterval
📋

Historial de versiones · nutripaw-prod-es

  • v4
    Añadida condición Black Friday + banner descuento Desplegada vía Firebase CLI · origen: REST_API
    hoy 14:32
  • v3
    Rollout 20% iOS España — is_ai_photo_enabled Condición percentil añadida · prueba A/B interna
    hace 3 días
  • v2
    onboarding_variant activado para test Variante B para nuevos usuarios registrados ≥ jun 2026
    hace 1 sem
  • v1
    Setup inicial — 5 parámetros base welcome_message, is_ai_photo_enabled, discount_banner_pct, ai_photo_max_daily, onboarding_variant
    hace 2 sem