Canary-Deployments in Swift: Wie Sie Funktionen ohne Angst einführen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Canary nichts mit Vögeln zu tun hat?

\n\n

Stellen Sie sich vor: Sie veröffentlichen eine neue Funktion in Ihrer App. Alles wurde getestet, CI/CD ist grün, das Code-Review bestanden. Eine Stunde später – eine Flut negativer Bewertungen, Bugs, Abstürze. Kommt Ihnen das bekannt vor?

\n\n

In der Welt der iOS-Entwicklung gibt es eine elegante Lösung – Canary-Deployments (kanarische Bereitstellungen). Dies ist eine Technik, bei der nur ein kleiner Prozentsatz der Benutzer (normalerweise 1–5 %) die neue Version einer Funktion erhält. Wenn alles gut läuft, rollen wir sie für alle aus. Wenn nicht, machen wir einen Rückzieher mit minimalem Schaden.

\n\n

In diesem Artikel werden wir uns ansehen, wie man Canary-Deployments in Swift mit Feature-Flags und Firebase Remote Config implementiert. Keine Zauberei – nur funktionierender Code und echte Praktiken.

\n\n

Was ist ein Canary-Deployment und warum wird es in Swift benötigt?

\n\n

Der Begriff stammt aus dem Bergbau: Bergleute nahmen Kanarienvögel mit, die durch ihr Verhalten auf Gasaustritte hinwiesen. In der IT ist es dasselbe: Eine kleine Gruppe von Benutzern dient als „Kanarienvogel“ und zeigt, ob die neue Version funktioniert.

\n\n

Warum ist das für Swift-Entwickler wichtig?

\n\n
    \n
  • Sicherheit: Sie riskieren nicht alle Benutzer auf einmal
  • \n
  • A/B-Testing: Sie können die Metriken der alten und neuen Funktion vergleichen
  • \n
  • Flexibilität: Ein Rollback dauert Sekunden, nicht Tage
  • \n
  • Kontrolle: Sie können die Funktion gezielt für Tester oder Beta-Benutzer aktivieren
  • \n
\n\n

In Swift verwenden wir Feature-Flags (Funktionsschalter) – das sind boolesche Variablen, die Funktionalitäten ohne neuen Build ein- oder ausschalten. Kombinieren wir sie mit einer Remote-Konfiguration (Firebase, LaunchDarkly) – und wir erhalten ein vollwertiges Canary-Deployment.

\n\n

Architektur eines Canary-Deployments in Swift

\n\n

Lassen Sie uns ein einfaches, aber zuverlässiges System aufbauen. Wir benötigen:

\n\n
    \n
  1. Feature-Flag-Provider – ein Dienst, der den Status einer Funktion ausgibt
  2. \n
  3. Remote Config – ein entferntes Speicher für Flags (wir verwenden Firebase)
  4. \n
  5. Verteilungslogik – wer in die Kanarienvogel-Gruppe fällt
  6. \n
  7. Monitoring – wir sammeln Metriken und Crash-Reports
  8. \n
\n\n

Schritt 1: Einrichtung von Firebase Remote Config

\n\n

Als erstes fügen wir Firebase zum Projekt hinzu. Falls Sie dies noch nicht getan haben, folgen Sie der offiziellen Dokumentation. Dann erstellen wir Remote-Config-Parameter:

\n\n
    \n
  • new_checkout_enabled – aktiviert den neuen Checkout
  • \n
  • new_checkout_percentage – Prozentsatz der Benutzer, die ihn sehen (0.0–1.0)
  • \n
  • new_checkout_deadline – Datum der vollständigen Aktivierung (optional)
  • \n
\n\n

In der Firebase-Konsole legen wir Standardwerte fest: false, 0.0, nil.

\n\n

Schritt 2: Feature-Flag-Provider in Swift

\n\n

Wir erstellen ein Protokoll und eine Implementierung. Dies ermöglicht einen einfachen Wechsel zwischen Firebase, lokalen Flags oder Mocks für Tests.

\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

Buchempfehlungen