Firebase Remote Config

Feature Flags e A/B Testing Dinamico con Firebase Remote Config in App SwiftUI

Potere attivare o disattivare una funzionalità, modificare il testo di un paywall o testare diverse variazioni di interfaccia grafica senza dover sottoporre un nuovo aggiornamento ad Apple App Store è un enorme vantaggio competitivo. **Firebase Remote Config** consente di fare esattamente questo.

1. Inizializzare Remote Config con Valori di Default

È sempre consigliato definire un dizionario di valori di default locali per garantire che l'app funzioni istantaneamente anche in assenza di rete al primo avvio:

import SwiftUI
import FirebaseRemoteConfig

class ConfigManager: ObservableObject {
    static let shared = ConfigManager()
    @Published var isNewPaywallEnabled: Bool = false
    @Published var promoBannerText: String = ""
    
    private var remoteConfig = RemoteConfig.remoteConfig()
    
    private init() {
        let settings = RemoteConfigSettings()
        settings.minimumFetchInterval = 3600 // 1 ora in produzione
        remoteConfig.configSettings = settings
        
        // Impostazione valori predefiniti
        let defaults: [String: NSObject] = [
            "is_new_paywall_enabled": false as NSObject,
            "promo_banner_text": "Benvenuto nella nostra app!" as NSObject
        ]
        remoteConfig.setDefaults(defaults)
        
        listenForUpdates()
    }
    
    func fetchAndActivateConfig() {
        remoteConfig.fetchAndActivate { [weak self] status, error in
            if status == .successFetchedFromRemote || status == .successUsingPreFetchedData {
                self?.applyConfigValues()
            }
        }
    }
    
    // Listener per aggiornamenti in tempo reale (Firebase Remote Config Realtime)
    private func listenForUpdates() {
        remoteConfig.addOnConfigUpdateListener { [weak self] configUpdate, error in
            guard error == nil else { return }
            self?.remoteConfig.activate { _, _ in
                self?.applyConfigValues()
            }
        }
    }
    
    private func applyConfigValues() {
        DispatchQueue.main.async {
            self.isNewPaywallEnabled = self.remoteConfig["is_new_paywall_enabled"].boolValue
            self.promoBannerText = self.remoteConfig["promo_banner_text"].stringValue ?? ""
        }
    }
}

2. Integrazione nelle Viste SwiftUI

In una vista SwiftUI possiamo reagire dinamicamente al valore dei feature flags osservando l'oggetto ConfigManager:

struct MainView: View {
    @StateObject private var config = ConfigManager.shared
    
    var body: some View {
        VStack(spacing: 20) {
            Text(config.promoBannerText)
                .font(.headline)
                .padding()
                .background(Color.blue.opacity(0.1))
                .cornerRadius(10)
            
            if config.isNewPaywallEnabled {
                NewPaywallButton()
            } else {
                ClassicPaywallButton()
            }
        }
        .onAppear {
            config.fetchAndActivateConfig()
        }
    }
}

Conclusione

Remote Config trasforma la gestione del prodotto mobile consentendo esperimenti guidati dai dati e kill-switch istantanei in caso di bachi. Per implementare feature flags nella tua app iOS, contatta diallooyunus@gmail.com.

Yunus Diallo (DialloDev)

Fondatore di Dywtal Digital a Parma (Italia), sviluppatore iOS con esperienza in prodotti mobile ad alto impatto e Growth Engineering.