Veröffentlicht am 30. März 2022

Leistungsstarke Feature Flags in Swift + iOS

Feature Flags ermöglichen es Ihnen, ein Feature langsam auszurollen, anstatt einen risikoreichen Big Bang zu starten, und sind äußerst hilfreich, wenn Sie sie in einer Umgebung für kontinuierliche Integration und Continuous Delivery einsetzen.

Kody O'Connell
von Kody O'Connell
logo, company name

Die Entwicklung eines Feature Flags gehört jedoch in der Regel nicht zu den Kernkompetenzen Ihres Unternehmens und kann von anderen Entwicklungsaufgaben ablenken.

Ich bin Kody, Developer Advocate bei Optimizely. In diesem Blog-Beitrag zeige ich Ihnen in 8 Schritten, wie Sie den Wert leistungsfähiger Feature Flags nutzen können, indem Sie ein Feature in Swift + iOS mit Optimizely Rollouts kundenindividuell ausrollen: ein völlig kostenloses Produkt.

Hinweis: Wenn Sie keine iOS-Anwendung zum Testen haben, empfehlen wir Ihnen, den vollständigen Quellcode der Hello World App zu verwenden.

Bonushinweis: Ich hoste auch eine Sitzung zum Thema Feature Flags für Mobile Apps.

Schritte zur Einführung einer Funktion

1. Einrichten der Feature Flags Schnittstelle

Erstellen Sie hier ein kostenloses Optimizely Rollouts Konto.

Navigieren Sie in der Rollouts-Oberfläche zu 'Features > Neues Feature erstellen' und erstellen Sie ein Feature Flag namens 'hello_world'.

Feature overview


Um Ihr 'hello_world' Feature mit Ihrer Anwendung zu verbinden, suchen Sie Ihren SDK Key. Navigieren Sie zu 'Einstellungen' und kopieren Sie den Wert des SDK-Schlüssels.

Click on settings

2. Installieren Sie das Optimizely Swift Paket

Mit dem Optimizely Swift Package können Sie Feature Toggles aus Ihrer Codebasis heraus mit Swift einrichten. Wenn Sie noch kein Xcode-Projekt eingerichtet haben, erstellen Sie in Xcode eine neue App mit einer einzigen Ansicht. Legen Sie die App auf die Verwendung von Storyboard fest und wählen Sie Swift als Sprache. Jetzt, da Sie Ihr Xcode-Projekt fertig haben, installieren wir das Optimizely SDK.

Swift-Paketmanager verwenden

Klicken Sie in Xcode auf Datei > Swift Pakete > Paketabhängigkeit hinzufügen

Set up the packages

Fügen Sie dann'https://github.com/optimizely/swift-sdk.git'in das Feld für die URL des Paket-Repositorys ein:

Add a hosted account

Folgen Sie dem Xcode-Dialog, um die Installation des Optimizely Swift-Pakets abzuschließen.

Initialisieren Sie das SDK

Um das Optimizely Swift Package zu verwenden, importieren Sie das Package zunächst am Anfang Ihrer AppDelegate.swift Datei und initialisieren dann das SDK in der Funktion 'didFinishLaunchingWithOptions'. Ersetzen Sie den Code in Ihrer AppDelegate.swift Datei durch den folgenden Code und denken Sie daran, Ihren Optimizely SDK Key einzufügen.

