INTRODUCCION A CLOUDKIT #NSCODERMAD_CLOUDKIT JUAN ANTONIO MARTIN - @BYJUANAMN
I N T R O D U C C I O N A
C L O U D K I T
# N S C O D E R M A D _ C L O U D K I T
J U A N A N T O N I O M A R T I N - @ B Y J U A N A M N
A G E N D A
• Introducción
• Activar CloudKit en nuestra App
• Framework CloudKit
• Limitaciones y comparaciones
I N T R O D U C C I Ó N# N S C O D E R M A D _ C L O U D K I T
I N T R O D U C C I Ó N
• CloudKit es una tecnología construida sobre iCloud
• Hasta ahora manejábamos información basada en documentos
• CloudKit está pensada para trabajar con datos estructurados (registros)
• Ahora decidimos cuando movemos datos “de” o “hacia” iCloud
I N T R O D U C C I Ó N
• CloudKit es una tecnología orientada al transporte de información ¿? …. No persiste en local datos
• CloudKit proporciona mecanismos para informarnos cuando suceden cambios en nuestros datos…
• Pero está en el lado del desarrollador la responsabilidad de acceder a la información. Seremos responsables de:
• Decidir cuando obtenemos los datos
• Decidir cuando los guardamos
• Decidir como gestionamos los errores que puedan producirse
I N T R O D U C C I Ó N
• La gestión de identidades/accesos/permisos en CloudKit está basada en iCloud accounts
• nuestros usuarios deben ser usuarios de iCloud
• CloudKit está soportado en OS X e iOS
• Tenemos Bases de datos publicas y privadas
• Datos estructurados y ficheros..
C L O U D K I T F R A M E W O R K# N S C O D E R M A D _ C L O U D K I T
C L O U D K I T F R A M E W O R K
• Framework de CloudKit de un vistazo:
• Containers
• DataBases
• Records
• Record Zones
• Rercord Identifiers
• References
• Assets
I N T R O D U C C I Ó N
!
• Todo empieza por CK
C O N TA I N E R S# N S C O D E R M A D _ C L O U D K I T
C O N TA I N E R S
• CKContainer es la clase que implementa esta parte de CloudKit
• Como en otras tecnología de iCloud, CloudKit organiza toda la información en Containers
• Un container es la representación local de una App tal y como estaría en iCloud
• Cada App tiene un container
C O N TA I N E R S
• Un container está dividido en dos partes: Publica/privada
• Los datos almacenados en la parte privada solo estarán disponibles por el usuario propietario de estos datos
• Los datos públicos estarán disponibles para todos los usuarios de la App
C O N TA I N E R S
• Los datos públicos estarán disponibles aunque el dispositivo no tenga una cuenta de iCloud
• Si necesitamos guardar información SI es necesario que el usuario tenga una cuenta de iCloud activada
• CKContainer nos proporciona acceso a las bases de datos del container
• publicCloudContainer o privateCloudContainer
C O N TA I N E R S
!
• CKContainer nos proporciona un método para detectar si el usuario tiene iCloud activo:
• - accountStatusWithCompletionHandler
• También podemos pedir o consultar permisos
• requestApplicationPermission:completionHandler
• statusForApplicationPermission:completionHandler
D E M O C O N TA I N E R S
D ATA B A S E S# N S C O D E R M A D _ C L O U D K I T
D ATA B A S E S
!
• CKDataBase es la clase que implementa CK para acceder a la base de datos pública o privada del contenedor
• No podemos crear objetos CKDataBase, para acceder usaremos el objeto CKContainer
• Esta clase nos ofrece los mecanismos para interactuar con los datos, realizar querys, guardar registros, etc..
D ATA B A S E S
!
• ¿ Cómo accedemos a las bases de datos?
• CKDataBase pubDb = [[CKContainer defaultContainer] publicCloudDataBase];
• CKDataBase privaDb = [[CKContainer defaultContainer]privateCloudDatabase];
D ATA B A S E S
P Ú B L I C A P R I VA D A
T I P O S D E D AT O S
C O M PA R T I D O S U S U A R I O A C T I V O
C U E N TAN E C E S A R I A S O L O PA R A E S C R I T U R A
C U E N TA D E U S U A R I O
O B L I G AT O R I AP E R M I S O S O S P O R D E F E C T O
T O D O E L M U N D O L E C T U R A
S O L O L E C T U R A E L U S U A R I O
C U O TA D E V E L O P E R U S U A R I O
P E R M I S O S D E E D I C I Ó N
B A S A D O S E N R O L E S ( I D R )
N / A
R E C O R D S# N S C O D E R M A D _ C L O U D K I T
R E C O R D S
• La clase de CK para manejar registros es CKRecord
• Un registro es un diccionario de keys-values
• Cada registro tiene un tipo, esto sirve para diferenciar del resto de tipos usados. Es una cadena que identifica la clase de información que manejará
• Cada key-value representan un campo de un registro y su valor. Los tipos de datos que admite CK están clasificados como simples o complejos
R E C O R D S
• Simples:
• strings, numbers, dates
• Complejos
• localizaciones
• referencias a otros registros
• ficheros
• Y arrays de todos estos
R E C O R D S
• Responsabilidades… porque nada es automático
• Nuestra App debe encargarse de recoger los registros que necesite de manera explicita
• Para hacer un Fetch debemos conocer el ID del Record que necesitamos
• Y si no sabemos el ID??? pues no hay problema, usaremos queries
R E C O R D S
• Responsabilidades…
• Debemos trazar una estrategia de diseño de como usaremos nuestros registros, como accederemos, etc.
• Tipos de relaciones, jugando con las relaciones podemos tener borrado en cascada, cosa que no es sencilla cuando estamos fuera de un modelo relacional
• Mejor que queries usar suscripciones
R E C O R D S
• Esto no es solo para los registros, pero ya que estamos lo contamos… Tenemos dos maneras de usar este framework:
• A través de operation objects (basados en NSOperation)
• Métodos de conveniencia
R E C O R D S
• CKContainer y CKDataBase tienen las dos posibilidades, no tenemos obligación a la hora de elegir de elegir uno u otro ….pero si lo haces con NSOperation mejor
• Jugando con Operations podemos operar con multiples registros a la vez, y podemos definir dependencias para asegurar p.e. que los registros sean salvados en el orden correcto
R E C O R D S
• CKContainer y CKDataBase tienen las dos posibilidades, no tenemos obligación a la hora de elegir de elegir uno u otro ….pero si lo haces con NSOperation mejor
• Jugando con Operations podemos operar con multiples registros a la vez, y podemos definir dependencias para asegurar p.e. que los registros sean salvados en el orden correcto
R E C O R D S
• Para usar un CKRecord usaremos:
• initWithRecordType
• initWithRecordType:zoneID
• itWithRecordType:recordID
R E C O R D S
• Para acceder a sus atributos:
• CKRecord *miRecord = [CKRecord ……
• [miRecord setObject:@“eldato” forKey:@“lakey”];
• miRecord[@“lakey”] = @“eldato”;
R E C O R D S
• Para almacenar un registro usaremos el método saveRecord:completionHandler de un objeto CKDataBase
R E C O R D S
• RecordZone
• una Zona nos permite agrupar un conjunto de datos relacionado, por defecto tenemos 2 zonas (publica/privada)
• En la bbdd privada podemos crear nuestras propias zonas
• Muy útiles para realizar una escritura multiple de varios registros (simulando una transacción)
• Podemos usar relaciones dentro de una zona…pero no entre zonas
R E C O R D S
• RecordID: este objeto sirve para crear identificadores únicos para los registros
• conociendo el ID podemos hacer un fetch para obtener el objeto
• Muy importante combinado con suscripciones
R E C O R D S
• CKQuery & NSPredicate
• La alternativa a los fetchXX pero pagando peajes
• El rendimiento es más pesado
• CloudKit soporta un subconjunto de NSPredicate
R E C O R D S
R E C O R D S
• ¿Cómo creamos una query?
• Creamos un predicado
• Creamos un objeto CKQuery:
• CKQuery *q = [CKQuery alloc]initWithRecordType:predicate];
R E C O R D S
• y por último ejecutamos la query :
• [pubDataBase performQuery:inZoneWithID:completionHandler: ^{NSArray *results, NSError *error){ …}];
R E C O R D S
• Assets o como podemos almacenar otros datos en un CKRecord.
• CKAsset nos permite almacenar BLOBs
• ficheros….
• Como está asociado a un registro, este será su propietario
• El sistema de subida y bajada está bastante optimizado
R E C O R D S
• Mientras que un registro tiene un limite de 1MB máximo, los Asset no tienen limite y no computan dentro del tamaño máximo del registro
R E C O R D S
• CloudKit no es un sistema relacional pero tiene una clase que simula muy bien este aspecto: CKReference
R E C O R D S
• Suscripciones: la idea es que nuestros registros tengan suscripciones y solo cuando se produzcan cambios en los datos pidamos a iCloud que nos los entregue…….¿cómo?
• Notificaciones Push
• a través de la notificación recibiremos el ID del registro que ha cambiado y obtenerlo será tan simple como hacer un fetch
R E C O R D S
• CKSubscrition es el encargado de crear suscripciones
• Asignaremos un tipo de registro y un predicado para crear la condición
• Añadiremos un CKNotificationInfo a la suscripción
• En ultimo lugar guardaremos en la bbdd la suscripción
R E C O R D S
• Ahora solo debemos incluir código para recibir suscripciones y….
D E M O R E C O R D S
D A S H B O A R D# N S C O D E R M A D _ C L O U D K I T
D E M O C O N S O L A
L I M I TA C I O N E S# N S C O D E R M A D _ C L O U D K I T
L I M I TA C I O N E S# N S C O D E R M A D _ C L O U D K I T
L I M I TA C I O N E S
• Cuentas iCloud si o si
• No hay posibilidades de usar otros proveedores
• Solo iOS y OS X, no podemos pensar en otras plataformas
• No hay código de servidor
{ “me”: {“speaker” : “Juan A. Martin”, “company”: “CloudOnMobile”, “contact”: { "mail":"[email protected]”, "twitter":"@byjuanamn", "skype":"by-juanamn" }
}
Muchas Gracias