Come automatizzare gli screenshot Con fastlane

Nella comunità di sviluppatori iOS, fastlane è uno strumento molto popolare al giorno d'oggi. Ci vuole un compito molto noioso, interagendo con iTunes Connect, e lo rende quasi indolore automatizzando la maggior parte di esso. Diamo un'occhiata al concetto generale di fastlane e impariamo come fare screenshot per tutti i dispositivi in ​​tutte le lingue con un singolo comando.

Perché fastlane

"Il lavoro manuale e ripetitivo non vale il mio tempo." Ogni programmatore ha pensato questo almeno una volta nella sua carriera. La maggior parte di noi, però, non vuole prendersi del tempo per imparare come automatizzare correttamente. Forse è perché facciamo solo quei compiti di rado o forse perché non pensiamo di avere abbastanza tempo per affrontarlo in questo momento.

Soprattutto se il compito è sempre lo stesso, ma non si presenta così tanto, come il rilascio di una nuova versione o la distribuzione di un build in beta tester. Ciononostante, è certamente una buona idea automatizzare tali compiti. Potresti dimenticare un passaggio e ricominciare da capo oppure, quando si ha a che fare con versioni beta, potrebbe essere molto noioso aggiungere nuovi dispositivi al Portale per sviluppatori e aggiornare i profili di provisioning prima di distribuire un nuovo build.

È qui che Fastlane entra in gioco. Automatizza le tue pipeline di distribuzione e riduce al minimo l'interazione con il Portale per gli sviluppatori e iTunes Connect, dalla comodità della linea di comando o completamente automatico sul tuo server di integrazione continua.

Suite di strumenti

fastlane non è solo un singolo strumento. Si tratta di una raccolta di, al momento della scrittura, dodici strumenti che seguono la filosofia di Unix "Fai una cosa e fallo bene". Ovviamente, dipendono e interagiscono l'uno con l'altro.

Fastlane stesso è un involucro attorno a quegli strumenti, che consente agli sviluppatori di definire i flussi di lavoro, noti anche come corsie. Ogni flusso di lavoro richiede diversi strumenti per l'esecuzione. Ad esempio, se desideri distribuire una versione preliminare ai tuoi tester, non dovrai creare screenshot per l'App Store.

Installazione

Prima di poter iniziare a usare fastlane, devi assicurarti di avere Xcode Strumenti da riga di comando installato. Dalla riga di comando, esegui xcode-select --install per installarli. Se è già installato, vedrai un errore.

Fastlane stessa è una gemma di Ruby. A seconda del sistema, è necessario eseguirlo gem installazione fastlane o sudo gem install fastlane. Quest'ultimo è necessario quando si utilizza la versione di Ruby fornita da OS X.

Impostazione del progetto

Dopo aver installato i prerequisiti, è necessario inizializzare il progetto per utilizzare fastlane. Nella cartella del progetto, esegui fastlane init dalla riga di comando per avviare una procedura guidata di installazione interattiva. Il mago ti chiede il tuo indirizzo email e probabilmente il tuo parola d'ordine se non è già nel portachiavi. La procedura guidata rileva anche gli attributi della tua app, come ad esempio nome e identificatore, e controlla il Portale per gli sviluppatori e iTunes Connect se è già presente. Se non lo è, allora offre di crearlo per te. Indolore.

Puoi anche impostare consegnare nello stesso passo. Questo strumento ti consente di caricare metadati, screenshot e binari su iTunes Connect per te. Daremo un'occhiata a questo in un altro tutorial.

Durante il processo di installazione, una nuova cartella, corsia di sorpasso, è creato nella directory del tuo progetto. Contiene dati di configurazione, il più importante dei quali è un file chiamato FastFile. Il file descrive le corsie che Fastlane ha. Ecco il valore predefinito app Store corsia.

desc "Distribuisci una nuova versione nell'App Store" lane: appstore combaciano (tipo: "appstore") snapshot gym deliver (force: true) frameit end