import UIKit import Optimizely @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { // OptimizelyClient erstellen let optimizely = OptimizelyClient(sdkKey: "REPLACE_WITH_SDK_KEY", periodicDownloadInterval: 30) func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { optimizely.start { result in switch result { case .failure(let error): print("Optimizely SDK initiliazation failed: \(error)") case .success: print("Optimizely SDK erfolgreich initialisiert!") } } return true } }


In diesem Beispiel setzen wir den Wert auf 30, damit das SDK alle 30 Sekunden nach Änderungen der Funktionskonfiguration fragt. Dies dient lediglich dazu, das Feature Toggle schneller zu demonstrieren (die Standardfrequenz ist alle 10 Minuten).

Hinweis: Wir raten davon ab, das Intervall zum Herunterladen anzupassen, es sei denn, Sie haben einen besonderen Bedarf daran.

3. Implementieren Sie die Funktion

Um unsere Funktion 'hello_world' zu implementieren, verwenden wir den Interface Builder von Xcode, um eine einzelne Schaltfläche hinzuzufügen, die eine Warnung anzeigt. Wir verwenden unser Feature Flag, um den Inhalt der Meldung festzulegen.

Hinzufügen der Schaltfläche

Fügen Sie eine Schaltfläche mit dem Namen "Click Me!" zur Benutzeroberfläche hinzu und zentrieren Sie sie.

Add the button in your app

Verbinden Sie die Schaltfläche mit dem ViewController

  1. Öffnen Sie ViewController.swift
  2. Kopieren Sie den folgenden Code und fügen Sie ihn in die ViewController-Klasse ein.
  3. @IBAction func showMessage(sender: UIButton) { var enabled = false let alertController = UIAlertController(title: "Warnung", message: enabled ? "Hallo Welt!" : "Hier gibt es nichts zu sehen...", preferredStyle: UIAlertController.Style.alert) if enabled { alertController.addAction(UIAlertAction(title: "Hallo!", style: UIAlertAction.Style.default, handler: nil)) } else { alertController.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)) } present(alertController, animated: true, completion: nil) }
    Verbinden Sie die Schaltfläche in der Benutzeroberfläche mit der obigen Funktion (mit Hilfe des Storyboards: Öffnen Sie Main.storyboard und klicken Sie bei gedrückter Steuerungstaste auf die Schaltfläche und ziehen Sie sie auf das Symbol des View Controllers oben links auf dem iPhone. Es öffnet sich ein Menü, klicken Sie auf showMessageWithSender)'

Verbinden Sie die Schaltfläche mit der Funktion "hello_world".

