Die Prinzipien basieren auf der bekannten Methode von Heroku , die an die Realität der Ayios-Entwicklung angepasst ist (Mangels Container, die mehrere Tage benötigen , um die Bereitstellung abzuschließen und zu verlangsamen, funktioniert Xcode nur auf einer Mohnblume).
Dieser Artikel ist eine kurze Einführung, die komplette Serie finden Sie zum iOS-Faktor , russische Übersetzung ist ebenfalls verfügbar. Das Open-Source-iOS-Faktor-Projekt auf Github wird ständig weiterentwickelt und begrüßt neue Ideen. Ich habe auch an seiner Entwicklung teilgenommen. Das Projekt wurde von Felix gegründet , dem Schöpfer von Fastlane .
TL; DR
- Abhängigkeiten : Muss explizit und spezifisch angegeben werden (Version von Xcode, CocoaPods, Version der Abhängigkeiten in der Poddatei). Dies ermöglicht es einem neuen Entwickler, den Build auf jedem Mac zu spielen. Wiederholen Sie auch die vor 6 Monaten verwendete Baugruppe.
- Konfiguration : Keine Konfiguration im Code, kommt mit der Anwendung und der Möglichkeit, auf dem Luftweg zu aktualisieren
- Anwendungsentwicklung / Arbeitsparität : Halten Sie die Entwicklungs-, Staging- und Produktionsumgebungen so ähnlich wie möglich
- Bereitstellung : Automatisieren Sie die Bereitstellung, damit Sie sie von jedem Computer aus freigeben können.
- Lokal versus Beck : Halten Sie Ihre iOS-App universell, damit Sie nach Möglichkeit ohne Backend arbeiten können
- Abwärtskompatible APIs : Denken Sie nicht, dass jeder Benutzer auf die neueste Version aktualisiert
- Anwendungsversionierung : Automatisieren Sie die Version und erstellen Sie Upgrades
- Rollbacks : Rollback-Baugruppe, die Probleme verursacht
- Datenspeicherung : Befolgen Sie die Empfehlungen von Apple zur Datenspeicherung
Die Anwendung deklariert alle ihre Abhängigkeiten vollständig und genau mithilfe des Abhängigkeitsdeklarationsmanifests.
Dies beinhaltet eine bestimmte Version von Swift, Xcode, CocoaPods, Carthgae und Fastlane. Außerdem müssen alle Abhängigkeiten in podfile und cartfile eine bestimmte Version angeben.
Einer der Vorteile der expliziten Deklaration von Abhängigkeiten besteht darin, dass Anwendungen für neue Entwickler einfach konfiguriert werden können.
Mithilfe der Angabe bestimmter Abhängigkeiten können Sie den vor 6 Monaten verwendeten Build reproduzieren, da Sie wissen, dass er erstellt wird, da für den Build dieselbe Version von Xcode, CocoaPods und Swift verwendet wird.
Einschränkung - Da die iOS-Entwicklung nicht in einem Container enthalten sein kann, da sie bereits für die Webentwicklung verwendet wird, sind wir auf Tools von Drittanbietern beschränkt, die versuchen, diese Anforderung zu erfüllen, bis Apple eine offizielle Lösung bereitstellt. Es gibt eine kommerzielle (geschlossene) Lösung von Drittanbietern namens Veertu , mit der Sie virtuelle MacOS-Umgebungen auf Apple-Hardware erstellen können.
Der Code hängt nicht von der Umgebung ab, aber die Konfiguration hängt davon ab. Daher sollte der Code im Repository und die Konfiguration in der Umgebung gespeichert werden. Die Überprüfung, ob die Konfiguration und der Anwendungscode korrekt getrennt sind, besteht darin, dass die Anwendungscodebasis jederzeit frei verfügbar sein kann, ohne dass private Daten beeinträchtigt werden.
Es gibt viele Möglichkeiten, Konfigurationswerte zur Erstellungszeit einzugeben.
- Konfigurationsdateien (JSON- oder YAML-Dateien)
- Cocoapods-Schlüssel , um die Schlüssel auszublenden und sie während der Erstellung auf Ihre iOS-Anwendung anzuwenden
- Kundenspezifische Lösung (z. B. unter Verwendung der Erstellungsphase)
Da Bereitstellungen auf der iOS-Plattform erheblich langsamer sind als auf Servern, müssen Sie möglicherweise die Konfiguration über Funk (OTA) aktualisieren, um schnell auf Probleme reagieren zu können.
Mit OTA-Konfigurationsupdates können Sie sofort:
- Führen Sie A / B-Tests aus, um bestimmte Funktionen oder Änderungen der Benutzeroberfläche nur für einen Teil der aktiven Benutzer zu aktivieren.
- API-Schlüssel ändern
- Aktualisieren Sie Webhosts oder andere geänderte URLs
- Deaktivieren Sie Funktionen aus der Ferne oder verbergen Sie Schaltflächen
Einige mögliche Ansätze bei der Implementierung von OTA-Updates sind:
In der Vergangenheit gibt es erhebliche Unterschiede zwischen der Entwicklung (der Entwickler nimmt Live-Änderungen an der lokalen Bereitstellung der Anwendung vor) und dem Betrieb der Anwendung (Bereitstellung der Anwendung im App Store mit Zugriff durch Endbenutzer).
Diese Unterschiede treten in drei Bereichen auf:
- Zeitunterschied
- Personalunterschied
- Werkzeugspalt:
Lösung:
- Machen Sie den Zeitunterschied klein: Der Entwickler kann den Code schreiben und er wird in wenigen Stunden oder sogar Minuten bereitgestellt.
- Machen Sie die Unterschiede zwischen den Mitarbeitern klein: Der Entwickler, der den Code geschrieben hat, nimmt aktiv an seiner Bereitstellung teil und überwacht sein Verhalten, während die Anwendung ausgeführt wird.
- Machen Sie die Werkzeugunterschiede klein: Halten Sie die Entwicklungs- und Arbeitsumgebung Ihrer Anwendung so ähnlich wie möglich.
Wie im Prinzip " Abhängigkeiten " beschrieben, sollte das Code-Repository alle Abhängigkeiten enthalten, die zum Erstellen, Testen und Bereitstellen der iOS-Anwendung erforderlich sind.
Aufgrund der Tatsache, dass Xcode unter MacOS funktionieren sollte, können wir leider keine Container wie im Web verwenden. Das Ausführen von macOS in einer virtuellen Umgebung ist mit technischen und rechtlichen Problemen behaftet.
Derzeit ist der beste Ansatz, den wir iOS-Entwickler verwenden können:
Viele Unternehmen verwenden das Konzept der Freigabe von Zügen: einen Zeitplan, der eine neue Version Ihrer Anwendung veröffentlicht. Der gesamte Code, der zum Zeitpunkt des „Verlassens“ des Release-Zugs mit Ihrem Hauptzweig (Master oder Release) zusammengeführt wurde, wird an den App Store gesendet. Dieser Ansatz wird von den meisten großen iOS-Anwendungen implementiert.
In den letzten Jahren haben einige Entwicklungsteams begonnen, Ansätze zu verwenden, die weniger Entwicklungsaufwand erfordern, indem sie die Qualität der Benutzererfahrung verringern, mehr Logik auf das Backend übertragen und die iOS-Anwendung zu einem Thin Client machen, der Serverergebnisse anzeigt.
Eine Anwendung sollte aus mehreren Gründen so viel Geschäftslogik und Computer wie möglich auf dem Gerät ausführen:
- Vertraulichkeit: Vermeiden Sie das Senden von Daten an einen Remote-Server
- Geschwindigkeit: Das Senden von Daten an den Server und das Warten auf eine Antwort dauert einige Zeit und kann zu einem Absturz führen (z. B. schlechtes WLAN).
- Datennutzung: Benutzer haben häufig monatliche Datenlimits
- Skalierung: Wenn Ihre Anwendung populär wird, sind Sie für die Skalierung der Backend-Dienste verantwortlich.
- Akkulaufzeit: Mobil ist teuer
- Zuverlässigkeit: In einigen Ländern sind die LTE / 3G-Verbindungen immer noch schlecht
Wenn für Ihre Anwendung eine Internetverbindung für alle Funktionen erforderlich ist (z. B. eine Anwendung für soziale Netzwerke oder eine Anwendung für die gemeinsame Nutzung von Reisen), sollte sie weiterhin (schreibgeschützt) ohne Internetverbindung funktionieren, um auf historische Daten zuzugreifen (z. B. aktuelle Daten) Reisen, aktuelle direkte Kommunikation).
Obwohl die meisten Ihrer Benutzer innerhalb weniger Wochen auf die neueste Version aktualisiert werden, wird es immer Benutzer geben, die dies nicht tun. Dies kann mehrere Gründe haben. Dies liegt häufig an der verwendeten iOS-Version, die aufgrund des Alters des Geräts nicht immer aktualisiert werden kann.
Das Grundkonzept besteht darin, dass Sie die vorhandene API nicht aktualisieren, sondern stattdessen eine neue hinzufügen und sie parallel arbeiten lassen
https://your-api.com/1.0/drivers.json https://your-api.com/1.1/drivers.json
Die Versions- und Build-Nummer werden zusammen verwendet, um eine bestimmte Anwendung in der App zu identifizieren.
- Versionsnummer
(CFBundleShortVersionString)
- (CFBundleShortVersionString)
in Xcode als Version (CFBundleShortVersionString)
- Build-Nummer
(CFBundleVersion)
- (CFBundleVersion)
als Build in Xcode (CFBundleVersion)
In der heutigen iOS-Entwicklung gibt es keinen Grund, diese Nummern manuell zu ändern. Stattdessen benötigen Sie ein zuverlässiges und automatisiertes System, um die Versionen auf dem neuesten Stand zu halten.
Xcode verfügt über ein integriertes Tool namens agvtool .
Der App Store erlaubt zunächst keine Rollbacks. In diesem Abschnitt wird daher beschrieben, wie Sie mit den verfügbaren Methoden ähnliche Ergebnisse erzielen.
Meilenstein-Releases - Mit Meilenstein-Releases können Sie die Baugruppe langsam auf das Produkt ausrollen, beginnend mit einer kleinen Anzahl aktiver Benutzer
Selbst bei schrittweisen Versionen ist es jedoch nicht möglich, die Assembly vollständig abzurufen: Nachdem die Assembly auf dem Gerät des Benutzers installiert wurde, besteht die einzige Möglichkeit, diese Assembly zu ändern, darin, eine neue Version mit einer aktualisierten Versions- / Build-Nummer zu verteilen.
Wie bei den Phasenversionen können die App Store- und TestFlight-Assemblys nur mit den folgenden Schritten aktualisiert werden:
- Kehren Sie zu Ihrem Versionskontrollsystem in den Zustand zurück, in den Sie ein Rollback durchführen möchten
- Erhöhen Sie die Version und / oder Build-Nummer Ihres Projekts
- Erstellen und unterschreiben Sie Ihre Bewerbung
- Verteilen Sie Ihre Anwendung über den Beta-Service oder den App Store
- Der Benutzer muss die Anwendung auf seinem Telefon aktualisieren.
Die oben genannten Schritte können manuell ausgeführt werden. Es wird jedoch empfohlen, den Prozess vollständig zu automatisieren, um schnell reagieren zu können.
Alternative: alten Build neu signieren
- Greifen Sie auf die alte Assembly (.ipa-Datei) zu, bevor die Regression eingeführt wurde
- Aktualisieren Sie die Versions- / Build-Nummer in der Datei Info.plist
- "Sign again" alter Build
- Verteilen Sie es als neuen Build
Das „Signieren“ von iOS-Apps verursacht jedoch häufig mehr Probleme, insbesondere weil die Xcode-Befehlszeilentools keine gute Möglichkeit bieten, dies zu tun.
Das Speichern von Daten und Konfigurationen gemäß den Empfehlungen von Apple ist für den Lebenszyklus Ihrer Anwendung von entscheidender Bedeutung, insbesondere wenn es um die iCloud-Synchronisierung, das Upgrade auf ein neues Telefon und das Wiederherstellen Ihres Telefons aus dem Backup geht.
Befolgen Sie unbedingt die offiziellen Apple iOS-Richtlinien zur Datenspeicherung :
Documents
: Verwenden Sie dieses Verzeichnis für benutzerdefinierte Inhalte, es wird archiviertCaches
: Verwenden Sie dieses Verzeichnis für Daten, die wiederhergestellt werden können.tmp
: Verwenden Sie dieses Verzeichnis für temporäre Dateien- Verwenden Sie die Eigenschaft
do not back up
sichern für Dateien
Speichern Sie niemals vertrauliche Benutzerinformationen (wie Kennwörter oder Sitzungen) in diesen Verzeichnissen. Verwenden Sie stattdessen die Schlüsselbund-API.