I iOS-utviklerfellesskapet er fastlane et svært populært verktøy i dag. Det tar en veldig kjedelig oppgave, interaksjon med iTunes Connect, og gjør det nesten smertefritt ved å automatisere det meste av det. Vi ser på det generelle konseptet fastlane og lærer å ta skjermbilder for alle enheter på alle språk med en enkelt kommando.
"Manuell, repeterende arbeid er ikke verdt tiden min." Hver programmerer har tenkt dette minst en gang i sin karriere. De fleste av oss ønsker imidlertid ikke å ta seg tid til å lære å automatisere riktig. Kanskje det er fordi vi bare gjør de oppgavene sjeldent, eller kanskje det er fordi vi ikke tror å ha nok tid til å håndtere det akkurat nå.
Spesielt hvis oppgaven er den samme hver gang, men kommer ikke opp så mye, som for eksempel utgivelsen av en ny versjon eller distribusjonen av en build til beta-testere. Likevel er det absolutt en god ide å automatisere slike oppgaver. Du kan glemme et skritt og må begynne igjen, eller når det gjelder betaversjoner, kan det være veldig kjedelig å legge til nye enheter på utviklerportalen og oppdatere provisjonsprofilene før du distribuerer en ny bygg.
Dette er hvor fastlane kommer inn. Det automatiserer distribusjonsrørledninger og minimerer samhandling med Developer Portal og iTunes Connect, fra komforten til kommandolinjen eller fullstendig automatisert på din kontinuerlige integrationsserver.
fastlane er ikke bare et enkelt verktøy. Det er en samling av, på tidspunktet for skriving, tolv verktøy som følger Unix-filosofien "Gjør en ting og gjør det bra". Selvfølgelig er de avhengige av og samhandler med hverandre.
fastlane seg selv er en wrapper rundt disse verktøyene, slik at utviklere kan definere arbeidsflyter, også kjent som baner. Hver arbeidsflyt krever forskjellige verktøy for å kjøre. For eksempel, hvis du vil distribuere en pre-release-bygg til testene dine, trenger du ikke å lage skjermbilder for App Store.
Før du kan begynne å bruke fastlane, må du sørge for at du har Xcode Kommandolinjeverktøy installert. Fra kommandolinjen, kjør ut xcode-select - installer
å installere dem. Hvis den allerede er installert, vil du se en feil.
Fastlane seg selv er en Ruby perle. Avhengig av systemet ditt, må du enten kjøre perle installere fastlane
eller sudo perle installere fastlane
. Sistnevnte er nødvendig når du bruker Ruby-versjonen som leveres av OS X.
Etter at du har installert forutsetningene, må du initialisere prosjektet ditt for å bruke fastlane. I prosjektmappen din, kjør fastlane init
fra kommandolinjen for å starte en interaktiv oppsettveiviser. Veiviseren spør deg om din epostadresse og sannsynligvis din passord hvis den ikke allerede er i nøkkelringen. Veiviseren oppdager også egenskapene til appen din, for eksempel Navn og identifikator, og sjekker Developer Portal og iTunes Connect hvis den allerede er til stede der. Hvis det ikke er det, tilbyr det å skape det for deg. Smertefri.
Du kan også sette opp levere i samme trinn. Dette verktøyet lar deg laste opp metadata, skjermbilder og binær til iTunes Connect for deg. Vi vil se på dette i en annen opplæring.
Under installasjonsprosessen, en ny mappe, Fastlane, er opprettet i prosjektets katalog. Den inneholder konfigurasjonsdata, den viktigste er en fil som heter Fastfile
. Filen beskriver banene fastlane har. Her er standard app Store
kjørefelt.
nedlasting "Distribuere en ny versjon til App Store" lane: Appstore do match (type: "appstore") øyeblikksbilde treningsstudio levere (kraft: sant) rammeendende
Denne arbeidsflyten eller kjørefelt gjør følgende:
I denne spesielle opplæringen tar vi detaljert titt på det andre trinnet, øyeblikksbilde.
Hvorfor skal du automatisere skjermbilder? De er enkle å gjøre i en simulator. Det kan være sant når du bare har én enhet eller ett språk. La oss gjøre matematikken. Hvis appen din er tilgjengelig på iPhone og iPad, har du det seks skjermstørrelser (4.7 ", 5.5", 4 ", 3.5", iPad og iPad Pro). La oss også anta at appen din er tilgjengelig i tjue språk og du tar fem skjermbilder.
6 (enheter) × 20 (språk) x 5 (skjermbilder) = 600 skjermbilder
Forestill deg nå at du må ta dem manuelt. Det er galskap. Heldigvis er det øyeblikksbilde. Det automatiserer å ta skjermbilder ved å bruke Automatiseringsverktøy levert av Apple. Enda bedre, siden Xcode 7, trenger vi ikke lenger å bruke JavaScript for å automatisere dette. Vi kan bruke Swift og UI tester for denne oppgaven.
Når du installerer fastlane, øyeblikksbilde er også installert. Det vil imidlertid ikke automatisk initialiseres øyeblikksbilde med det når du setter opp et nytt prosjekt. Du må løpe øyeblikksbilde init
i prosjektmappen din.
Dette skaper to filer i Fastlane mappe, Snapfile
og SnapshotHelper.swift
. Du må legge til Swift-filen i prosjektets UI-testmål.
Etter at du har lagt til denne filen, må du også bruke kodebiten øyeblikksbilde sørger for å lagre skjermbilder. Du kan bruke UI-testfilen generert av Xcode eller opprette en separat en bare for skjermbilder.
I SETUP ()
funksjon, erstatt XCUIApplication (). Lansere ()
med følgende kode:
la app = XCUIApplication () setupSnapshot (app) app.launch ()
For klarhet kan du også gi nytt navn testExample ()
, men sørg for at du ikke fjerner test
prefiks av funksjonsnavnet.
Nå er det på tide å registrere trinnene du tar for å generere hver av skjermbildene. Du kan også styre programmet programmatisk, men det er langt lettere å bruke innspillingsfunksjonaliteten til Xcode og redigere den senere for å passe dine behov.
Bruk den røde opptaksknappen nederst for å starte opptaket.Når du registrerer en enkel samhandling, kommer du opp med kode som ser litt ut som følgende:
func testScreenshots () la app = XCUIApplication () la masterNavigationBar = app.navigationBars ["Master"] la addButton = masterNavigationBar.buttons ["Add"] addButton.tap () addButton.tap () la tablesQuery = app.tables tablesQuery .staticTexts ["2016-04-12 08:43:40 +0000"]. trykk () app.navigationBars.matchingIdentifier ("Detalj"). knapper ["Master"]. trykk () masterNavigationBar.buttons ["Rediger" ] .tap () tablesQuery.buttons ["Slett 2016-04-12 08:43:39 +0000"]. trykk () tablesQuery.buttons ["Delete"]. trykk () masterNavigationBar.buttons ["Done"]. trykk ()
Eksemplet kommer fra standard Master-detaljapplikasjon mal Xcode gir. Umiddelbart kan du se problemet med denne koden. Den bruker bestemte identifikatorer til å samhandle med appen. Hvis vi skulle kjøre UI-testen igjen, ville det mislykkes fordi tidsstemplene er forskjellige.
I et første trinn kan vi bruke en funksjon som leveres av UI Test-rammeverket, elementBoundByIndex (_ :)
. Dette tillater oss å få tilgang til elementene, for eksempel knapper og tabellvisning celler, ved hjelp av en indeks. Dette fører til følgende kode:
func testScreenshots () la app = XCUIApplication () la masterNavigationBar = app.navigationBars ["Master"] la addButton = masterNavigationBar.buttons ["Add"] addButton.tap () addButton.tap () la tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.matchingIdentifier ("Detalje"). knapper ["Master"]. Trykk () masterNavigationBar.buttons ["Edit"]. trykk () tablesQuery.cells.elementBoundByIndex ()
Vi har et annet problem når vi prøver å kjøre koden på flere språk. Det mislykkes siden Herre, Legg til, etc. er oppkalt annerledes på hvert språk. Vi kan også løse dette problemet ved å bruke elementBoundByIndex (_ :)
metode. Vær oppmerksom på at den høyre strekknappen på navigasjonslinjen faktisk har en indeks på 2, Det betyr at det er det tredje elementet, fordi navigasjonslinjen alltid har en skjult tilbakeknapp.
func testScreenshots () la app = XCUIApplication () la masterNavigationBar = app.navigationBars.elementBoundByIndex (0) la addButton = masterNavigationBar.buttons.elementBoundByIndex (2) addButton.tap () addButton.tap () la tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.elementBoundByIndex (0) .buttons.elementBoundByIndex (0) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap () la cellen = tablesQuery.cells.elementBoundByIndex (0) cell.buttons.elementBoundByIndex (0) .tap () cell.buttons.elementBoundByIndex (1) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap ()
Det er en annen snarvei som gjør det enklere å få tilgang til egendefinerte elementer for brukergrensesnitt. Det er en eiendom, accessibilityIdentifier
, definert av UIAccessibilityIdentification
protokoll. Du kan bruke den til å se etter elementer med denne identifikatoren, for eksempel, app.buttons.matchingIdentifier ( "awesomeButton"). element
. Tilgjengelighetsidentifikatoren er ikke synlig for brukeren, selv når de har tilgjengeligheten aktivert, og den er ikke lokalisert.
Når du har satt opp brukergrensesnittet for å arbeide med prosjektets støttede språk, er det på tide å konfigurere øyeblikksbilde å ta noen skjermbilder. Dette gjøres med snapshot (_ :)
Fungerer i din UI-test. Du må også angi et filnavn. Jeg bruker personlig et nummerert prefiks, for eksempel snapshot ( "1MasterView")
eller snapshot ( "2DetailView")
for å gjøre det lettere å telle hvor mange skjermbilder jeg allerede har tatt og for automatisk å sortere dem. Hvis du trenger ekstra tid før du tar et skjermbilde, bruk sove(_:)
funksjon.
Til slutt må du fortelle øyeblikksbilde hvilke enheter og språk den skal bruke. Dette er spesifisert i Snapfile
.
enheter [["iPhone 6", "iPhone 6 Plus", "iPhone 4s"]) språk (["en-US", "de-DE"])
I dette eksemplet bruker jeg iPhone 6, iPhone 6 Plus og iPad som enheter og engelsk og tysk som språk.
For å kjøre verktøyet, kjører du øyeblikksbilde
fra kommandolinjen. Avhengig av størrelsen på prosjektet ditt og antall enheter og språk, kan det ta litt tid å ta skjermbildene. I mellomtiden kan du strekke bena, få en kopp kaffe, eller bare se på at det fungerer sin magi.
Som standard lagres skjermbildene i Fastlane / skjermbilder, med hvert språk å ha sin egen undermappe og filnavn prefiks med enhetens navn. Etter øyeblikksbilde er ferdig, genererer det også en HTML-fil for å forhåndsvise de genererte skjermbildene.
Etter at stillbildet er ferdig, genererer det også en HTML-fil for å forhåndsvise de genererte skjermbildene.Ved bruk av øyeblikksbilde, Du kan redusere tid og krefter som trengs for å lage skjermbilder for appen din til en brøkdel av hva det tar hvis du gjør denne oppgaven manuelt. Selvfølgelig er verktøyet mye mer tilpassbart fordi vi bare riper overflaten av hva øyeblikksbilde kan gjøre. For mer informasjon, se dokumentasjonen på GitHub. Du kan også sjekke ut videoen min om fastlane hvis du vil lære mer om dette fantastiske verktøyet.