Bienvenido, soy Luis y en esta ocasión les traigo un post.
En mi publicación anterior sobre cómo crear funciones como marcos, hablé de cómo puede mejorar la productividad de su equipo mediante el uso de marcos de iOS directamente en el espacio de trabajo de su proyecto.
El ejemplo que analicé fue bastante simple y proporcionó un punto de partida para este enfoque, pero muchos de nosotros necesitamos construir algo más complejo, que generalmente incluye dependencias de terceros.
Puede ser un poco complicado integrar CocoaPods en su proyecto cuando está estructurado así, así que esto es lo que me gustaría explicar en este tutorial.
Índice
¿CocoaPods o Carthage?
Al decidir sobre un administrador de dependencias para su proyecto de iOS, la mayoría de las personas eligen entre dos opciones: CocoaPods o Carthage.
CocoaPods ha sido el portador estándar durante muchos años y es una base de código muy madura con toneladas de paquetes para elegir.
La forma en que integra el código en su proyecto es creando un objetivo de marco para cada uno de los pods incluidos, construyendo los marcos y copiándolos en el módulo principal de la aplicación mediante un script especial.
Esto significa que las dependencias deben integrarse en su proyecto manualmente, pero le da a su proyecto independencia de Carthage.
Lo que elija como administrador de paquetes depende de usted, e incluso puede usar ambos si lo necesita. Carthage tiene la ventaja de no volver a escribir ninguno de los archivos de su proyecto, mientras que CocoaPods solo toma unos pocos pasos automatizados para comenzar.
En este artículo, repasaré cómo integrar CocoaPods en sus marcos internos.
Empezando con CocoaPods
Comencemos con el pequeño proyecto de ejemplo sobre el que escribí en el artículo anterior. He realizado todos los siguientes cambios en una rama del repositorio llamado use-cocoapods
, pero puede comenzar con lo que ya está en la rama maestra. Si se queda atascado, consulte el código para ver el resultado final.
Asegúrese de tener CocoaPods instalado, ya sea en todo el sistema o usando Bundler con CocoaPods definidos en su Gemfile.
Si ha usado CocoaPods antes, probablemente sepa que la forma habitual de comenzar a usarlo es ejecutando pod init
en el directorio que contiene el expediente .xcproject
.
La ejecución de este comando crea un espacio de trabajo que CocoaPods puede usar para administrar las dependencias. Debido a que ya creamos nuestro propio espacio de trabajo que contiene nuestras dependencias internas, tendremos que hacer algo un poco diferente.
Con un editor de texto, cree un nuevo archivo llamado Podfile
en el directorio raíz del repositorio de git. Agregue las siguientes líneas:
use_frameworks!workspace 'SimpleCounter.xcworkspace'
Esto le dice a CocoaPods que quieres utilizar un espacio de trabajo existente para contener las dependencias de tu Pod. correr pod install
en el mismo directorio para confirmar que está funcionando.
Esto no instalará nada, pero integrará el proyecto Pods en ese espacio de trabajo.
Integrar un CocoaPod
Integremos el UICircularProcessingRing
Pod a nuestra aplicación y marco. Esta es una barra de progreso simple en forma de anillo que podemos usar para mostrar el progreso del conteo hacia un objetivo específico.
Agregue lo siguiente a su Podfile:
target 'SimpleCounterFeature' do project './SimpleCounterFeature/SimpleCounterFeature.xcodeproj' pod 'UICircularProgressRing', '6.1.0' end
Esto aplicará el UICircularProgressRing
CocoaPod al objetivo SimpleCounterFeature
marco. Todo esto parece familiar, excepto que especifica la exacta archivo .xcodeproj
que necesita la dependencia.
Necesitamos hacer esto porque en el directorio raíz con nuestro .xcworkspace
, no está claro para CocoaPods dónde está el objetivo que necesita la dependencia.
Por lo general, el archivo .xcproject
para el módulo de la aplicación principal y el generado por CocoaPods .xcworkspace
archivo en vivo en el mismo directorio, por lo que CocoaPods lo encontrará por defecto.
Entonces corre pod install
. Esto descargará y aplicará la dependencia UICircularProgressRing
al objetivo SimpleCounterFeature
marco.
Ahora, probemos para ver si la integración fue exitosa. Abre el CounterViewController.swift
archivar y agregar
import UICircularProgressRing
al principio del archivo. Selecciona el SimpleCounterFeature
apuntar en la lista de objetivos y construir. La construcción debería tener éxito.
Ahora intente construir y ejecutar el SimpleCounterApp
apuntar y ver qué pasa. La compilación se realizará correctamente, ¡pero la aplicación se bloqueará al iniciarse! Recibimos el siguiente mensaje de error:
dyld: Library not loaded: @rpath/UICircularProgressRing.framework/UICircularProgressRingReferenced from: /Users/akfreas/Library/Developer/Xcode/DerivedData/SimpleCounter-awbumravmznuqofjwyrvfwfaoohc/Build/Products/Debug-iphonesimulator/SimpleCounterFeature.framework/SimpleCounterFeatureReason: image not found
¿Porqué es eso? Agregamos la dependencia a nuestro SimpleCounterFeature
y se construyó bien, ¡al igual que la aplicación! ¿Porque dice library not loaded
?
Tengo que vincularlos a todos
Lo que falta es el compilado real UICircularProgressRing
binario que las solicitudes SimpleCounterFeature
cuando se carga.
Esto se debe a que los marcos de iOS son vinculado dinámicamente, lo que significa que solo hacen referencia a sus dependencias en lugar de empaquetarlas con la imagen binaria compilada.
Hacer esto generalmente reduce el tamaño de la aplicación, ya que las dependencias que se comparten entre los binarios en la imagen ejecutable (en este caso, nuestro módulo de la aplicación) no se duplican y, en cambio, el vinculador dinámico las carga solo una vez.
En este caso, el vinculador es una utilidad de Apple llamada dyld
, que arrojó el error fatal anterior.
En otras palabras, la aplicación no tiene idea de dónde encontrar el binario UICircularProgressRing
porque no estaba empaquetado con el framework SimpleCounterFeature
o el módulo principal de la aplicación.
Cuando dyld
carga el SimpleCounterFramework
, se solicita ese binario pero no se puede encontrar, lo que provoca el bloqueo.
Lo que tenemos que hacer es agregar el framework UICircularProgressRing
a los binarios vinculados del módulo principal de la aplicación. Esto se hace agregando estas líneas a su Podfile
:
target 'SimpleCounterApp' do project './SimpleCounterApp/SimpleCounterApp.xcodeproj' pod 'UICircularProgressRing', '6.1.0' end
Ahora, corre pod install
, limpie el destino de la aplicación e intente compilar y ejecutar la aplicación nuevamente. Es posible que deba eliminar la aplicación de su simulador o dispositivo si no ve la interfaz del contador al iniciar.
Dependencias ordenadas, ¡construyamos algo!
Ahora que tenemos el binario de la interfaz de usuario disponible para ambos objetivos, podemos usarlo. Integré la vista de progreso en el marco, que puede consultar en el código en github.
Aquí no hay nada realmente único en la construcción con frameworks, así que lo dejo para que lo veas tú. Lo que nos queda es una interfaz que se ve así:
Problemas comunes
Hay algunos problemas con los que puede encontrarse al integrar más dependencias en el módulo y el marco de su aplicación.
Si obtiene el mismo error que tuvimos arriba, donde dyld
se queja de que no puede encontrar su marco interno, asegúrese de que tiene el marco en la lista tanto en Marcos vinculados como en Bibliotecas y en Binarios integrados en la sección General de la configuración de compilación para el módulo principal de la aplicación. Debe tener un aspecto como este:
Si está creando su marco para otra arquitectura, como WatchOS, necesitará crear otro destino de compilación en su proyecto de marco que compile su código para esa arquitectura.
Al configurar el SDK base en watchOS y las arquitecturas válidas en armv7k
, puede crear su marco para watchOS e integrarlo en su módulo principal de la aplicación watchOS de la misma manera que lo hizo para la aplicación iOS.
Si tiene alguna pregunta, sugerencia o ha encontrado algún problema al hacer esto en su proyecto, ¡no dude en dejar un comentario a continuación!
Añadir comentario