#NSCODERMAD_CLOUDKIT 
INTRODUCCION 
A 
CLOUDKIT 
JUAN ANTONIO MARTIN - @BYJUANAMN
AGENDA 
• Introducción 
• Activar CloudKit en nuestra App 
• Framework CloudKit 
• Limitaciones y comparaciones
#NSCODERMAD_CLOUDKIT 
INTRODUCCIÓN
INTRODUCCIÓ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
INTRODUCCIÓ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
INTRODUCCIÓ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..
#NSCODERMAD_CLOUDKIT 
CLOUDKIT FRAMEWORK
CLOUDKIT FRAMEWORK 
• Framework de CloudKit de un vistazo: 
• Containers 
• DataBases 
• Records 
• Record Zones 
• Rercord Identifiers 
• References 
• Assets
INTRODUCCIÓN 
! 
• Todo empieza por CK
#NSCODERMAD_CLOUDKIT 
CONTAINERS
CONTAINERS 
• 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
CONTAINERS 
• 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
CONTAINERS 
• 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
CONTAINERS 
! 
• 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
DEMO CONTAINERS
#NSCODERMAD_CLOUDKIT 
DATABASES
DATABASES 
! 
• 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..
DATABASES 
! 
• ¿ Cómo accedemos a las bases de datos? 
• CKDataBase pubDb = [[CKContainer 
defaultContainer] publicCloudDataBase]; 
• CKDataBase privaDb = [[CKContainer 
defaultContainer]privateCloudDatabase];
DATABASES 
PÚBLICA PRIVADA 
TIPOS DE 
DATOS 
COMPARTIDOS USUARIO ACTIVO 
CUENTA 
NECESARIA SOLO 
PARA ESCRITURA 
CUENTA DE 
USUARIO 
P E RMI SOSOS TODO EL MUNDO 
OB L IGATOR IA 
POR DEFECTO 
LECTURA 
SOLO LECTURA EL 
USUARIO 
CUOTA DEVELOPER USUARIO 
PERMISOS DE 
EDICIÓN 
BASADOS EN 
ROLES (IDR) 
N/A
#NSCODERMAD_CLOUDKIT 
RECORDS
RECORDS 
• 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
RECORDS 
• Simples: 
• strings, numbers, dates 
• Complejos 
• localizaciones 
• referencias a otros registros 
• ficheros 
• Y arrays de todos estos
RECORDS 
• 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
RECORDS 
• 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
RECORDS 
• 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
RECORDS 
• 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
RECORDS 
• 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
RECORDS 
• Para usar un CKRecord usaremos: 
• initWithRecordType 
• initWithRecordType:zoneID 
• itWithRecordType:recordID
RECORDS 
• Para acceder a sus atributos: 
• CKRecord *miRecord = [CKRecord …… 
• [miRecord setObject:@“eldato” forKey:@“lakey”]; 
• miRecord[@“lakey”] = @“eldato”;
RECORDS 
• Para almacenar un registro usaremos el método 
saveRecord:completionHandler de un objeto 
CKDataBase
RECORDS 
• 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
RECORDS 
• 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
RECORDS 
• CKQuery & NSPredicate 
• La alternativa a los fetchXX pero pagando peajes 
• El rendimiento es más pesado 
• CloudKit soporta un subconjunto de NSPredicate
RECORDS
RECORDS 
• ¿Cómo creamos una query? 
• Creamos un predicado 
• Creamos un objeto CKQuery: 
• CKQuery *q = [CKQuery 
alloc]initWithRecordType:predicate];
RECORDS 
• y por último ejecutamos la query : 
• [pubDataBase 
performQuery:inZoneWithID:completionHandler: 
^{NSArray *results, NSError *error){ …}];
RECORDS 
• 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
RECORDS 
• 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
RECORDS 
• CloudKit no es un sistema relacional pero tiene una 
clase que simula muy bien este aspecto: 
CKReference
RECORDS 
• 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
RECORDS 
• 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
RECORDS 
• Ahora solo debemos incluir código para recibir 
suscripciones y….
DEMO RECORDS
#NSCODERMAD_CLOUDKIT 
DASHBOARD
DEMO CONSOLA
#NSCODERMAD_CLOUDKIT 
LIMITACIONES
#NSCODERMAD_CLOUDKIT 
LIMITACIONES
LIMITACIONES 
• 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":"juan.antonio.martin@gmail.com”, 
"twitter":"@byjuanamn", 
"skype":"by-juanamn" 
} 
} 
Muchas Gracias