Nun, da wir die Schaltfläche im Interface mit unserer Funktion in der ViewController.swift verbunden haben, wird die Funktion aufgerufen, sobald die Schaltfläche angeklickt wird. Sie haben aber vielleicht bemerkt, dass in der Funktion eine Variable namens 'enabled' in einem ternären Ausdruck verwendet wird, um die Nachricht der Benachrichtigung sowie den Text der Schaltfläche umzuschalten, um die Benachrichtigung zu beenden. Führen Sie die folgenden Schritte aus, um sich mit dem OptimizelyClient zu verbinden, um den Wert von 'enabled' dynamisch auf der Grundlage der userId und der Optimizely Feature Flag-Konfiguration zu setzen.

  1. Um den Optimizely-Client zur Verwendung im View-Controller zu importieren, fügen Sie Folgendes in die ViewController-Klasse oberhalb der Schaltflächenfunktion ein:
  2. let delegate = UIApplication.shared.delegate as! AppDelegate
    Um den Optimizely-Client zu verwenden, um den Wert von enabled zu setzen, fügen Sie das Folgende in die Schaltflächenfunktion ganz oben unter der Variable enabled ein:
    let userId = "user123" let attributes: [String: Any] = [ "customerId": 123, // Attribute für Targeting-basiertes Rollout "isVip": true, ] enabled = delegate.optimizely.isFeatureEnabled(featureKey: "hello_world", userId: userId, attributes: attributes) print("Feature ist aktiviert? - \(enabled) for userId: \(userId)")

Die Parameter für isFeatureEnabled(featureKey, userId, attributes) sind die folgenden:

  • featureKey: Name des Features, um diese Methode mit der Optimizely-Benutzeroberfläche zu verbinden.
  • userId: wird für den Rollout an einen zufälligen Prozentsatz von Benutzern verwendet. Wir werden diesen Parameter in diesem Beitrag nicht verwenden, lassen Sie ihn vorerst als nicht leeren String stehen.
  • Attribute: für ein gezieltes Rollout für Ihre Benutzer. Sie werden diese Attribute verwenden, um Ihre Funktion ab Schritt 5 auf bestimmte Benutzergruppen auszurichten.

Der Rückgabewert, isEnabled, ist ein boolescher Wert, der angibt, ob die Funktion für diese Eingaben aktiviert oder nicht aktiviert wurde.

Der vollständige Code für unsere ViewController.swift sollte nun wie folgt aussehen:

import UIKit class ViewController: UIViewController { let delegate = UIApplication.shared.delegate as! AppDelegate @IBAction func showMessage(sender: UIButton) { var enabled = false let userId = "user123" let attributes: [String: Any] = [ "customerId": 123, // Attribute für Targeting-basierten Rollout "isVip": true, ] enabled = delegate.optimizely.isFeatureEnabled(featureKey: "hello_world", userId: userId, attributes: attributes) print("Feature ist aktiviert? - \(enabled) for userId: \(userId)") let alertController = UIAlertController(title: "Warnung", message: enabled ? "Hallo Welt!" : "Hier gibt es nichts zu sehen...", preferredStyle: UIAlertController.Style.alert) if enabled { alertController.addAction(UIAlertAction(title: "Hallo!", style: UIAlertAction.Style.default, handler: nil)) } else { alertController.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)) } present(alertController, animated: true, completion: nil) } }

4. Schalten Sie das Feature Toggle ein!

Drücken Sie Option+Befehl+S, um alle Dateien zu speichern, und klicken Sie dann oben links auf die Schaltfläche "Build and Run", um die App in Xcode auszuführen. Im iOS-Simulator klicken Sie auf die Schaltfläche, um die Benachrichtigung anzuzeigen und Sie werden feststellen, dass Sie die Funktion hello_world nicht erhalten haben. Das liegt daran, dass die Funktion nicht aktiviert ist, d.h. sie ist für alle Benutzer Ihrer App ausgeschaltet.

So schalten Sie die Funktion in Optimizely ein:

  1. Navigieren Sie zu Funktionen
  2. Klicken Sie auf die Funktion 'hello_world'.
  3. Schalten Sie die Funktion ein und stellen Sie sicher, dass sie auf 100% eingestellt ist (siehe Screenshot unten)
  4. Klicken Sie auf Speichern, um Ihre Änderungen zu speichern.

Feature rollout slider

Warten Sie 30 Sekunden und klicken Sie dann, ohne Ihre laufende App neu zu starten, auf die Schaltfläche "Click Me", um die Meldung zu sehen, dass die Änderungen von Optimizely wirksam geworden sind. In der Benachrichtigung sollte nun die Meldung "Hello World!" erscheinen, die anzeigt, dass das Feature eingeschaltet ist.

Sie haben Ihr Feature nun erfolgreich hinter einem Feature Flag gestartet, aber es ist für jeden verfügbar. Der nächste Schritt besteht darin, Targeting zu aktivieren, um Ihre Funktion nur einer bestimmten Untergruppe von Nutzern zu zeigen, damit Sie den wahren Wert einer Funktion für jeden einzelnen Kunden nutzen können.

5. Erstellen Sie ein Attribut für customerId

Um Ihr Feature auf der Grundlage der 'Attribute', die Sie der isFeatureEnabled-API in Schritt 3 mitgeteilt haben, zu targetieren, müssen Sie diese Attribute in der Rollouts-Benutzeroberfläche erstellen. Beginnen Sie damit mit dem Attribut 'customerId':

  1. Navigieren Sie zu Zielgruppen -> Attribute
  2. Klicken Sie auf 'Neues Attribut erstellen...'.
  3. Nennen Sie den Schlüssel des Attributs 'customerId'.
  4. Klicken Sie auf 'Attribut speichern', um Ihre Änderungen zu speichern.

Create a new attribute

6. Eine Beta-Zielgruppe erstellen und hinzufügen

Lassen Sie uns nun eine Zielgruppe erstellen, um festzulegen, welche customerIds Zugang zu Ihrer Funktion erhalten sollen.

  1. Navigieren Sie zu Features
  2. Klicken Sie auf Ihre Funktion 'hello_world'.
  3. Scrollen Sie nach unten zu Zielgruppen
  4. Klicken Sie auf 'Neue Audience erstellen...'.
  5. Nennen Sie die Zielgruppe '[hello_world] Beta Users'.
  6. Ziehen Sie Ihr Attribut customerId per Drag & Drop in die Bedingungen der Zielgruppe
  7. Ändern Sie das Dropdown-Menü 'has any value' in 'Number equals' mit dem Wert 123
  8. Klicken Sie auf 'Audience speichern'.

Edit attributes for audience

Fügen Sie die Audience zu Ihrer Funktion hinzu, indem Sie auf die Schaltfläche + neben Ihrer neu erstellten Audience klicken. Scrollen Sie dann nach unten und klicken Sie auf 'Speichern'.

Add an audience

Nun, da Sie die Zielgruppe zu Ihrer Funktion hinzugefügt haben, ist die Beta-Version einsatzbereit. Zu diesem Zeitpunkt wird Ihre Funktion nur für Kunden mit der customerId 123 angezeigt, die Sie der isFeatureEnabled API im Parameter userAttributes übergeben haben.

Als Test können Sie Ihre customerId auf 456 ändern, speichern und beobachten, wie die Funktion deaktiviert wird, weil Sie die Targeting-Bedingungen nicht erfüllen.

7. Benutzer zur Beta-Version hinzufügen

Um weitere Kunden zu Ihrer Beta-Zielgruppe hinzuzufügen, bearbeiten Sie die Zielgruppendefinition, um Benutzer zur Beta hinzuzufügen oder zu entfernen:

  • Klicken Sie auf das "+"-Zeichen und speichern Sie, um Beta-Nutzer hinzuzufügen.
  • Klicken Sie auf das "x"-Zeichen und speichern Sie, um Beta-Nutzer zu entfernen.

Im folgenden Screenshot-Beispiel wurden drei Kunden zur Beta hinzugefügt. Die Kunden mit den IDs 123, 456 und 789 haben nun Zugriff auf die Funktion 'hello_world'.

Edit audiences in product

8. Starten Sie die Funktion

Nachdem Sie Ihre Funktion für genügend Kunden aktiviert haben, um das neue Erlebnis zu genießen, können Sie entscheiden, dass es sicher ist, Ihre Funktion für alle Kunden zu starten.

Sobald Sie bereit sind, Ihre Funktion aus der Beta-Phase heraus zu starten, folgen Sie diesen Schritten:

  1. Entfernen Sie die Zielgruppe aus Ihrer Funktion
  2. Stellen Sie sicher, dass der Rollout auf 100% konfiguriert ist.
  3. Speichern Sie die Funktion

Die Funktion ist nun für alle verfügbar und Sie haben die Funktion 'hello_world' mit Hilfe der kostenlosen Feature Flags von Optimizely Rollouts in Swift + iOS erfolgreich für alle Kunden ausgerollt!

9. Bonus: Achten Sie auf Änderungen der Feature Flags Konfiguration

Bisher haben wir Ihnen gezeigt, wie Sie Benutzer benachrichtigen können, wenn sie eine Aktion in der iOS App durchführen. Sie können dem Optimizely Client auch Listener für Benachrichtigungen hinzufügen, um relevante Ereignisse abzuhören. Sie könnten zum Beispiel auf den "datafileListener" hören, um den Inhalt der App dynamisch zu ändern, wenn Änderungen an der Konfiguration Ihrer Funktionen in Optimizely vorgenommen werden. Rufen Sie die folgende Funktion addListeners() vor optimizely.start() auf, um die Listener hinzuzufügen.

func addListeners() { let notificationCenter = optimizely.notificationCenter //Benachrichtigung wird abgefeuert, wenn ein Wert von isFeatureEnabled zurückgegeben wird function call _ = notificationCenter?.addDecisionNotificationListener(decisionListener: { (type, userId, attributes, decisionInfo) in print("Empfangene Entscheidungsbenachrichtigung: \(type) \(userId) \(String(describing: attributes)) \(decisionInfo)") }) //Benachrichtigung abgefeuert, wenn SDK eine neue Datendatei abfragt und die Datendatei sich geändert hat _ = notificationCenter?.addDatafileChangeNotificationListener(datafileListener: { (_) in print("Datendatei hat sich geändert!") }) }

Nächste Schritte

Obwohl in diesem Blog die kundenindividuellen Rollouts behandelt wurden, ermöglichen Feature Flags weitere Anwendungsfälle, wie z.B. den Verzicht auf langlebige Feature Branches, die Erstellung eines Berechtigungssystems oder die Durchführung von produktgesteuerten A/B-Tests im Backend.

Ein weiterer Vorteil von Feature Flags ist, dass Sie Funktionen ein- und ausschalten können, sobald Ihre App im App Store verfügbar ist, ohne den langwierigen Prüfprozess von Apple durchlaufen zu müssen!

Bei Optimizely verwenden wir Feature Flags für all diese Anwendungsfälle und mehr.

Ich hoffe, das war hilfreich! Geben Sie uns Feedback, wenn Sie welche haben. Ich hoffe, ich konnte Ihrem Team einige Entwicklungsressourcen ersparen, indem ich Sie in die Lage versetzt habe, die Leistungsfähigkeit von Feature Flags mit unserem kostenlosen Produkt für Feature Flags zu nutzen: Optimizely Rollouts.