Questo flusso di lavoro o corsia procede come segue:

  • recuperare tutti i certificati di firma e i profili di provisioning (incontro)
  • crea gli screenshot per la tua app (istantanea)
  • crea la tua app per l'app store (Palestra)
  • caricare screenshot, metadati e l'archivio su iTunes Connect (consegnare)
  • crea immagini di marketing con frame di dispositivi dai tuoi screenshot (FrameIt)

In questo particolare tutorial, diamo uno sguardo dettagliato al secondo passaggio, istantanea.

Automazione di screenshot con snapshot

Perché dovresti automatizzare gli screenshot? Sono facili da fare in un simulatore. Questo potrebbe essere vero quando si ha un solo dispositivo o una sola lingua. Facciamo i conti. Se la tua app è disponibile su iPhone e iPad, allora hai sei dimensioni dello schermo (4,7 ", 5,5", 4 ", 3,5", iPad e iPad Pro). Supponiamo anche che la tua app sia disponibile in venti lingue e tu prendi cinque screenshot.

6 (dispositivi) × 20 (lingue) x 5 (schermate) = 600 screenshot

Ora immagina di doverli prendere manualmente. Questo è folle. Fortunatamente, c'è istantanea. Automatizza prendendo screenshot usando il Strumenti di automazione fornito da Apple. Ancora meglio, dal momento che Xcode 7, non è più necessario utilizzare JavaScript per automatizzare questo. Possiamo utilizzare i test Swift e UI per questa attività.

Quando installi fastlane, istantanea è installato pure. Tuttavia, non verrà inizializzato automaticamente istantanea con esso quando si imposta un nuovo progetto. Devi correre snapshot init nella cartella del tuo progetto.

Questo crea due file nel corsia di sorpasso cartella, Snapfile e SnapshotHelper.swift. Devi aggiungere il file Swift alla destinazione del test dell'interfaccia utente del tuo progetto.

Assicurati di aggiungere il file alla destinazione dei test dell'interfaccia utente.

Dopo aver aggiunto questo file, devi anche usare lo snippet di codice istantanea fornisce per salvare screenshot. Puoi utilizzare il file di test dell'interfaccia utente generato da Xcode o crearne uno separato solo per gli screenshot.

Nel impostare() funzione, sostituire XCUIApplication (). Lanciare () con il seguente codice:

let app = XCUIApplication () setupSnapshot (app) app.launch ()

Per chiarezza, puoi anche rinominare testExample (), ma assicurati di non rimuovere il test prefisso del nome della funzione.

Ora è il momento di registrare i passi che fai per generare ciascuno degli screenshot. Puoi anche controllare l'applicazione a livello di codice, ma è molto più semplice utilizzare la funzionalità di registrazione di Xcode e modificarla in seguito per soddisfare le tue esigenze.

Usa il pulsante rosso di registrazione in basso per avviare la registrazione.

Quando registri una semplice interazione, finisci con un codice che assomiglia al seguente:

func testScreenshots () let app = XCUIApplication () lasciare masterNavigationBar = app.navigationBars ["Master"] lasciare addButton = masterNavigationBar.buttons ["Aggiungi"] addButton.tap () addButton.tap () lasciare tablesQuery = app.tables tablesQuery .staticTexts ["2016-04-12 08:43:40 +0000"]. tap () app.navigationBars.matchingIdentifier ("Detail"). buttons ["Master"]. tap () masterNavigationBar.buttons ["Modifica" ] .tap () tablesQuery.buttons ["Elimina 2016-04-12 08:43:39 +0000"]. tap () tablesQuery.buttons ["Elimina"]. tap () masterNavigationBar.buttons ["Fatto"]. toccare ()

L'esempio viene dal valore predefinito Applicazione Master-Detail fornisce il modello Xcode. Subito, puoi vedere il problema con questo codice. Usa identificatori specifici per interagire con l'app. Se eseguissimo di nuovo il test dell'interfaccia utente, fallirebbe perché i timestamp sono diversi.

In una prima fase, possiamo utilizzare una funzione fornita dal framework di test dell'interfaccia utente, elementBoundByIndex (_ :). Questo ci consente di accedere agli elementi, come pulsanti e celle di visualizzazione tabella, usando un indice. Questo porta al seguente codice:

