Feature Flags in Swift: So aktivieren Sie Funktionen ohne neuen Build und ohne die Produktion zu gefährden
Stellen Sie sich vor: Sie haben ein neues dunkles Design ausgerollt, und Benutzer berichten, dass der Text unleserlich ist. Oder Sie haben einen komplexen Empfehlungsalgorithmus hinzugefügt, der auf älteren iPhones mit Verzögerungen läuft. Im klassischen Szenario korrigieren Sie den Code, erstellen einen Build, durchlaufen das Review, warten auf den App Store – einen Tag oder länger. Die ganze Zeit lebt der Fehler in der Produktion.
Feature Flags (oder Feature Toggles) sind eine Technik, die es ermöglicht, Funktionalität einer App ein- und auszuschalten, ohne neuen Code bereitzustellen. Im Wesentlichen handelt es sich um bedingte Anweisungen, die den Wert eines Flags prüfen, wobei der Wert remote gespeichert wird – auf einem Server oder in Remote Config. Ein einziger Schalter – und die Funktion erscheint entweder bei allen oder verschwindet innerhalb von Sekunden.
In diesem Artikel werden wir behandeln, wie man Feature Flags in Swift implementiert, welche Muster man verwendet und wie man sich nicht ins eigene Bein schießt. Los geht's!
Warum Feature Flags in der iOS-Entwicklung wichtig sind
Viele denken, dass Feature-Flags nur für A/B-Tests da sind. Tatsächlich gibt es viel mehr Anwendungsszenarien:
- Canary-Releases – Sie aktivieren eine neue Funktion für 5 % der Benutzer, überwachen Abstürze, und wenn alles in Ordnung ist, rollen Sie sie für alle aus.
- Kill-Switches – Wenn etwas schiefgeht, deaktivieren Sie die Funktionalität einfach remote, ohne den Build zurückzusetzen.
- Schrittweiser Rollout – Sie zeigen die Funktion zuerst für iOS 17+ an, dann für ältere Versionen.
- Bezahlte Funktionen – Sie verbergen Premium-Funktionen hinter einem Abonnement und verwalten die Flags im Backend.
- Experimente und A/B-Tests – Sie testen Hypothesen an echten Benutzern, ohne separate Branches zu erstellen.
Dies ist besonders relevant für Swift-Projekte, bei denen das Binärpaket einmal erstellt und dann im Store abgelegt wird. Ohne Feature-Flags können Sie nicht schnell auf Probleme reagieren – nur durch einen neuen Release.
Architektur von Feature Flags in Swift
Eine einfache Implementierung ist ein Wörterbuch [String: Bool], das vom Server kommt. In einem Produktionsprojekt ist es jedoch besser, eine ordentliche Abstraktion zu erstellen. Hier sind die Schlüsselkomponenten:
- FeatureFlagProvider – die Datenquelle (Remote Config, Ihre API, lokale Datei).
- FeatureFlagManager – ein Singleton oder Dienst, der die Flags cached und an die Views weitergibt.
- FeatureFlagKey – ein Enum mit typisierten Schlüsseln, um Strings nicht im Code zu verteilen.
Lassen Sie uns eine einfache, aber funktionierende Implementierung in Swift schreiben.
Schritt 1: Enum mit Schlüsseln definieren
enum FeatureFlagKey: String, CaseIterable { case darkMode = "dark_mode" case newOnboarding = "new_onboarding" case premiumAnalytics = "premium_analytics" case experimentalFeed = "experimental_feed"}Die Verwendung eines Enums anstelle von Strings stellt sicher, dass Sie sich nicht im Flag-Namen vertippen. CaseIterable wird für einen Debug-Bildschirm nützlich sein.
Schritt 2: Provider – Flags aus Firebase Remote Config abrufen
import FirebaseRemoteConfig
final class RemoteConfigProvider: FeatureFlagProvider { private let remoteConfig = RemoteConfig.remoteConfig() func fetchFlags(completion: @escaping ([String: Bool]) -> Void) { remoteConfig.fetch(withExpirationDuration: 3600) { status, error in if status == .success { self.remoteConfig.activate { _, _ in let flags = FeatureFlagKey.allCases.reduce(into: [String: Bool]()) { result, key in result[key.rawValue] = self.remoteConfig.configValue(forKey: key.rawValue).boolValue } completion(flags) } } else { print("Failed to fetch remote config: \\(error?.localizedDescription ?? "")")