Introducción a CloudKit

  • 1.
    #NSCODERMAD_CLOUDKIT INTRODUCCION A CLOUDKIT JUAN ANTONIO MARTIN - @BYJUANAMN
  • 2.
    AGENDA • Introducción • Activar CloudKit en nuestra App • Framework CloudKit • Limitaciones y comparaciones
  • 3.
  • 4.
    INTRODUCCIÓN • CloudKites 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
  • 5.
    INTRODUCCIÓN • CloudKites 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
  • 6.
    INTRODUCCIÓN • Lagestió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..
  • 7.
  • 8.
    CLOUDKIT FRAMEWORK •Framework de CloudKit de un vistazo: • Containers • DataBases • Records • Record Zones • Rercord Identifiers • References • Assets
  • 9.
    INTRODUCCIÓN ! •Todo empieza por CK
  • 10.
  • 11.
    CONTAINERS • CKContaineres 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
  • 12.
    CONTAINERS • Uncontainer 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
  • 13.
    CONTAINERS • Losdatos 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
  • 14.
    CONTAINERS ! •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
  • 15.
  • 16.
  • 17.
    DATABASES ! •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..
  • 18.
    DATABASES ! •¿ Cómo accedemos a las bases de datos? • CKDataBase pubDb = [[CKContainer defaultContainer] publicCloudDataBase]; • CKDataBase privaDb = [[CKContainer defaultContainer]privateCloudDatabase];
  • 19.
    DATABASES PÚBLICA PRIVADA TIPOS DE DATOS COMPARTIDOS USUARIO ACTIVO CUENTA NECESARIA SOLO PARA ESCRITURA CUENTA DE USUARIO P E RMI SOSOS TODO EL MUNDO OB L IGATOR IA POR DEFECTO LECTURA SOLO LECTURA EL USUARIO CUOTA DEVELOPER USUARIO PERMISOS DE EDICIÓN BASADOS EN ROLES (IDR) N/A
  • 20.
  • 21.
    RECORDS • Laclase 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
  • 22.
    RECORDS • Simples: • strings, numbers, dates • Complejos • localizaciones • referencias a otros registros • ficheros • Y arrays de todos estos
  • 23.
    RECORDS • 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
  • 24.
    RECORDS • 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
  • 25.
    RECORDS • Estono 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
  • 26.
    RECORDS • CKContainery 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
  • 27.
    RECORDS • CKContainery 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
  • 28.
    RECORDS • Parausar un CKRecord usaremos: • initWithRecordType • initWithRecordType:zoneID • itWithRecordType:recordID
  • 29.
    RECORDS • Paraacceder a sus atributos: • CKRecord *miRecord = [CKRecord …… • [miRecord setObject:@“eldato” forKey:@“lakey”]; • miRecord[@“lakey”] = @“eldato”;
  • 30.
    RECORDS • Paraalmacenar un registro usaremos el método saveRecord:completionHandler de un objeto CKDataBase
  • 31.
    RECORDS • 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
  • 32.
    RECORDS • 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
  • 33.
    RECORDS • CKQuery& NSPredicate • La alternativa a los fetchXX pero pagando peajes • El rendimiento es más pesado • CloudKit soporta un subconjunto de NSPredicate
  • 34.
  • 35.
    RECORDS • ¿Cómocreamos una query? • Creamos un predicado • Creamos un objeto CKQuery: • CKQuery *q = [CKQuery alloc]initWithRecordType:predicate];
  • 36.
    RECORDS • ypor último ejecutamos la query : • [pubDataBase performQuery:inZoneWithID:completionHandler: ^{NSArray *results, NSError *error){ …}];
  • 37.
    RECORDS • Assetso 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
  • 38.
    RECORDS • Mientrasque 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
  • 39.
    RECORDS • CloudKitno es un sistema relacional pero tiene una clase que simula muy bien este aspecto: CKReference
  • 40.
    RECORDS • 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
  • 41.
    RECORDS • CKSubscritiones 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
  • 42.
    RECORDS • Ahorasolo debemos incluir código para recibir suscripciones y….
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
    LIMITACIONES • CuentasiCloud 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
  • 49.
    { “me”: {“speaker”: “Juan A. Martin”, “company”: “CloudOnMobile”, “contact”: { "mail":"juan.antonio.martin@gmail.com”, "twitter":"@byjuanamn", "skype":"by-juanamn" } } Muchas Gracias