Documentos de Académico
Documentos de Profesional
Documentos de Cultura
aplicaciones
móviles II - iOS
DESARROLLO DE APLICACIONES MOVILES iOS 2
DESARROLLO DE APLICACIONES MOVILES II - iOS 3
Índice
Presentación 5
Red de contenidos 7
Unidad de Aprendizaje 1
INTRODUCCIÓN A iOS Y SWIFT 9
1.1 Tema 1 : Conceptos básicos de iOS 11
1.1.1 : ¿Qué es el iOS? 11
1.1.2 : Flujo de vida de una aplicación iOS 12
1.1.3 : Arquitectura de una aplicación iOS 15
1.1.4 : Fundamentos de Swift 15
1.1.5 : Creación y administración de cuentas en iTunes Connect y 16
Member Center
Presentación
En la actualidad, el uso de los dispositivos móviles se ha vuelto una tendencia entre
las personas. Estos forman parte de las actividades rutinarias y de empleabilidad. La
tecnología ha avanzado al nivel de crear una dependencia, tanto laboral como social
por parte de las personas y sus comunidades.
Las aplicaciones móviles permiten a los usuarios dar una interfaz gráfica y de mayor
comodidad a esta información. Las empresas buscan crear aplicaciones que integren
las actividades diarias de las personas, que ofrezcan soluciones a sus necesidades y
que posean una experiencia de usuario distintiva de las demás.
Red de contenidos
UNIDAD
1
INTRODUCCIÓN A iOS Y SWIFT
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno podrá reconocer el flujo de vida de una
aplicación móvil iOS, también podrá crear ambientes de desarrollo en XCode y
dar uso a las herramientas CocoaPods y Playground.
TEMARIO
1.1 Tema 1 : Conceptos básicos de iOS
1.1.1 : ¿Qué es el iOS?
1.1.2 : Flujo de vida de una aplicación iOS
1.1.3 : Arquitectura de una aplicación iOS
1.1.4 : Fundamentos de Swift
1.1.5 : Creación y administración de cuentas en iTunes Connect y Member
Center
ACTIVIDADES PROPUESTAS
Carpetas. Posee un sistema simple de carpetas. Con solo arrastrar una aplicación
sobre otra, se generará una carpeta para las aplicaciones, un título por defecto y se
permitirá su edición.
Seguridad. Con el uso de la activación por iCloud, que solicita los datos de acceso de
la cuenta del usuario original, el usuario puede bloquear y hasta inutilizar el equipo en
caso de pérdida o ser víctima de robo. De igual manera, permite conocer la ubicación
de vía GPS y mostrar mensajes en pantalla. No existen métodos comprobados para
saltarse la activación del iCloud sin inutilizar el dispositivo. Es reconocido como el
móvil más seguro del mercado.
desde la barra de estado hacia abajo. Al hacer toque en una notificación, el sistema
abrirá la aplicación.
Game Center. Es la aplicación que integra todos los juegos móviles del dispositivo,
permitiendo la integración entre usuarios y dando facilidades a los desarrolladores,
como tablas de posición y tablas de puntuación. Esto permite, también, el uso de un
servidor para juegos entre varios jugadores y el guardado de la información de los
usuarios en la nube para poder acceder a ellos desde cualquier dispositivo Apple.
Las aplicaciones poseen una sofisticada relación entre el código personalizado del
desarrollador y el framework de iOS. El framework de iOS ofrece la infraestructura
base que todas las aplicaciones necesitan para funcionar y el desarrollador
personaliza la aplicación por medio del código para darle la visualización y la
experiencia de usuario que se desea obtener. Para realizar esta tarea de forma
efectiva, es de ayuda entender un poco sobre la infraestructura de iOS y cómo
funciona.
La función “main”
Estados de ejecución
Vista. Es todo lo que se puede ver de la aplicación y con la que se puede interactuar,
dentro de esta encontraos botones, labels, campos de texto, etc. En general, la
mayoría de los objetos son subclases de UIView.
Modelo. Son los objetos que nos permiten almacenar y manipulas datos. Esto no
tiene nada que ver con la interfaz de usuario y le dice a la aplicación qué tareas llevar
a cabo y cómo llevarlas a cabo, así como qué características van a tener ciertos
objetos.
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Program
ming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309
Apple, como otras empresas, cuenta con un portal en línea para que los
desarrolladores puedan inscribirse y tener facilidades y beneficios al desarrollar con su
tecnología. La inscripción al grupo de desarrolladores es totalmente gratuita. Sin
embargo, para poder subir aplicaciones al App Store, un desarrollador debe pagar una
membresía anual de aproximadamente 100 dólares americanos, lo cual le otorga
varios beneficios, tanto como desarrollador y como empresa. A continuación, vamos a
seguir los pasos para poder inscribirnos en el grupo de desarrolladores de Apple.
Para ello, primero, crearemos un Apple ID y, posteriormente, administraremos
nuestras cuentas en el iTunes Connect y en el Member Center. Para todo esto, Apple
cuenta con una página para desarrolladores, donde podrán acceder al siguiente
enlace https://developer.apple.com.
Creación Apple ID
Para poder crear nuestro Apple ID, lo primero que debemos hacer es dirigirnos a la
página de desarrolladores de Apple: https://developer.apple.com.
Una vez que nos encontremos en la interfaz de inicio de sesión, escogemos la opción
Create Apple ID. Después de esto, aparecerá un formulario donde debemos llenar
nuestros datos para crear la cuenta.
DESARROLLO DE APLICACIONES MOVILES iOS 18
Una vez que hayamos validado el correo electrónico, nos redirigirán a la pantalla de
inicio de sesión, en donde podemos usar nuestro nuevo AppID y clave para ingresar.
Sin embargo, este es el primer paso. Una vez que entremos, podemos ver, en la parte
inferior, una sección para poder unirnos al Programa de desarrolladores de Apple.
Esto es importante para poder crear aplicaciones para el AppStore. Procedemos a
presionar esta opción.
Ahora, se nos presentarán los requisitos para poder unirnos al programa, como
desarrolladores independientes o como una organización (empresa). Procedemos a
presionar el botón “Start Your Enrollment”.
DESARROLLO DE APLICACIONES MOVILES iOS 22
Ahora, nos aparecerá un formulario que nos solicitará la información de nuestra tarjeta
de crédito y la información de facturación. La información otorgada, en estos
formularios, es de carácter importante, porque debe ser totalmente verídica y privada.
Asimismo, si se desea hacer los pagos con una tarjeta ajena a la del desarrollador, se
recomienda hacer el pago con una tarjeta de crédito propia. En todo caso, si utilizara
la tarjeta de crédito de una persona ajena, se le solicitará que envíe una carta notarial
firmada y con copia de algunos documentos para validar la compra. Este proceso
demora una semana extra de tiempo para la validación de los datos.
El correo de activación llegará con un link para poder activar nuestra inscripción al
programa de desarrolladores de Apple. Presionamos en este link.
Ahora, cada vez que ingresemos a nuestra cuenta de desarrolladores, podemos ver
que se ha activado una serie de secciones nuevas, que son las herramientas para
poder trabajar como desarrolladores de Apple. Estas herramientas nos permitirán
crear certificados para nuestras aplicaciones y, a su vez, entrar al iTunes Connect,
donde podemos administrar nuestras aplicaciones y subirlas al AppStore.
iTunes Connect
Para ello, lo primero es ingresar al iTunes Connect. Podemos hacerlo por medio de
nuestro Member Center en el portal de desarrolladores o a través del siguiente enlace:
https://itunesconnect.apple.com.
Se nos pide iniciar sesión. Si no formamos parte del Equipo de Desarrollo de Apple,
no podremos ingresar.
La primera vez que ingresemos, se nos presentarán los términos y condiciones del
servicio, el cual “debemos” leer antes de ingresar.
DESARROLLO DE APLICACIONES MOVILES iOS 30
Una vez dentro, podemos ver las diferentes secciones donde se podrán administrar
para generar las diferentes funcionalidades del iTunes Connect. Para poder hacer un
correcto uso de la herramienta, se recomienda leer el manual del lugar, investigar y
hacer un uso correcto del mismo.
DESARROLLO DE APLICACIONES MOVILES II - iOS 31
Resumen
1. iOS es el sistema operativo de Apple para dispositivos iPhone, iPad y Ipod touch.
2. Las aplicaciones de iOS poseen un flujo de vida que pasa por varios estados, tales
como Not Running, Inactive, Active, Background, Suspended.
3. La arquitectura de una aplicación en iOS se basa en el diseño MVC: Modelo –
Vista - Controlador.
5. Para poder desarrollar para Apple, solo se necesita disponer de un AppleID; sin
embargo, para poder subir aplicaciones al AppStore, se necesita pertenecer al
programa de desarrolladores que sí posee un costo anual.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhon
eOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_P
rogramming_Language
https://developer.apple.com
DESARROLLO DE APLICACIONES MOVILES iOS 32
Conociendo el XCode
Luego de obtener el XCode del App Store, este se instalará de forma automática en
las aplicaciones de su Mac OS. Procedemos a abrir la aplicación. Para ello, nos
dirigimos al LauncPad en la parte inferior de nuestro OSX. Luego, escogemos del
grupo de aplicación el XCode y la seleccionamos.
DESARROLLO DE APLICACIONES MOVILES II - iOS 33
XCode nos presentará una interfaz donde podremos seleccionar un modelo de plantilla
para el tipo de aplicación que deseamos realizar. Esto nos entregará un proyecto pre
configurado con las bases para nuestra aplicación. Todo esto, posteriormente, puede
ser configurado manualmente si se desea realizar un ajuste.
Ahora, se nos presentará una interfaz para poner la información de nuestro proyecto.
En esta parte, debe destacarse que el bundle identifier es el string identificador único
de la aplicación. Este se utilizará en el App Store para poder diferenciar la aplicación
de otras. Asimismo, se va a seleccionar el lenguaje de programación que se utilizará y
el dispositivo al cual estará dirigida la aplicación. Para las demás opciones, se debe
leer el manual del desarrollador para poder hacer modificaciones específicas para
cada proyecto.
Finalmente, nos solicitará que indiquemos en qué carpeta deseamos crear el proyecto
dentro de nuestra Mac OS. Hecho esto, ya disponemos de un proyecto listo para ser
trabajado.
Creación de un PlayGround
Una vez que se haya terminado de crear el archivo, se nos mostrará el ambiente de
trabajo. En la zona principal, podemos observar que se importa por defecto una
librería para que podamos empezar a programar y una primera variable String como
parte del saludo. A la mano derecha, podemos observar una zona donde aparecerá el
resultado en tiempo real de las fórmulas y códigos que desarrollemos. En la parte
inferior, podemos activar una consola para manejar variables y respuestas en tiempo
de ejecución y, también, encontraremos nuestro Run button para poder hacer correr el
código.
Para más información sobre cómo utilizar el PlayGround y los alcances que puede uno
llegar a tener, se debe revisar la documentación en la página de desarrolladores:
https://developer.apple.com/library/ios/recipes/Playground_Help/Chapters/AboutPlaygr
ounds.html#//apple_ref/doc/uid/TP40015166-CH28-SW1
Luego de ello, en la carpeta del proyecto, podemos observar el archivo Podfile, el cual
vendrá a indicar al proyecto qué librerías deseamos utilizar.
Lo único que falta es crear el WorkSpace. Para ello, nos dirigimos nuevamente al
Terminal. Por medio del Terminal, nos ubicamos en la carpeta que contiene el Podfile
y mandamos el comando “pod update”, el cual procederá a crear el WorkSpace.
Una vez que hemos ingresado al WorkSpace, lo principal que podemos notar, en la
parte inferior izquierda de la pantalla, es un segundo proyecto, el cual contendrá a las
librerías Pod y se encargará de administrarlos por nosotros y volverlas accesibles a
todas partes de nuestro proyecto.
Ahora, con nuestro archivo Podfile configurado, procedemos a actualizarlo. Para ello,
nos dirigimos a nuestro Terminal y ubicándonos en la carpeta del proyecto donde está
el Podfile procedemos a mandar el comando “pod update”.
DESARROLLO DE APLICACIONES MOVILES iOS 42
Resumen
1. XCode es el IDE de desarrollo de Apple y es gratuito en el AppStore de las OSX.
3. Cocoa Pods es una herramienta que nos permitirá manejar librerías para nuestros
proyectos.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
https://guides.cocoapods.org/using/getting-started.html
https://developer.apple.com/library/ios/recipes/Playground_Help/Chapters/Abou
tPlaygrounds
DESARROLLO DE APLICACIONES MOVILES iOS 44
DESARROLLO DE APLICACIONES MOVILES II - iOS 45
UNIDAD
2
DESARROLLO DE PANTALLAS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno podrá crear un flujo de navegación para su
aplicación y dispondrá de elementos como tablas y colecciones .
TEMARIO
2.1 Tema 3 : Navegación básica
2.1.1 : Manejo de StoryBoards
2.1.2 : Creación de flujo de pantallas por ViewControllers
2.1.3 : Ciclo de vida del UIViewController (ViewDidLoad, ViewDidAppear,
ViewWillAppear, etc.)
2.1.4 : Manejo de pantallas por UINavigationController
2.1.5 : Manejo de pantallas por UITabBarController
ACTIVIDADES PROPUESTAS
Los StoryBoards vienen a ser herramientas visuales en el XCode que nos permiten
organizar y desarrollar las pantallas de nuestra aplicación. Si bien no estamos
limitados a utilizarlos, estos ayudan de forma muy significativa al manejo de elementos
de la interfaz de usuarios.
Por medio de ellos, podemos indicar el flujo de pantallas de nuestra aplicación, qué
herramientas de interfaz deseamos utilizar en cada pantalla y qué herramientas de la
librería de Cocoa deseamos implementar en cada pantalla. Asimismo, el StoryBoard
guarda la referencia de memoria de cada una de las herramientas que se creen en
este, haciendo de esta forma más ligero el manejo de memoria de la aplicación.
Nuestro proyecto por defecto nos creará un StoryBoard; sin embargo, utilizar un solo
StoryBoard para todo el proyecto es una mala práctica, la mejor alternativa es dividir el
proyecto en varios módulos dependiendo de las funcionalidades, definir qué pantallas
necesitamos para cada módulo y, por último, crear un StoryBoard para cada grupo de
pantallas. Esto nos permitirá trabajar de forma ordenada, inclusive el tiempo de carga
al querer visualizar un StoryBoard será menor ya que tendrá menos información que
mostrar.
Por último, manejar varios StoryBoards nos permitirá trabajar en equipo con otras
personas, ya que el StoryBoard se considera como un solo archivo y su contenido
puede ser modificado por un desarrollador a la vez. Si nos encontramos trabajando
con un grupo de desarrolladores y dos de ellos hacen modificaciones al mismo tiempo
en un StoryBoard, estos no podrán integrarse al momento de unificar la información en
el repositorio. Para ello, la mejor opción es subir uno de los cambios al repositorio y
descartar el otro grupo de cambios, y volver a realizarlos sobre el proyecto
actualizado.
Como podemos ver, el ViewController posee una forma cuadrada. Esto es debido a
que está configurado para visualizarse en todos los tamaños de dispositivos. Esto
puede ser de gran ayuda si deseamos realizar la aplicación para diferentes
dispositivos con diferentes resoluciones de pantalla. Otra opción, en caso nos
sintamos más cómodos desarrollando únicamente para iPhone, es deshabilitar esta
configuración y definir exactamente para qué tipo de dispositivo vamos a desarrollar, y
tener, de esta forma, una mejor previsualización al desarrollar.
Una vez que hayamos desactivado esta opción, se nos mostrará una interfaz donde se
nos indicará para qué tipo de dispositivo deseamos trabajar, iPhone o iPad.
Una vez que hayamos escogido una opción (en este caso, escogeremos iPhone),
veremos cómo el ViewController, dentro de nuestro StoryBoard, se verá de forma
rectangular y vertical. Este cambio no solo se aplica al ViewController sino a todos los
ViewControllers dentro del StoryBoard, y debe hacerse por cada StoryBoard dentro del
proyecto. De esta forma, podemos diseñar StoryBoards para cada dispositivo si lo
deseamos y llamar a los ViewControllers por código según identifiquemos el
dispositivo mediante la programación del código. Debemos tomar en cuenta que esto
DESARROLLO DE APLICACIONES MOVILES iOS 50
no limita que podamos crear la aplicación para varios dispositivos, solo nos indica
cómo se verá dentro del IDE de desarrollo. Para poder realizar un correcto diseño, lo
más recomendable es probar la aplicación en todos los dispositivos en que se va a
utilizar y condicionar el diseño para cada pantalla. No es necesario tener todos los
dispositivos, ya que contamos con un emulador de todos los dispositivos en nuestro
entorno de desarrollo.
Dentro del StoryBoard, podemos crear el flujo de pantallas que debería seguir nuestra
aplicación. Esto nos permite visualizar cómo deberíamos organizar el flujo de
información de nuestra aplicación y, dentro de las pantallas, podemos colocar las
herramientas de interfaz que necesitamos.
Una vez que tenemos nuestro View Controller, procedemos a crear otros
“ViewControllers” según el diseño de nuestra aplicación. Una vez hecho esto,
procedemos a crear el flujo de la aplicación. Primero, seleccionamos un
ViewController. Luego de ello, en la sección de Utilitarios, seleccionamos la opción
“Connections”, que es la que se encuentra a la derecha de las demás.
En esta ventana, encontramos los Triggered Segues. Estos se utilizaban hace tiempo
para indicar a dónde debe dirigirse una pantalla según una acción determinada. Sin
embargo, esto se planteó como una mala práctica, debido a que una ventana no debe
estar limitada por el StoryBoard para indicar el flujo de la aplicación, ya que el
desarrollador debería controlar esto por código. Buscamos la propiedad “manual” y la
enlazamos al “ViewController” al que debería seguir el flujo de la aplicación.
Una vez que se haya hecho el enlace nos indicará qué tipo de enlace deseamos. En
este caso, marcaremos la opción “push”. Una vez hecho esto, podemos visualizar el
“segue” en pantalla.
DESARROLLO DE APLICACIONES MOVILES iOS 52
Existen varios tipos de View Controllers en las herramientas del Cocoa. Varios de
ellos vienen con funciones ya realizadas por defecto para facilitarnos el trabajo; sin
embargo, estos no se verán en el Manual debido a que los objetivos del curso
requieren que uno pueda desarrollar sus propios View Controllers desde uno más
básico y así tener mayor control por código.
Por último, debemos indicar cuál es el primer View Controller que se va a llamar. El
programa por defecto indica que el View Controller creado por defecto en el Main
StoryBoard sea el primero en llamarse. Esto lo indica poniendo una flecha a su lateral
izquierdo. Esta flecha indica el “StoryBoard Entry Point”, que viene a ser el primer
ViewController en mostrarse.
Esta flecha, que vemos en pantalla, podemos asignarla a cualquier View Controller
dentro de los StoryBoards. Esta indica el punto de ingreso al StoryBoard. Cuando
designemos cuál StoryBoard es el que debe cargarse primero, el programa sabrá cuál
es el primer ViewController en mostrar. Para poder asignarla, podemos seleccionarla
y arrastrarla adentro del StoryBoard o a otro ViewController, o también podemos
seleccionar el ViewController que deseamos sea nuestro “StoryBoard Entry Point”. En
la sección de Utilitarios, seleccionamos la cuarta opción “Attributes” y buscamos la
opción “Is Initial View Controller”, la marcamos y automáticamente se va a desmarcar
de cualquier otro View Controller que tenga esta opción activada. Luego de ello,
podemos ver que la flecha del “StoryBoard Entry Point” se ubica al lateral izquierdo de
nuestro View Controller indicando que será el primero en mostrarse y donde empezará
toda nuestra aplicación.
DESARROLLO DE APLICACIONES MOVILES II - iOS 53
Para indicar qué StoryBoard será cargado, primero, debemos ir al InfoPlist. En este,
debemos buscar la opción “Main storyboard file base name” y poner el nombre del
Storyboard que se cargará inmediatamente luego del Launch Screen. De igual forma,
podemos indicar qué StoryBoard contiene el Launch Screen. Para ello, buscamos la
propiedad “Launch Screen interface file base”.
Antes de ello, a cada ViewController del StoryBoard, debemos asignarle una Clase y
un identificador con el cual podrán ser identificados y llamados por código. Asimismo,
podremos reconocer sus atributos y propiedades para poder configurarlos.
Luego, veremos la interfaz donde podemos decidir qué nombre deseamos ponerle a
nuestra Clase e indicar qué debe heredar de “UIViewController”, así como el lenguaje
a utilizar para esta Clase.
Las principales funciones del ciclo de vida de un ViewController vienen a ser seis:
El uso adecuado de estas funciones del ciclo de vida es de suma importancia para
poder manejar la información de la aplicación. Adicionalmente, existen más funciones
del ciclo de vida. Para ello, habrá que leer la documentación en la página de
desarrolladores y saber cuándo debemos utilizarlos.
Una vez hecho esto, podemos ver que al ViewController se le asignó la Clase en el
nombre que lo representa en el StoryBoard. Ahora, nuestro ViewController está
conectado a la Clase que hemos creado.
Para poder hacer uso del Navigation View Controller, primero, debemos crear uno en
nuestro proyecto. En la parte inferior derecha de la sección de Utilitarios, buscamos
Navigation Controller.
El Navigation Controller, al ser creado, viene por defecto con un UIViewController, que
posee un TableView, como su RootViewController. El RootViewController viene a ser
el primer ViewController que será mostrado por el Navigation View. Si nuestro interés
es el de dar uso al ViewController que viene por defecto, lo conservamos; en caso
contrario, lo eliminamos y asignamos otro ViewController como el RootViewController.
Ahora, procedemos a presionar el botón “Build” y podemos ver que primero se cargará
una pantalla blanca que pertenece al Launch Screen seguida de la pantalla roja que
pertenece a nuestro DemoViewController. (Podemos utilizar un simulador o un
dispositivo).
DESARROLLO DE APLICACIONES MOVILES iOS 60
La función primero define un String para el título del NavigationBar. Luego de ello,
configura el botón izquierdo, el cual no será utilizado; por ello, lo llenamos con un texto
vacío. Además, al botón derecho, que sí posee un texto, le configuramos el tamaño, la
fuente y el color de texto. A ambos botones, les agregamos una función por medio de
un “Targuet”, de esta forma, al ser presionados, llamarán a las funciones respectivas
de cada uno.
El TabBar es una herramienta que facilita la transición entre pantallas. A diferencia del
Navigation, el TabBar muestra un menú inferior que nos permite conocer la totalidad
de pantallas que maneja y, con un clic, podemos pasar a cualquier pantalla que
contenga el TabBar sin tener que pasar por las demás.
El TabBar se crea con 2 ViewControllers por defecto, los eliminamos. Luego de ello,
procedemos a indicar el TabBar como el nuevo StoryBoard Entry Point. Ahora,
cuando empieze la aplicación, podemos ver primero el TabBar.
Ahora, debemos indicar qué título y qué imagen deben llevar cada uno de los
ViewControllers en el TabBar. Para ello, escogemos la opción Ítem en los
ViewControllers.
Resumen
1. Los StoryBoards son los archivos que nos ayudarán a manejar el flujo de pantallas
y las herramientas que implementaremos en cada ViewController.
4. El TabBar es una herramienta que nos facilita la transición entre pantallas de forma
directa. Los ítems inferiores son personalizables y no requiere de código para su
implementación.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
https://www.raywenderlich.com/113388/storyboards-tutorial-in-ios-9-part-1
https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptu
al/ViewControllerCatalog/Chapters/TabBarControllers.html
https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptu
al/ViewControllerCatalog/Chapters/NavigationControllers.html
DESARROLLO DE APLICACIONES MOVILES iOS 66
Existe una gran variedad de elementos para la interfaz de usuario, los más básicos
podemos encontrarlos en la librería del Cocoa, en Utilitarios en la parte baja. Para
poder agregarlos al ViewController, lo único que debemos hacer es arrastrarlos desde
ahí al ViewController y posicionarlos.
Todas estas herramientas deben ser referenciadas en nuestra Script del View
Controller. Para ello, habilitamos el Asistant Editor, se encuentra encima de la sección
de Utilitarios y tiene la imagen de dos circunferencias interseccionándose. Cuando lo
DESARROLLO DE APLICACIONES MOVILES II - iOS 67
habilitamos, vemos que se abren dos ventanas. En una de ellas, ubicamos nuestro
StoryBoard y, en el otro, la Clase DemoViewController.
Lo más importante es el manejo de las medidas del frame y del contenido. Para esto,
debemos recordar que, si deseamos que el Scroll funcione, el contenido debe ser
mayor al frame en alguna de las dimensiones, height o width. Para que el contenido
se vea completamente dentro del ScrollView, debemos calcular matemáticamente la
totalidad de elementos y definir el tamaño del contenido dependiendo de ello.
Para poder indicar todo esto, poseemos dos variables dentro del ScrollView: el frame y
el contentsize. El frame nos dará el tamaño y la ubicación de la herramienta, mientras
que el contentsize nos dará las medidas para el alto y ancho del contenido.
DESARROLLO DE APLICACIONES MOVILES iOS 70
Para poder crear una tabla, debemos, primero, tener un ViewController. Para ello,
usaremos nuestro DemoTableViewController. Buscamos el TableView en las
herramientas del Cocoa y, luego de ello, procedemos a arrastrarlo al
DemoTableViewController. Hecho esto, agrandamos la tabla a la medida deseada; sin
embargo, notaremos que viene sin celdas. Para poder agregar una celda, debemos
buscar en las herramientas del Cocoa una llamada Table View Cell, la arrastramos y la
ponemos dentro de la Tabla.
DESARROLLO DE APLICACIONES MOVILES II - iOS 71
Ahora, debemos asegurarnos que, al configurar la tabla, podamos indicar qué celdas
deseamos poner en ella. Para ello, lo primero que hacemos es configurar la celda,
todas las celdas poseen un identificador; por ello, es importante que este tenga un
nombre totalmente diferente a las demás. Para poder programar una celda, debemos
asociarla a una Clase, que herede de UITableViewCell, de la misma forma que
asociamos los ViewControllers a una Clase. Entonces, procederemos a asignar un
identificador para la celda y crear una Clase para la celda.
Podemos crear la Clase de la misma forma que creamos otros Script, indicando que
herede de la Clase TableViewCell.
Ahora que tenemos la celda asociada a su Clase, debemos poder indicar, en la tabla,
qué información deseamos ponerle y cuándo. Para ello, debemos indicarle a la tabla
dos atributos importantes: Delegate y DataSource. El Delegate indica qué Clase es la
encargada de manejar los eventos relacionados a la tabla; y el DataSource, qué
información debe ser presentada en la tabla.
Ahora que hemos asociado la tabla, debemos preparar nuestro Script para que pueda
proporcionar la información necesaria a la tabla. Primero que nada, procedemos a
heredar las Clases necesarias: UITableViewDelegate y UITableViewDataSource.
Ambas Clases, poseen protocolos con una gran variedad de funciones que nos
permiten implementar diversas funcionalidades a nuestra tabla. Un protocolo es un
grupo de propiedades y métodos que conforman una tarea particular para una
funcionalidad. Estos pueden ser adoptados por Clases, estructuras o enumeradores
para proveer implementaciones adicionales a los delegados de una Clase.
Ahora, podemos notar que aparece un error al heredar estas funciones. Para
solucionarlo, debemos cumplir con el protocolo necesario para la herencia. Es
necesario que llamemos a un grupo de funciones para cada caso.
UITableViewDataSource:
Existen 4 funciones básicas que debemos configurar para presentar la tabla con los
datos mínimos.
numberOfRows: Esta función nos indica cuántas filas tendrá cada sección.
UITableViewDelegate
Existe una función que debemos manejar, es la que se usa cuando una persona
realiza un clic en una celda determinada.
Esta función nos permite realizar un bloque de código cuando una de las celdas sea
presionada.
Existen muchas más funciones para el DataSource y el Delegate. Para hacer uso de
ellas, debemos investigar sobre las mismas y darles el uso adecuado.
UICollectionViewDataSource
Estas funciones son iguales a las del TableView, la única diferencia es la llamada de la
celda a poner.
UICollectionViewDelegateFlowLayout
UICollectionViewDelegate
Los paginadores son herramientas que permiten a los usuarios deslizarse entre varios
ViewControllers. A diferencia del Navigation y el TabBar, estos no abarcan el tamaño
total de la pantalla, abarcan un espacio definido por el desarrollador.
Ahora, tenemos un contenedor para el PageView (el view amarillo). Lo que debemos
hacer, ahora, es otorgar los StoryBoards a los respectivos ViewControllers y al
PageView. Luego de ello, debemos crear los Scripts respectivos para cada uno de
ellos y asociarlos.
DESARROLLO DE APLICACIONES MOVILES iOS 82
Una vez hecho esto, creamos una variable que pueda contener nuestro
PageViewController. Luego de ello, llevamos la referencia del PageViewController del
StoryBoard por código, le indicamos su DataSource, su Delegate, un tamaño y una
posición. Finalmente, lo introducimos al ViewContainer.
Ahora, es necesario heredar las dos Clases para el DataSource y el Delegate. Por
temas de orden, realizaremos esta parte de la herencia y protocolo en una extensión
de la Clase, en el mismo Script al final de la Clase MainViewController.
DESARROLLO DE APLICACIONES MOVILES iOS 84
Estas funciones revisan del ViewController actual cuál es su índice, del cual habíamos
guardado previamente la referencia en su Tag. Luego de ello, según el índice, indican
cuál debería ser el siguiente ViewController o el anterior.
Para cumplir con el protocolo del DataSource, hacen falta dos funciones, las cuales
devolveremos con un valor de 0.
DESARROLLO DE APLICACIONES MOVILES iOS 86
Finalmente, para poder ubicar el PageControl (los puntos inferiores que indican el
avance del PageView), podemos hacerlo por medio de los método del DataSource o
preferible por medio de la creación de un PageControl. Esto debe ser indicado
durante las horas de Clase por el profesor.
Para poder indicar el tamaño del View, nos dirigimos a la opción de atributos en la
sección de Utilitarios. En estos, ubicamos la opción “size” y la configuramos como
“FreeForm”.
Una vez hecho esto, podemos cambiar el tamaño del CustomView a una medida más
conveniente para trabajarlo. Para ello, vamos al Size Inspector y, en la opción Width y
Height, indicamos las medidas convenientes.
DESARROLLO DE APLICACIONES MOVILES iOS 88
Finalmente, solo nos queda referenciar y agregar el Custom View por código donde lo
necesitemos. Para ello, se utiliza el siguiente código.
DESARROLLO DE APLICACIONES MOVILES II - iOS 89
Resumen
1. El UIScrollView nos permite mostrar información al usuario con una herramienta
que permite deslizar información más allá de los límites de la pantalla.
2. Las tablas nos permiten mostrar al usuario información ordenada en forma, solo es
posible configurar la altura de la celda más no las otras dimensiones.
3. Las colecciones nos permiten mostrar al usuario una serie de ítems con un orden
definido por el desarrollador. Las dimensiones de los ítems son configurables.
5. Los CustomViews nos permiten configurar Views para luego ser llamados por
código según la conveniencia del desarrollador.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewC
ontroller_Class/index.html
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPageV
iewControllerClassReferenceClassRef/index.html
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITable
View_Class/
https://developer.apple.com
DESARROLLO DE APLICACIONES MOVILES iOS 90
2.3 CONSTRAINTS
El dispositivo rota.
El AutoLayout, también, se activa cuando uno realiza un cambio interno sobre los
ViewControllers. Estos cambios se activan cuando sucede uno de los siguientes
eventos:
Para poder crear un Constraint, por medio del Storyboard, existen dos medios:
seleccionamos nuestro View al que deseamos colocarle un Constrain y presionamos la
segunda opción en la parte inferior de la interfaz del StoryBoard. Esto nos abrirá un
panel con opciones para colocar diferentes Constraints.
DESARROLLO DE APLICACIONES MOVILES II - iOS 91
Por otro lado, si deseamos crear un Constraint del View consigo mismo, debemos
arrastrar el View a sí mismo presionando la tecla Control, mostrando otro panel que
permitirá agregar otro grupo de Constraints.
Ahora que hemos agregado los Constraints en nuestros Views, podemos configurarlos
en el panel de Utilitarios. Seleccionamos el View respectivo, vamos a la sección de
Utilitarios y, en el Size Inspecter, podemos encontrar los Constraints relacionados al
View seleccionado. Hacemos doble clic en el Constraint y abriremos una interfaz para
poder modificarlo.
DESARROLLO DE APLICACIONES MOVILES iOS 92
De esta forma, podemos crear y configurar Constraints por medio del StoryBoard.
Los Constraints creados por código tienen la misma funcionalidad que los creados por
medio del StoryBoard. Estos son creados dentro de variables que los contengan y son
agregados a los Views apilados uno sobre otros. Se debe mantener la referencia de
estos para poder modificarlos en tiempo de ejecución y, dependiendo del tipo de
Constaint, pueden variar los campos a modificar.
Si bien al tener nuestra referencia del Constraint nos permite cambiar el valor del
Constraint en cualquier momento, existe un momento en el ciclo de vida del
ViewController en que se deben reasignar los Constraints de ser necesario. La
función ViewDidLayoutSubviews se activa cada vez que se realiza un evento que
afecte al ViewController. Estos eventos fueron explicados con anterioridad. En esta
función, podemos reasignar los Constraints y configurarlos según sea necesario.
DESARROLLO DE APLICACIONES MOVILES II - iOS 95
Resumen
1. El AutoLayout es el sistema que se encarga de reasignar las medidas del View de
forma dinámica por medio de los Constraints.
2. Los Constraints pueden ser creados por medio del StoryBoard de formas
diferentes. Todas estas permiten que se relacione un View con su contenedor, con
otro View o consigo mismo.
3. Los Constraints pueden ser creados por medio de código, ser referenciados a una
variable y de esta forma agregados a un View.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
https://developer.apple.com/library/ios/documentation/UserExperience/Concept
ual/AutolayoutPG/
https://developer.apple.com
DESARROLLO DE APLICACIONES MOVILES iOS 96
DESARROLLO DE APLICACIONES MOVILES II - iOS 97
UNIDAD
3
ACCESO A DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno podrá acceder a servicios REST, manejar archivos
JSON, almacenar información en el dispositivo y acceder a la información de forma
ordenada.
TEMARIO
3.1 Tema 6 : Implementación de un API y Servicios Rest
3.1.1 : Creación de un Rest Api Manager
3.1.2 : Consumo de servicios Rest
3.1.3 : Envío y recepción de Datos JSON
ACTIVIDADES PROPUESTAS
Para la creación de nuestro Rest Api Manager, vamos a hacer uso de una librería Pod
muy conocida y gratuita, Alamofire. Para ello, creamos un nuevo proyecto. En base a
ese proyecto, crearemos nuestro WorkSpace usando nuestro Terminal y habiendo ya
instalado nuestro CocoaPods. En nuestro archivo Podfile, agregamos nuestra librería
pod 'Alamofire'. Luego de ello, haremos un pod install al podfile y creamos, con ello, la
librería en nuestro WorkSpace.
DESARROLLO DE APLICACIONES MOVILES iOS 100
Ahora que tenemos nuestro WorkSpace con el Pod de Alamofire, necesitamos crear
un Script que nos permita manejar las llamadas Rest. Creamos un archivo Swift con
nombre NetworkManager. En este, crearemos una Clase NetworkManager y, dentro
de ella, una función con la cual podremos hacer llamado a un servicio Rest.
DESARROLLO DE APLICACIONES MOVILES II - iOS 101
Para realizar el consumo de un Api Rest, debemos primero en nuestro código definir
en qué parte deseamos realizar el consumo, sea bien presionando un botón, llenando
una tabla o iniciando un ViewController. El siguiente código muestra una forma en que
podríamos llamar a nuestra función creada previamente.
En el ejemplo, vemos que la primera variable a enviar es la URL que concatena con la
URL base que tenemos registrada en la Clase estática. Como parámetro, deberíamos
enviar un Dictionary; sin embargo, esto lo hacemos solo si es necesario. Esta opción
también acepta un nulo. Finalmente, el CompletionBlock está definido por una
respuesta manejada por dos variables: el boleano “finished” y el diccionario “result”.
En caso se haya logrado finalizar con éxito el llamado al Api, entonces se llamará al
CompletionBlock y el valor del booleano “finished” determinará si se completó o no con
éxito. De ser exitoso, vendrá con valor “true”; en caso contrario, vendrá con valor
“false”. Luego de ello, podemos procesar la información como mejor creamos
conveniente. Tomemos en cuenta que la información relevante, que nos devuelva el
servicio, se encuentra en el diccionario “result”, el cual procesaremos en nuestra
aplicación.
Veamos el caso del iTunes, este posee un servicio Rest gratuito, el cual se consume
únicamente por medio de una URL. Esta posee una estructura raíz seguida de un
comando de búsqueda.
La URL raíz:
A esta URL raíz, debemos agregarle un comando de búsqueda. Para fines didácticos,
utilizaremos el siguiente comando:
DESARROLLO DE APLICACIONES MOVILES iOS 102
La siguiente URL hará un llamado al Api Rest y nos devolverá las búsquedas en el
iTunes. Estas serán hechas en el store de Perú con la palabra “britney”.
La respuesta nos traerá un diccionario con 2 valores: uno es “resultCount”, que nos
indica la cantidad de resultados que se encontraron; y “result”, que viene a ser un
arreglo que contiene varios diccionarios, cada diccionario con la información de cada
canción encontrada con dichos parámetros.
Gran parte de los datos son direcciones URL que apuntan a imágenes para mostrar.
Estas pueden ser mostradas por medio de una imagen web. La mayor consideración
que se debe tomar es que es posible que los arreglos vengan vacíos; por ello, deben
ser casteados primero como arreglos simples y, luego, con ese dato, inicializar
cualquier otro tipo de arreglo que se necesite.
DESARROLLO DE APLICACIONES MOVILES iOS 104
Resumen
1. Alamofire es la librería Pod que nos ayudara a realizar el consumo de servicios
Rest.
3. Es importante que se posea una función estática que nos permita consumir los
servicios Rest desde cualquier parte de nuestra aplicación.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
https://github.com/Alamofire/Alamofire
https://www.raywenderlich.com/121540/alamofire-tutorial-getting-started
https://developer.apple.com
DESARROLLO DE APLICACIONES MOVILES II - iOS 105
La Clase NSUserDefaults provee una interfaz pragmática para interacutar con las
preferencias de la aplicación. Podemos pensar en ella como un diccionario para
almacenar los datos de configuración de la aplicación. Es común utilizar este
diccionario para guardar información del usuario que se encuentra utilizando la
aplicación. Esta data se conserva después de que hayamos cerrado la aplicación,
pero se borra si eliminamos la aplicación del dispositivo.
En este caso, vamos a guardar un String (“dato a guardar”) bajo la key “the_key”. El
dato puede ser cualquier otro, recordemos que este diccionario acepta cualquier tipo
de objeto. Es importante sincronizar la data luego de haber hecho algún cambio en el
diccionario del NSUserDefaults. Como se trata de una Clase estática, podemos
acceder desde cualquier parte de nuestra aplicación para guardar los datos que
necesitemos. A continuación, se muestra un ejemplo de cómo obtener información del
NSUserDefault.
Ahora que hemos obtenido el dato del NSUserDefaults, es muy importante saber qué
tipo de dato estamos obteniendo, para poder castearlo adecuadamente y para que no
nos traiga problemas al implementarlo.
Para la implementación de Base de datos en Core Data, haremos uso de una librería
Pod que nos facilitará el manejo de datos de la tabla. Para ello, primero, creamos una
aplicación que indique el uso de Core Data. Al momento de poner el identificador de la
aplicación y el nombre, seleccionamos, en la parte inferior, la opción Use Core Data.
DESARROLLO DE APLICACIONES MOVILES iOS 106
Hecho esto, podemos visualizar, en nuestro proyecto, un archivo que nos permitirá la
creación de tablas y relación entre ellas. En este ejemplo, solo realizaremos la
creación de una tabla simple y el almacenamiento de datos. Busquemos en nuestro
proyecto el archivo .xcdatamodeid.
DESARROLLO DE APLICACIONES MOVILES II - iOS 107
Este archivo nos mostrará una interfaz para la creación de una tabla. Presionamos la
opción “Add Entity” y veremos cómo se agrega una entidad en la parte superior
derecha. Luego de ello, podremos editar el nombre de la entidad haciéndole doble
clic.
DESARROLLO DE APLICACIONES MOVILES iOS 108
Ahora que tenemos nuestros atributos creados, procedemos a crear un objeto que
maneje nuestra entidad por medio de código. Para ello, en la barra de herramientas,
escogemos la opción Editor / Create NSManageObject Subclass.
DESARROLLO DE APLICACIONES MOVILES iOS 110
Una vez que hemos creado los Script, previamente escogiendo la entidad que
deseamos enlazar a los Scripts, podemos llamar la referencia a ellos por medio de la
Clase creada.
Ahora, debemos crear una Clase que nos permita acceder a la base de datos, guardar
datos y poder acceder a nuestros datos guardados. Creamos un archivo Swift, este lo
generamos desde a File / New / File. Importamos la librería MagicaRecord y creamos
la Clase DataBaseManager.
DESARROLLO DE APLICACIONES MOVILES II - iOS 111
Esta Clase tiene su propia referencia estática para poder ingresar a ella desde
cualquier parte de nuestro proyecto. Ahora, crearemos una función que nos permita
crear una entidad y agregarla a nuestra base de datos.
La función CreateEntity nos permite crear una nueva entidad. Esta se inicializa con
valores predeterminados y nos devuelve dicha entidad para utilizarla como
consideremos. Ahora, cuando creamos una entidad, esta se agrega a la base de
datos; sin embargo, para guardar los cambios realizados a la tabla, debemos crear
una función que nos permita guardar dichos cambios.
Esta función nos permite guardar los cambios realizados en la tabla de la base de
datos. Lo siguiente que deseamos es crear una función que nos devuelva las
entidades de la tabla.
Estas 3 funciones nos permiten obtener entidades de la base de datos, la primera nos
devuelve todas las entidades dentro de la tabla DemoTable; la segunda, la primera
entidad encontrada con un valor definido en un atributo; y la última, un arreglo de
entidades con un valor definido en un atributo.
Estas dos últimas funciones nos permitirán eliminar entidades de la tabla, la primera
nos permite borrar una entidad mientras que la segunda borra todas las entidades de
la tabla. Todas estas funciones son accesibles desde cualquier parte del proyecto,
debido a que se encuentran en una referencia estática, y depende del orden que
maneje el desarrollador para hacer buen uso de ellas.
Para hacer uso del KeyChain, vamos a utilizar la librería, la cargamos con nuestro
Podfile. Esta librería facilita, en gran medida, el uso de nuestro KeyChain. Se encarga
de cargar y descargar la data por nosotros por medio de simples comandos, solo con
importar la librería en la Clase deseada.
Para la importación de esta librería, debemos tomar en cuenta que la versión 3.0 es
funcional con Swift 2.2 y la versión 4.0 es funcional con Swift 3.0. Se debe tomar en
cuenta esto para hacer la exportación adecuada.
DESARROLLO DE APLICACIONES MOVILES II - iOS 113
Ahora, debemos recordar que los valores guardados en el KeyChain deben ser String,
Bool o NSData, y podemos utilizar estas funciones para administrar estos valores
guardados.
La primera función nos permite guardar un dato específico bajo una llave en el
KeyChain. La segunda función nos permite obtener un dato específico bajo una llave
tomando en cuenta que se conoce el tipo de dato para castearlo. Finalmente, la última
función borra todas las variables guardadas en el KeyChain. Utilizar estas funciones
adecuadamente permite el uso correcto de los datos del KeyChain.
DESARROLLO DE APLICACIONES MOVILES iOS 114
Resumen
1. El NSUserDefaults es un sistema de guardado de datos de las aplicaciones,
generalmente usado para información de configuración de la aplicación.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
https://github.com/magicalpanda/MagicalRecord
https://github.com/marketplacer/keychain-swift
https://developer.apple.com