5. Frameworks proporcionan soluciones a problemas recurrentes.
Comunicación HTTP
Descarga asincrona de imágenes
Nuevas soluciones en base de datos
Animaciones
Nuevas formas de programación… etc
Frameworks de terceros cuentan con gran participación de la comunidad
Constante mantenimiento
Nuevas funcionalidades o libres de bugs
6. Gestores de dependencia (Dependency Managers)
Dependencia
“Módulo externo e independiente que puede ser tan pequeño como un simple archivo o tan
grande como una colección de directorios y/o archivos organizados en paquetes para cumplir
con una tarea especifica”
Facilitan la integración de librerías de terceros en nuestra aplicación (al igual que su eliminación y
actualización con nuevas versiones)
Provee mecanismos para agregar código adicional y por tanto nuevas funcionalidades
Coordinan la integración con librerías externas o paquetes a la aplicación
10. Asociarlos con los
targets
(link to binary)
Agregar linker flags
Importarlos en
nuestro proyecto
Descargar
frameworks,
bundles…
…incorporar el framework manualmente?
….Si hay frameworks dependientes,
repetir el proceso
Es un proceso complejo, propenso a
errores …
11. No se cuenta una referencia original del código ( ¿ de dónde salió ? )
Actualizaciones no son fáciles de integrar
No se cuenta con información de las versiones
• Estamos usando versión 1.2.3? o 1.4.0?
• ¿Contamos con el fix de la versión XYZ?
Además…
13. Es una forma de administrar dependencias utilizando git
Crear dependencias
podemos hacer que nuestro proyecto Principal A dependa de proyecto B (framework)
Submódulos Git
Requisito
Tanto el proyecto principal como el framework cuentan con control de versiones Git.
Al agregar un submódulo…
Se genera archivo de configuración oculto: .gitmodules
Se clona el proyecto del framework dentro de un directorio del proyecto principal
El proyecto principal guarda una referencia del commit que apunta el submódulo.
15. Ejemplo: Agregar framework Circle-Menu como submódulo Git
1.Dentro del directorio del proyecto principal, creamos un directorio para almacenar los frameworks (submódulos).
16. Ejemplo: Agregar framework Circle-Menu como submódulo Git
2. Agregamos un submodulo con el siguiente comando:
<<URL>> : del repositorio remoto Circle-Menu
<<DIR_LOCAL>> : es el directorio local dentro de nuestro proyecto,
$git submodule add <<URL>> <<DIR_LOCAL>>
17. Ejemplo: Agregar framework Circle-Menu como submódulo Git
3. Dentro del directorio principal, se crea .gitmodules que almacena un mapeo entre la URL del proyecto y el directorio
local al que se descargó el submodulo.
Al igual que el archivo .gitignore, el archivo .gitmodules debe monitorearse en Git (subirse o descargarse con el resto
del proyecto).
[submodule "MainProject/Frameworks/Internal"]
path = MainProject/Frameworks/Internal
url = https://github.com/Ramotion/circle-menu.git
4. Para obtener un resumen de los submodulos (e.j. commits modificados) usamos:
$git config --global status.submoduleSummary true
18. Ejemplo: Agregar framework Circle-Menu como submódulo Git
5. Preparamos un commit agregando los cambios.
19. Ejemplo: Agregar framework Circle-Menu como submódulo Git
6. Con el Finder, dentro de Frameworks/Internal… ubicamos el proyecto de CircleMenu.xcodeproj y lo arrastramos al
Xcode con nuestro proyecto principal abierto.
20. Ejemplo: Agregar framework Circle-Menu como submódulo Git
7. Seleccionamos el proyecto principal > target MainProject
8. En la pestaña General en Linked Frameworks
agregamos el CircleMenu.framework.
21. Ejemplo: Agregar framework Circle-Menu como submódulo Git
9. Preparamos el commit e integramos la librería en nuestro ViewController
24. 1. Dentro del proyecto del submódulo, hacemos checkout a otro commit o rama
GESTIONANDO CAMBIOS DEL SUBMÓDULO
25. 3. En el proyecto principal cambia la referencia del submódulo.
GESTIONANDO CAMBIOS DEL SUBMÓDULO
26. 3. En el proyecto principal cambia la referencia del submódulo.
GESTIONANDO CAMBIOS DEL SUBMÓDULO
27. Comandos adicionales
Comando Descripción
$git submodule sync Actualiza la metadata de los submódulos cuando la URL cambió
$git submodule update Actualiza los contenidos de los submódulos. Equivalente a correr ”git
fetch” y “git checkout” en cada submódulo
$git rm PATH_SUBMOD. Se remueve del repositorio local y filesystem
29. Dependency manager hecho en Ruby
Instalación de la herramienta
Además de proponer la distribución de librerias de terceros permite su integración automática
Facilmente instalable con el Ruby disponible en el OS X
$sudo gem install cocoapods
Surgió en Agosto – Septiembre del 2011
Cuenta con alrededor de 47 000 librerias y es usado en 3 millones de apps
30. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar una búsqueda de
usuarios.
Pods GitHubServices
Podfile Podfile.lock
31. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar una búsqueda de
usuarios.
1.Creamos un Cocoa Touch framework llamado GitHubServices
2. En terminal, dentro del proyecto, ingresamos el comando para generar un archivo de configuración Podfile
$pod init
32. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar una búsqueda de
usuarios.
3. Llenamos el Podfile con las dependencias que deseamos (indicando la versión , branches o commits)
33. Semantic Versioning
1.4.7
Patch ó fixes^
Minor release
Nuevo feature^
Mayor
release*
• * - Rompe backwards compatibility
• ^ - Sin romper backward compatibility
= >= < <= ~>
Operadores Soportados
35. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar una búsqueda de
usuarios.
4. Para instalar las librerías ingresamos el siguiente comando:
$pod install
36. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar una búsqueda de
usuarios.
5. Cocoapods genera un xcworkspace (una colección de proyectos)
37. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar una búsqueda de
usuarios.
6. Justo como cualquier otro framework, lo importamos en nuestra clase solicitada.
38. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar una búsqueda de
usuarios.
7. Probando el framework con clase XCTestCase
39. Más conceptos sobre Cocoapods…
Podfile.lock Guarda ”snapshot” de las versiones de las dependencias. Es decir,
mantiene/rastrea la versión de cada dependencia.
Podspec Archivo creado por el autor de la librería, indica prerequisitos
como librerías, assets, URLs de repositorios..etc
$pod update Comando para instalar nuevas versiones de librerias o
dependencias
40. Un vistazo a Podfile.lock
Podfile
‘Libreria’ : 1.3.3
pod ‘Libreria’ ~> 1.3
Si n un Podfi l e.l ock puede
exi sti r una desi ncroni zaci ón de
l as versi ones de dependenci as.
44. Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
pod install
Instalado : 1.4.0
Un vistazo a Podfile.lock
pod ‘Libreria’ ~> 1.3
45. Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3 Instalado : 1.4.0
Un vistazo a Podfile.lock
pod ‘Libreria’ ~> 1.3
“Pueden exi sti r confl i ctos con l as dependenci as al
manej ar di ferentes versi ones.”
46. Podfile.lock Podfile.lock
Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
Librería: 1.3.3 Librería: 1.3.3
Un vistazo a Podfile.lock
Al exi sti r un archi vo
Podfi l e.l ock, se da un
segui mi ento a l as versi ones
48. Podfile.lock Podfile.lock
Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
Librería: 1.3.3 Librería: 1.3.3
pod install
Instalado : 1.3.3
Un vistazo a Podfile.lock
Aunque ej ecuta pod i nstal l l a
versi on que se i nstal a no es l a
1.4.0, si no l a 1.3.3
51. Carthage genera binarios de los frameworks y el desarrollador los integra
a su proyecto
2 formas de instalación :
Para consultar la versión de Carthage
A diferencia de Cocoapods, Carthage no ”altera” la estructura del proyecto
No requiere de Podspecs o repositorio centralizado para el desarrollo de dependencias.
Instalador .pkg
Homebrew package manager (Homebrew ayuda a instalar herramientas para Mac OS)
$carthage version
52. Archivo de configuración donde indicamos qué dependencias / librerias deseamos instalar
* Otros elementos opcionales: nombre de rama/ nombre del tag / commit
Consiste de:
github "Alamofire/Alamofire" == 45
Cartfile
Ejemplo:
Origen Nombre Versión (opcional)
Origen de la dependencia puede ser:
Github
Git (la palabra git seguido de git://, http://, ssh:// o path local)
53. Ejemplo: Integrar Lottie, una librería que parsea animaciones con Adobe After Effects en formato json para renderizarlos
en pantalla.
54. Ejemplo: Integrando Lottie con Carthage
1. Definimos nuestro Cartfile de la siguiente manera:
2. En terminal ingresamos el siguiente comando para la descarga y generación de frameworks por cada dependencia:
$carthage update
55. Ejemplo: Integrando Lottie con Carthage
3. A diferencia de Cocoapods, Carthage NO genera un xcworkspace para que podamos trabajar, sino que crea:
Archivo que indica las versiones de
nuestras dependencias.
Ideal subirlo a control de versiones
Contiene los frameworks
construidos por Carthage que se
integrarán manualmente al
proyecto.Directorio para verificar el código
fuente de cada dependencia. Su
contenido puede sobreescribirse.
56. Ejemplo: Integrando Lottie con Carthage
4. Del directorio Carthage>Build>iOS arrastramos el Lottie.framework a la sección de Linked Frameworks and Libraries.
57. Ejemplo: Integrando Lottie con Carthage
5. Ahora bien, necesitamos asegurarnos que los frameworks se copien con un Run Script.
• Se selecciona el target y la pestaña Build
Phases
• En la esquina superor izquierda se
presiona “+” para agregar new Run
Script
• Se ingresa el siguiente script
• Para input files
$(SRCROOT)/Carthage/Build/iOS
/Lottie.framework
/usr/local/bin/carthage
copy-frameworks
58. Ejemplo: Integrando Lottie con Carthage
6. Como paso final, queda incorporar nuestra librería dentro del View Controller adecuado.
60. Carthage
El control de versiones debe dar
seguimiento (track) al archivo como
.gitmodules
El proyecto principal guarda una
referencia al commit del
submódulo.
Asegurarse que esa referencia se
suba al repositorio del proyecto
para el resto del equipo.
Submódulos Git
Se cuentan con 2 opciones:
- Recrear el ambiente
* Subir al repositorio remoto
Podfile.lock y Podfile
* Ejecutar pod install y bajar las
dependencias correspondientes.
- Subir al control de versiones
nuestros pods
Cocoapods
Buenas prácticas
Se cuentan con 2 opciones:
- Recrear el ambiente
* Subir al repositorio remoto
Cartfile.resolved y Cartfile
* Ejecutar carthage bootstrap y
bajar las dependencias
correspondientes.
61. Submódulos Cocoapods Carthage
Requisitos de instalación -
$sudo gem install cocoapods
Homebrew
Instalador .pkg
Proceso de configuración
Clonar repositorio
Incorporar manualmente el framework
Generar archivo de configuración (pod
init)
Instalar las dependencias (pod install)
Trabajar en nueva estructura de
proyecto
Generar archivo de configuración
Instalar dependencias (carthage
update)
Incorporar manualmente los
frameworks
Modifica la estructura del proyecto No Sí No
Archivo de especificación - Podspecs -
Archivo de configuración .gitmodules Podfile Cartfile
Archivo con versiones - Podfile.lock Cartfile.resolved
Modo de actualizar frameworks a
últimas versiones
mediante Git (checkout, pull)
Actualizando Podfile
Ingresar en linea de comando - pod
update
Actualizando Cartfile
Ingresar en linea de comando -
carthage update --platform iOS
Ventajas
Fácil de instalar si contamos con
buenas bases en GIT
Fácil de instalar
Se tiene la opción de recrear el
ambiente ó trabajar con los mismos
pods
Fácil de instalar
Flexible, indicamos diferentes origenes
de las dependencias
Se tiene la opción de recrear el
ambiente ó trabajar con los mismos
binarios
Desventajas
Complejo de gestionar
No contamos con un archivo con las
versiones (Podfile.lock y
Cartfile.resolved)
Mantenimiento del Podspec
Falta mayor flexibilidad al indicar los
origenes de dependencias.
Asegurarse de incorporar los
frameworks manualmente tras instalar
o actualizar
63. Más información
• What are Dependency Managers?
https://medium.com/prodsters/what-are-dependency-managers-26d7d907deb8
• An Introduction to CocoaPods (Route 85)
https://www.youtube.com/watch?v=iEAjvNRdZa0
• CocoaPods and Lockfiles (Route 85)
https://www.youtube.com/watch?v=H-
zK1mEwTe0&index=12&t=0s&list=PLOU2XLYxmsIKGQekfmV0Qk52qLG5LU2jO
• Carthage
https://github.com/Carthage/Carthage#license
• Cómo crear, instalar y utilizar un CocoaPod con storyboards y VCs.
https://medium.com/@angelmoralesk/c%C3%B3mo-crear-instalar-y-utilizar-un-cocoapod-con-sus-
storyboards-y-vcs-e0b791a6e087
64. Más información
• Dependency Management Using Git Submodules
https://www.raywenderlich.com/155150/dependency-management-using-git-submodules
• Circle Menu
https://github.com/Ramotion/circle-
menu?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more
• Lottie
https://github.com/airbnb/lottie-ios