In der iOS-Entwicklergemeinschaft ist fastlane heutzutage ein sehr beliebtes Werkzeug. Die Interaktion mit iTunes Connect erfordert eine sehr mühsame Aufgabe und macht es durch die Automatisierung der meisten Aufgaben fast schmerzfrei. Wir werfen einen Blick auf das Gesamtkonzept von fastlane und lernen, wie Sie mit einem einzigen Befehl Screenshots für alle Geräte in allen Sprachen erstellen.
"Manuelles, sich wiederholendes Arbeiten ist meine Zeit nicht wert." Jeder Programmierer hat dies in seiner Karriere mindestens einmal gedacht. Die meisten von uns möchten sich jedoch nicht die Zeit nehmen, um zu lernen, wie man richtig automatisiert. Vielleicht liegt es daran, dass wir diese Aufgaben nur selten erledigen oder vielleicht, weil wir der Meinung sind, nicht genug Zeit zu haben, um jetzt damit fertig zu werden.
Vor allem, wenn die Aufgabe jedes Mal gleich ist, aber nicht allzu oft auftaucht, z. B. die Veröffentlichung einer neuen Version oder die Verteilung eines Builds an Betatester. Dennoch ist es sicherlich eine gute Idee, solche Aufgaben zu automatisieren. Sie können einen Schritt vergessen und müssen neu beginnen, oder wenn Sie Betaversionen verwenden, kann es sehr mühsam sein, dem Developer Portal neue Geräte hinzuzufügen und die Bereitstellungsprofile zu aktualisieren, bevor Sie einen neuen Build verteilen.
Hier setzt fastlane an. Sie automatisiert Ihre Distributions-Pipelines und minimiert die Interaktion mit dem Developer Portal und iTunes Connect, ganz bequem über die Befehlszeile oder vollständig automatisiert auf Ihrem Continuous Integration Server.
fastlane ist nicht nur ein Werkzeug. Es ist eine Sammlung von zwölf Tools, die zur Zeit des Schreibens der Unix-Philosophie "Do One Thing and Do It Well" folgen. Natürlich hängen sie voneinander ab und interagieren miteinander.
fastlane selbst ist ein Wrapper für diese Tools, mit dem Entwickler Workflows definieren können Gassen. Für jeden Workflow sind verschiedene Tools zum Ausführen erforderlich. Wenn Sie beispielsweise einen Pre-Release-Build an Ihre Tester verteilen möchten, müssen Sie keine Screenshots für den App Store erstellen.
Bevor Sie fastlane verwenden können, müssen Sie sicherstellen, dass Xcode vorhanden ist Befehlszeilen-Tools Eingerichtet. Führen Sie in der Befehlszeile den Befehl aus xcode-select --install
um sie zu installieren. Wenn es bereits installiert ist, wird ein Fehler angezeigt.
fastlane selbst ist ein Rubin-Edelstein. Abhängig von Ihrem System müssen Sie entweder laufen gem installieren fastlane
oder Sudo Gem installieren Fastlane
. Letzteres ist erforderlich, wenn Sie die von OS X bereitgestellte Ruby-Version verwenden.
Nach der Installation der Voraussetzungen müssen Sie Ihr Projekt für die Verwendung von fastlane initialisieren. Führen Sie in Ihrem Projektordner aus fastlane init
von der Befehlszeile aus, um einen interaktiven Einrichtungsassistenten zu starten. Der Assistent fragt Sie nach Ihrem E-Mail-Addresse und wahrscheinlich dein Passwort Wenn es nicht bereits im Schlüsselbund ist. Der Assistent erkennt auch die Attribute Ihrer App, z. B. Name und Kennung, und prüft das Developer Portal und iTunes Connect, ob es dort bereits vorhanden ist. Wenn nicht, dann bietet es an, es für Sie zu erstellen. Schmerzlos.
Sie können auch einrichten liefern im gleichen schritt. Mit diesem Tool können Sie Metadaten, Screenshots und die Binärdatei zu iTunes Connect für Sie hochladen. Wir werden uns dies in einem anderen Tutorial ansehen.
Während des Installationsvorgangs ein neuer Ordner, Überholspur, wird im Verzeichnis Ihres Projekts erstellt. Es enthält Konfigurationsdaten. Die wichtigste ist eine Datei mit dem Namen Fastfile
. Die Datei beschreibt die Spuren, die Fastlane hat. Hier ist der Standard Appstore
Fahrbahn.
desc "Bereitstellen einer neuen Version für den App Store" -Bereich: Appstore do match (Typ: "Appstore") Snapshot Gym liefert (force: true) Frameit-Ende
Dieser Workflow oder diese Spur führt Folgendes aus:
In diesem speziellen Tutorial betrachten wir den zweiten Schritt ausführlich, Schnappschuss.
Warum sollten Sie Screenshots automatisieren? Sie sind in einem Simulator einfach zu machen. Dies kann zutreffen, wenn nur ein Gerät oder eine Sprache vorhanden ist. Lass uns die Mathematik machen. Wenn Ihre App auf iPhone und iPad verfügbar ist, haben Sie sechs Bildschirmgrößen (4,7 ", 5,5", 4 ", 3,5", iPad und iPad Pro). Nehmen wir auch an, dass Ihre App in verfügbar ist zwanzig Sprachen und du nimmst fünf Screenshots.
6 (Geräte) × 20 (Sprachen) x 5 (Screenshots) = 600 Screenshots
Nun stellen Sie sich vor, dass Sie diese manuell nehmen müssen. Das ist verrückt. Zum Glück gibt es Schnappschuss. Es automatisiert das Aufnehmen von Screenshots mit der Automatisierungstools von Apple bereitgestellt. Umso besser, seit Xcode 7 brauchen wir kein JavaScript mehr, um dies zu automatisieren. Wir können Swift- und UI-Tests für diese Aufgabe verwenden.
Wenn Sie Fastlane installieren, Schnappschuss ist auch installiert. Es wird jedoch nicht automatisch initialisiert Schnappschuss damit beim Anlegen eines neuen Projekts. Du musst rennen Momentaufnahme init
in Ihrem Projektordner.
Dadurch werden zwei Dateien im erstellt Überholspur Mappe, Snapfile
und SnapshotHelper.swift
. Sie müssen die Swift-Datei zum UI-Testziel Ihres Projekts hinzufügen.
Nachdem Sie diese Datei hinzugefügt haben, müssen Sie auch das Code-Snippet verwenden Schnappschuss bietet zum Speichern von Screenshots. Sie können die von Xcode generierte UI-Testdatei verwenden oder eine separate Datei nur für Screenshots erstellen.
In dem Konfiguration()
Funktion, ersetzen XCUIApplication (). Launch ()
mit dem folgenden Code:
let app = XCUIApplication () setupSnapshot (app) app.launch ()
Zur Verdeutlichung können Sie auch umbenennen testExample ()
, aber stellen Sie sicher, dass Sie das nicht entfernen Prüfung
Präfix des Funktionsnamens.
Nun ist es Zeit, die Schritte aufzuzeichnen, die Sie zum Erstellen der einzelnen Screenshots ausführen. Sie können die Anwendung auch programmgesteuert steuern, aber es ist viel einfacher, die Aufnahmefunktionalität von Xcode zu verwenden und sie später an Ihre Anforderungen anzupassen.
Verwenden Sie die rote Aufnahmetaste am unteren Rand, um die Aufnahme zu starten.Wenn Sie eine einfache Interaktion aufnehmen, erhalten Sie Code, der ungefähr wie folgt aussieht:
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars ["master"] let addButton = masterNavigationBar.buttons ["add"] addButton.tap () addButton.tap () let tablesQuery = app.tables TabellenQuery .staticTexts ["2016-04-12 08:43:40 +0000"]. tap () app.navigationBars.matchingIdentifier ("Detail"). buttons ["Master"]. tap () masterNavigationBar.buttons ["Edit" ] .tap () tablesQuery.buttons ["Delete 2016-04-12 08:43:39 +0000"]. tap () tablesQuery.buttons ["Delete"]. tap () masterNavigationBar.buttons ["Done"]. Zapfhahn()
Das Beispiel stammt von der Standardeinstellung Master-Detail-Anwendung Vorlage Xcode bietet. Sofort können Sie das Problem mit diesem Code sehen. Es verwendet bestimmte Bezeichner, um mit der App zu interagieren. Wenn wir den UI-Test erneut ausführen, schlägt der Test fehl, da die Zeitstempel unterschiedlich sind.
In einem ersten Schritt können wir eine Funktion verwenden, die vom UI-Test-Framework bereitgestellt wird, elementBoundByIndex (_ :)
. Auf diese Weise können wir über einen Index auf Elemente wie Schaltflächen und Tabellensichtzellen zugreifen. Dies führt zu folgendem Code:
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars ["master"] let addButton = masterNavigationBar.buttons ["add"] addButton.tap () addButton.tap () let tablesQuery = app.tables TabellenQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.matchingIdentifier ("Detail"). buttons ["Master"]. tap () masterNavigationBar.buttons ["Edit"]. tap () tablesQuery.cells.elementBoundByIndex ( 0) .buttons.elementBoundByIndex (0) .tap () tablesQuery.buttons ["Löschen"]. Tap () masterNavigationBar.buttons ["Done"]. Tap ()
Wir haben ein anderes Problem, wenn wir versuchen, den Code in mehreren Sprachen auszuführen. Es scheitert seit Meister, Hinzufügen, etc. sind in jeder Sprache unterschiedlich benannt. Wir können dieses Problem auch mithilfe von beheben elementBoundByIndex (_ :)
Methode. Beachten Sie, dass die rechte Leiste in der Navigationsleiste einen Index von hat 2, Das heißt, es ist das dritte Element, da die Navigationsleiste immer eine ausgeblendete Schaltfläche "Zurück" enthält.
func testScreenshots () let app = XCUIApplication () lasse masterNavigationBar = app.navigationBars.elementBoundByIndex (0) let addButton = masterNavigationBar.buttons.elementBoundByIndex (2) addButton.tap () .cells.elementBoundByIndex (0) .tap () app.navigationBars.elementBoundByIndex (0) .buttons.elementBoundByIndex (0) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap () let cell = (0) cell.buttons.elementBoundByIndex (0) .tap () cell.buttons.elementBoundByIndex (1) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap ()
Es gibt eine weitere Verknüpfung, die den Zugriff auf benutzerdefinierte Elemente durch UI-Tests erheblich vereinfacht. Es ist eine Eigenschaft, accessibilityIdentifier
, definiert durch die UIAccessibilityIdentification
Protokoll. Sie können damit beispielsweise nach Elementen mit dieser Kennung suchen, app.buttons.matchingIdentifier ("awesomeButton"). element
. Die Eingabehilfen-ID ist für den Benutzer nicht sichtbar, auch wenn die Eingabehilfe aktiviert ist, und sie ist nicht lokalisiert.
Nachdem Sie die Benutzeroberfläche für die Arbeit mit den unterstützten Sprachen des Projekts eingerichtet haben, ist es Zeit für die Konfiguration Schnappschuss um ein paar Screenshots zu machen. Dies geschieht mit der Schnappschuss(_:)
Funktion in Ihrem UI-Test. Sie müssen auch einen Dateinamen angeben. Ich persönlich benutze ein nummeriertes Präfix wie Schnappschuss ("1MasterView")
oder Momentaufnahme ("2DetailView")
um die Anzahl der bereits aufgenommenen Screenshots zu zählen und sie automatisch zu sortieren. Wenn Sie vor dem Erstellen eines Screenshots mehr Zeit benötigen, verwenden Sie die schlafen(_:)
Funktion.
Zum Schluss musst du es sagen Schnappschuss welche geräte und sprachen es verwenden soll. Dies ist im angegeben Snapfile
.
Geräte (["iPhone 6", "iPhone 6 Plus", "iPhone 4s"]) Sprachen (["de-DE", "de-DE"])
In diesem Beispiel verwende ich iPhone 6, iPhone 6 Plus und das iPad als Geräte und Englisch und Deutsch als Sprachen.
Um das Tool auszuführen, führen Sie es aus Schnappschuss
von der Kommandozeile aus. Abhängig von der Größe Ihres Projekts und der Anzahl der Geräte und Sprachen kann es einige Zeit dauern, bis die Screenshots erstellt werden. In der Zwischenzeit können Sie die Beine strecken, eine Tasse Kaffee trinken oder einfach zusehen, wie es seine Magie ausübt.
Standardmäßig werden die Screenshots in gespeichert Fastlane / Screenshots, wobei jede Sprache einen eigenen Unterordner und Dateinamen hat, denen der Gerätename vorangestellt ist. Nach dem Schnappschuss ist fertig, es generiert auch eine HTML-Datei, um eine Vorschau der erzeugten Screenshots anzuzeigen.
Nachdem der Schnappschuss abgeschlossen ist, wird auch eine HTML-Datei erstellt, um eine Vorschau der erzeugten Screenshots zu erhalten.Durch die Nutzung Schnappschuss, Sie können den Zeit- und Arbeitsaufwand für das Erstellen von Screenshots für Ihre App auf einen Bruchteil dessen reduzieren, was Sie benötigen, wenn Sie diese Aufgabe manuell ausführen. Natürlich ist das Tool viel anpassbarer, da wir nur die Oberfläche davon zerkratzt haben Schnappschuss tun können. Weitere Informationen finden Sie in der Dokumentation zu GitHub. Sie können sich auch meinen Videokurs über fastlane ansehen, wenn Sie mehr über dieses erstaunliche Tool erfahren möchten.