En la comunidad de desarrolladores de iOS, fastlane es una herramienta muy popular en la actualidad. Lleva una tarea muy tediosa, interactuando con iTunes Connect, y lo hace casi indoloro al automatizar la mayor parte. Analizamos el concepto general de fastlane y aprendemos cómo realizar capturas de pantalla para todos los dispositivos en todos los idiomas con un solo comando..
"El trabajo manual, repetitivo no vale mi tiempo". Cada programador lo ha pensado al menos una vez en su carrera. Sin embargo, la mayoría de nosotros no queremos tomarnos el tiempo para aprender cómo automatizar adecuadamente. Tal vez sea porque solo hacemos esas tareas con poca frecuencia o porque no pensamos tener suficiente tiempo para lidiar con eso ahora.
Especialmente si la tarea es la misma cada vez, pero no aparece mucho, como el lanzamiento de una nueva versión o la distribución de una compilación a los probadores beta. Sin embargo, ciertamente es una buena idea automatizar tales tareas. Es posible que olvide un paso y tenga que comenzar de nuevo o, cuando se trata de versiones beta, puede ser muy tedioso agregar nuevos dispositivos al Portal de desarrolladores y actualizar los perfiles de aprovisionamiento antes de distribuir una nueva compilación.
Aquí es donde entra en juego Fastlane. Automatiza las tuberías de distribución y minimiza la interacción con el Portal del desarrollador y iTunes Connect, desde la comodidad de la línea de comandos o completamente automatizado en su servidor de integración continua..
Fastlane no es solo una herramienta. Es una colección de, al momento de escribir, doce herramientas que siguen la filosofía de Unix "Hacer una cosa y hacerlo bien". Por supuesto, dependen e interactúan entre sí..
Fastlane en sí mismo es una envoltura alrededor de esas herramientas, permitiendo a los desarrolladores definir flujos de trabajo, también conocidos como carriles. Cada flujo de trabajo requiere diferentes herramientas para ejecutarse. Por ejemplo, si desea distribuir una compilación previa al lanzamiento a sus evaluadores, no necesitará crear capturas de pantalla para App Store.
Antes de que pueda comenzar a utilizar Fastlane, debe asegurarse de tener el Xcode Herramientas de línea de comandos instalado. Desde la línea de comando, ejecute xcode-select --install
para instalarlos. Si ya está instalado, verás un error..
Fastlane en sí es una gema de rubí. Dependiendo de tu sistema, tienes que ejecutar gema instalar fastlane
o sudo gema instalar fastlane
. Esto último es necesario cuando está utilizando la versión Ruby proporcionada por OS X.
Después de instalar los requisitos previos, debe inicializar su proyecto para utilizar fastlane. En la carpeta de su proyecto, ejecute inicio rápido
desde la línea de comandos para iniciar un asistente de configuración interactivo. El mago te pide tu dirección de correo electrónico y probablemente tu contraseña Si no está ya en el llavero. El asistente también detecta los atributos de su aplicación, como nombre y identificador, y verifica el Portal del desarrollador y iTunes Connect si ya está presente allí. Si no lo es, entonces ofrece crearlo por ti. Sin dolor.
También puede configurar entregar en el mismo paso Esta herramienta le permite cargar metadatos, capturas de pantalla y el binario a iTunes Connect para usted. Vamos a echar un vistazo a esto en otro tutorial..
Durante el proceso de configuración, una nueva carpeta, carril rápido, Se crea en el directorio de su proyecto. Contiene datos de configuración, el más importante es un archivo llamado Archivo rápido
. El archivo describe los carriles que Fastlane tiene. Aquí está el predeterminado tienda de aplicaciones
carril.
desc "Implementar una nueva versión en el App Store" carril: appstore do match (tipo: "appstore") snapshot gym Deliver (force: true) frameit end
Este flujo de trabajo o carril hace lo siguiente:
En este tutorial en particular, echamos un vistazo detallado al segundo paso., instantánea.
¿Por qué deberías automatizar las capturas de pantalla? Son fáciles de hacer en un simulador. Eso puede ser cierto cuando se tiene un solo dispositivo o un idioma. Vamos a hacer los cálculos. Si su aplicación está disponible en iPhone y iPad, entonces tiene seis tamaños de pantalla (4.7 ", 5.5", 4 ", 3.5", iPad y iPad Pro). Supongamos también que su aplicación está disponible en veinte idiomas y tomas cinco capturas de pantalla.
6 (dispositivos) × 20 (idiomas) x 5 (capturas de pantalla) = 600 capturas de pantalla
Ahora imagina que tienes que tomarlos manualmente. Eso es una locura. Afortunadamente hay instantánea. Automatiza la toma de capturas de pantalla utilizando el Herramientas de automatización proporcionado por Apple. Aún mejor, desde Xcode 7, ya no necesitamos usar JavaScript para automatizar esto. Podemos usar las pruebas Swift y UI para esta tarea.
Cuando instala fastlane, instantánea Se instala también. Sin embargo, no se inicializará automáticamente. instantánea Con ello al configurar un nuevo proyecto. Necesitas correr instantánea de inicio
en la carpeta de tu proyecto.
Esto crea dos archivos en el carril rápido carpeta, Snapfile
y SnapshotHelper.swift
. Debe agregar el archivo Swift al objetivo de prueba de UI de su proyecto.
Después de agregar este archivo, también debe usar el fragmento de código instantánea Proporciona para guardar capturas de pantalla. Puede usar el archivo de prueba de UI generado por Xcode o crear uno separado solo para capturas de pantalla.
En el preparar()
función, reemplazar XCUIApplication (). Launch ()
con el siguiente código:
let app = XCUIApplication () setupSnapshot (app) app.launch ()
Para mayor claridad, también puede cambiar el nombre testExample ()
, pero asegúrate de no quitar el prueba
prefijo del nombre de la función.
Ahora es el momento de registrar los pasos que debe seguir para generar cada una de las capturas de pantalla. También puede controlar la aplicación mediante programación, pero es mucho más fácil usar la funcionalidad de grabación de Xcode y editarla más adelante para que se ajuste a sus necesidades..
Usa el botón rojo de grabación en la parte inferior para comenzar a grabar.Cuando grabas una interacción simple, terminas con un código que se parece a lo siguiente:
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars ["Master"] let addButton = masterNavigationBar.buttons ["Add"] addButton.tap () addButton.tap () let tablesQuery = app.tables tablesQuery .staticTexts ["2016-04-12 08:43:40 +0000"]. toque () app.navigationBars.matchingIdentifier ("Detail"). botones ["Master"]. toque () masterNavigationBar.buttons ["Edit" ] .tap () tablesQuery.buttons ["Delete 2016-04-12 08:43:39 +0000"]. tap () tablesQuery.buttons ["Delete"]. tap () masterNavigationBar.buttons ["Done"]. grifo()
El ejemplo viene de la predeterminada Aplicación Maestro-Detalle plantilla que proporciona Xcode. De inmediato, puedes ver el problema con este código. Utiliza identificadores específicos para interactuar con la aplicación. Si volviéramos a ejecutar la prueba de la interfaz de usuario, fallaría porque las marcas de tiempo son diferentes.
En un primer paso, podemos usar una función proporcionada por el marco UI Test, elementBoundByIndex (_ :)
. Esto nos permite acceder a los elementos, como los botones y las celdas de vista de tabla, mediante un índice. Esto conduce al siguiente código:
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars ["Master"] let addButton = masterNavigationBar.buttons ["Add"] addButton.tap () addButton.tap () let tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.matchingIdentifier ("Detail"). botones ["Master"]. tap () masterNavigationBar.buttons ["Edit"]. tap () tablesQuery.cells.elementBoundByIndex ( 0) .buttons.elementBoundByIndex (0) .tap () tablesQuery.buttons ["Delete"]. Tap () masterNavigationBar.buttons ["Done"]. Tap ()
Tenemos otro problema cuando intentamos ejecutar el código en varios idiomas. Falla desde Dominar, Añadir, Se nombran de manera diferente en cada idioma. Podemos solucionar este problema también utilizando el elementBoundByIndex (_ :)
método. Tenga en cuenta que el botón de la barra derecha en la barra de navegación tiene un índice de 2, lo que significa que es el tercer elemento, porque la barra de navegación siempre tiene un botón de retroceso oculto.
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars.elementBoundByIndex (0) let addButton = masterNavigationBar.button.pra. .cells.elementBoundByIndex (0) .tap () app.navigationBars.elementBoundByIndex (0) .buttons.elementBoundIndex (0) .tap () masterNavigationBar.png.buttons.elementBoundByIndex (0) .tap (). (0) cell.buttons.elementBoundByIndex (0) .tap () cell.buttons.elementBoundByIndex (1) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap ())
Existe otro método abreviado que facilita mucho más el acceso a los elementos personalizados mediante las pruebas de la interfaz de usuario. Es una propiedad, identificador de accesibilidad
, definido por el Identificación de accesibilidad
protocolo. Puede usarlo para buscar elementos con este identificador, por ejemplo, app.buttons.matchingIdentifier ("awesomeButton"). element
. El identificador de accesibilidad no es visible para el usuario, incluso cuando tiene habilitada la accesibilidad, y no está localizado.
Una vez que haya configurado la interfaz de usuario para trabajar con los idiomas compatibles con el proyecto, es hora de configurar instantánea para tomar algunas capturas de pantalla. Esto se hace con la instantánea(_:)
Funcionar en su prueba de interfaz de usuario. También es necesario especificar un nombre de archivo. Personalmente uso un prefijo numerado, como instantánea ("1MasterView")
o instantánea ("2DetailView")
para que sea más fácil contar cuántas capturas de pantalla ya he tomado y ordenarlas automáticamente. Si necesita tiempo adicional antes de tomar una captura de pantalla, use la dormir(_:)
función.
Finalmente, necesitas decir instantánea Qué dispositivos e idiomas debería utilizar. Esto se especifica en el Snapfile
.
dispositivos (["iPhone 6", "iPhone 6 Plus", "iPhone 4s"]) idiomas (["en-US", "de-DE"])
En este ejemplo, estoy usando iPhone 6, iPhone 6 Plus y el iPad como dispositivos e inglés y alemán como idiomas.
Para ejecutar la herramienta, ejecuta instantánea
desde la línea de comando. Dependiendo del tamaño de su proyecto y la cantidad de dispositivos e idiomas, puede tomar bastante tiempo tomar las capturas de pantalla. Mientras tanto, puedes estirar las piernas, tomar una taza de café o simplemente ver cómo funciona su magia..
Por defecto, las capturas de pantalla se almacenan en fastlane / screenshots, Cada idioma tiene su propia subcarpeta y nombres de archivo prefijados con el nombre del dispositivo. Después instantánea está terminado, también genera un archivo HTML para previsualizar fácilmente las capturas de pantalla generadas.
Una vez finalizada la instantánea, también genera un archivo HTML para obtener una vista previa de las capturas de pantalla generadas..Mediante el uso instantánea, puede reducir el tiempo y el esfuerzo necesarios para crear capturas de pantalla para su aplicación a una fracción de lo que toma si realiza esta tarea manualmente. Por supuesto, la herramienta es mucho más personalizable porque solo arañamos la superficie de lo que instantánea puede hacer. Para obtener más información, consulte la documentación en GitHub. También puede ver mi curso de video sobre Fastlane si desea obtener más información sobre esta increíble herramienta..