func testScreenshots () let app = XCUIApplication () lasciare masterNavigationBar = app.navigationBars ["Master"] lasciare addButton = masterNavigationBar.buttons ["Aggiungi"] addButton.tap () addButton.tap () lasciare tablesQuery = app.tables tablesQuery .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 ["Elimina"]. Tap () masterNavigationBar.buttons ["Fatto"]. Tap ()

Abbiamo un altro problema quando proviamo a eseguire il codice in più lingue. Fallisce da allora Maestro, Inserisci, ecc. hanno un nome diverso in ogni lingua. Possiamo risolvere questo problema anche usando il elementBoundByIndex (_ :) metodo. Si noti che il pulsante della barra destra sulla barra di navigazione ha effettivamente un indice di 2, significa che è il terzo elemento, perché la barra di navigazione ha sempre un pulsante nascosto nascosto.

func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars.elementBoundByIndex (0) let addButton = masterNavigationBar.buttons.elementBoundByIndex (2) addButton.tap () addButton.tap () lascia tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.elementBoundByIndex (0) .buttons.elementBoundByIndex (0) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap () let cella = tablesQuery.cells.elementBoundByIndex (0) cell.buttons.elementBoundByIndex (0) .tap () cell.buttons.elementBoundByIndex (1) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap ()

C'è un'altra scorciatoia che rende molto più facile l'accesso agli elementi personalizzati dai test dell'interfaccia utente. È una proprietà, accessibilityIdentifier, definito dal UIAccessibilityIdentification protocollo. Puoi usarlo per cercare elementi con questo identificatore, per esempio, app.buttons.matchingIdentifier ( "awesomeButton") elemento.. L'identificatore di accessibilità non è visibile all'utente, anche se ha accessibilità abilitata e non è localizzato.

Dopo aver impostato l'interfaccia utente per lavorare con le lingue supportate dal progetto, è necessario configurarlo istantanea prendere alcuni screenshot. Questo è fatto con il snapshot (_ :) funzione nel test dell'interfaccia utente. È inoltre necessario specificare un nome di file. Personalmente uso un prefisso numerato, come snapshot ( "1MasterView") o snapshot ( "2DetailView") per rendere più facile contare quanti screenshot ho già acquisito e per ordinarli automaticamente. Se hai bisogno di più tempo prima di fare uno screenshot usa il dormire(_:) funzione.

Alla fine, devi dirlo istantanea quali dispositivi e linguaggi dovrebbero usare. Questo è specificato nel Snapfile.

dispositivi (["iPhone 6", "iPhone 6 Plus", "iPhone 4s"]) lingue (["en-US", "de-DE"]))

In questo esempio, sto usando iPhone 6, iPhone 6 Plus e iPad come dispositivi e inglese e tedesco come lingue.

Per eseguire lo strumento, si esegue istantanea dalla riga di comando. A seconda delle dimensioni del progetto e del numero di dispositivi e lingue, può richiedere un po 'di tempo per prendere gli screenshot. Nel frattempo, puoi sgranchirti le gambe, prendere una tazza di caffè o semplicemente osservarne la magia.

Per impostazione predefinita, gli screenshot sono memorizzati in Fastlane / screenshots, con ogni lingua che ha una propria sottocartella e nomi di file preceduti dal nome del dispositivo. Dopo istantanea è finito, genera anche un file HTML per visualizzare facilmente gli screenshot generati.

Al termine dell'istantanea, genera anche un file HTML per visualizzare facilmente gli screenshot generati.

Conclusione

Usando istantanea, puoi ridurre il tempo e gli sforzi necessari per creare screenshot per la tua app a una frazione di ciò che serve se esegui manualmente questa attività. Certo, lo strumento è molto più personalizzabile perché abbiamo solo graffiato la superficie di cosa istantanea può fare. Per ulteriori informazioni, consulta la documentazione su GitHub. Puoi anche controllare il mio corso video su fastlane se vuoi saperne di più su questo fantastico strumento.