iOS Notifications

94
iOS Notifications Teoría, programación, registro, envío, recepción, manejo, etc...

Transcript of iOS Notifications

Page 1: iOS Notifications

iOS NotificationsTeoría, programación, registro, envío, recepción, manejo,

etc...

Page 2: iOS Notifications

Antes de empezar...

• Nombre

• ¿A qué te dedicas?

• ¿Por qué MIMO?

• ¿Qué experiencia tienes como programador?

• ¿Y de apps móviles?

• ¿Qué sabes de las notificaciones de iOS?

Page 3: iOS Notifications

Metodología

Page 4: iOS Notifications

Metodología

Page 5: iOS Notifications

Sobre las dudas...

Page 6: iOS Notifications

Índice de contenidos

• Introducción

• Notificaciones locales

• Notificaciones remotas

• Proveedor de notificaciones

• Un caso práctico

Page 7: iOS Notifications

IntroducciónConociendo las notificaciones

Page 8: iOS Notifications

¿Qué es una notificación?

Page 9: iOS Notifications

• Comunicación oficial y con las formalidades preceptivas de una resolución.

• Noticia veraz de algo.

RAE, 2005

¿Qué es una notificación?

Page 10: iOS Notifications

¿Qué es una notificación?

Mecanismo que tienen las aplicaciones móviles que no se están ejecutando en primer plano para indicar al usuario que tiene alguna información para él.

Page 11: iOS Notifications

¿Cómo se muestran?

Page 12: iOS Notifications

¿Y luego?

Page 13: iOS Notifications

¡Empezamos!

Page 14: iOS Notifications

NotificacionesNotificaciones locales y remotas en profundidad

Page 15: iOS Notifications

Propósito

Permitir a una aplicación informar al usuario que tiene algo para él.

Page 16: iOS Notifications

Casos prácticos

Page 17: iOS Notifications

Notificaciones locales

• Almacenadas y entregadas por el propio sistema operativo.

• Útiles para aplicaciones tipo calendarios, recordatorios, temporizadores, etc...

• Límite de 64 notificaciones programadas por aplicación.

Page 18: iOS Notifications

Notificaciones LocalesApp iOS

App iOS

Programación

Entrega

Page 19: iOS Notifications

Notificaciones remotas

• Conocidas como notificaciones Push.

• Almacenadas por un servidor propio.

• Enviadas por internet (Wi-Fi, 3G, ...).

• Entregadas por APNs al dispositivo.

• Útil para aplicaciones y/o juegos con interacción entre usuarios.

Page 20: iOS Notifications

Push vs. Pull design

Client Server...

Client Server

Pull

Push

Page 21: iOS Notifications

Notificaciones Push

App

iOS

Server

APNs

Page 22: iOS Notifications

Notificaciones LocalesProgramación, recepción y manejo

Page 23: iOS Notifications

Calentamiento

• Crear una nueva aplicación iOS.

• Cuando arranque debe mostrar una pantalla con un sólo botón.

• Cada vez que se pulse el botón, se debe mostrar un mensaje por consola.

• La aplicación debe funcionar en el dispositivo real, no solo en el simulador.

Page 24: iOS Notifications

Programación

Page 25: iOS Notifications

Recepción

Page 26: iOS Notifications

Manejo

Con la aplicación abierta (foreground o background)

Page 27: iOS Notifications

Manejo

Con la aplicación cerrada...

Page 28: iOS Notifications

Finalizando...

• Completar la aplicación para que cuando se reciba una notificación se vaya directamente a una pantalla que muestre los detalles de esa notificación.

• La gestión de pantallas debe realizarse mediante un UINavigationController.

• Debe funcionar tanto si la aplicación esta en background, foreground o cerrada.

Page 29: iOS Notifications

... y esto?

Page 30: iOS Notifications

Badge

Asignación

Manejo

¡¡Asigna directamente el valor al badge!!

Page 31: iOS Notifications

Badge

• Finalizar la aplicación de ejemplo añadiendo funcionalidad para poner a cero el badge cuando la notificación sea ‘leída’.

Page 32: iOS Notifications

Puesta en común

• ¿Cómo diseñaríais una aplicación de recordatorios basados en fechas?

• El badge debe indicar exactamente el número de tareas pendientes

Page 33: iOS Notifications

Conclusiones

• No se puede controlar el badge 100%, habrá que actualizarlo desde la app siempre que sea posible.

• La funcionalidad de nuestra aplicación no puede depender de la notificación, ya que ésta puede no recibirse o ser ignorada.

Page 34: iOS Notifications

Notificaciones PushRegistro, envío, recepción y manejo

Page 35: iOS Notifications

Notificaciones Push

App

iOS

Server

APNs

Page 36: iOS Notifications

APNs

• Siglas de Apple Push Notificacion service.

• ‘Piedra Angular’ del sistema de Notificaciones Apple.

• Recibe y distribuye las notificaciones a sus destinatarios.

• Esa distribución es un servicio PUSH.

Page 37: iOS Notifications

¿Servicio Push?

• ¿Qué es?

• ¿Cómo se consigue?

• ¿Qué ocurrirá con la notificación si el teléfono está apagado?

• ¿Y si no tiene internet?

Page 38: iOS Notifications

APNs: SeguridadMecanismo 1: Seguridad basada en certificados digitales para todas las

comunicaciones.

Aseguramiento de la conexión dispositivo - APNs Aseguramiento de la conexión server - APNs

Page 39: iOS Notifications

APNs: SeguridadMecanismo 2: Seguridad basada en un token único que identifica a cada

dispositivo.

Generación y distribución del token Notificación

Page 40: iOS Notifications

APNs: Seguridad

• Servidor

• Certificado proporcionado por Apple.

• Token de los dispositivos.

• Aplicación Cliente

• Certificado proporciondo por Apple (code sign).

• Haber enviado su token al servidor.

Page 41: iOS Notifications

DEMOGeneración de certificados, configuración del app, ...

Page 42: iOS Notifications

APNs: Otros servicios

• Servicio de información (feedback) que indica los dispositivos que rechazaron notificaciones.

• Política de almacenamiento y reenvío (store and forward), si el destinatario no se encuentra conectado.

Page 43: iOS Notifications

Calentamiento

• Crear una nueva aplicación iOS que tenga un sólo botón en pantalla.

• Cuando arranque debe mostrar una vista oscurecida, tapando el botón y un UIActivityIndicator en el medio girando constantemente y un mensaje de espera.

• La aplicación debe funcionar en el dispositivo real, no solo en el simulador.

Page 44: iOS Notifications

Registro APNs

• Cuando se complete el registro, la vista de carga debe desaparecer.

• El botón debe habilitarse/deshabilitarse dependiendo de si el registro fue correcto o no.

Page 45: iOS Notifications

Solicitando notificaciones• El botón de la pantalla servirá para solicitar notificaciones

a un provider.

• API del provider:

• POST http://mimo-apns.herokuapp.com/users/greet

• Body(JSON): {“name”: “<nombre>”, “token”:”<token>”}

• El token debe contener sólo números y letras, no espacios en blanco ni otros caracteres.

• Pista: Para asegurarnos de que el provider interpreta el body como JSON se debe especificar la cabecera “Content-Type” con “application/json”

Page 46: iOS Notifications

Solicitando notificaciones

Page 47: iOS Notifications

Proveedor de notificaciones

Construcción de un servicio proveedor de notificaciones en Play! Framework

Page 48: iOS Notifications

Provider• Crear un nuevo proyecto en Play!

Framework.

• Debe recibir un POST en la url /users/greet. En el body recibirá un JSON:

• {“name”:”El name”, “token”:”El token”}

• Cuando se reciba la petición, se imprimirán por consola los dos valores recibidos (name y token)

Page 49: iOS Notifications

Provider/conf/routes

/app/controllers/User.java /app/models/User.java

Page 50: iOS Notifications

Requisitos• Componer el payload de la notificación

• Comunicación con API APNs

• Comunicación segura (TLS)

• Envío de datos en binario

• Recepción de la respuesta en binario

• Enviar notificaciones ‘en grupos’

• Obtener feedback periódicamente

Page 51: iOS Notifications

Provider• Construir el JSON que se enviará como ‘payload’ a APNs

{ "aps": { "alert": "Welcome<name>", "sound": "default", "badge": 1 }}

• Pista: Utilizar las clases JsonObject y/o JsonElement para construir el JSON. No lo hagáis a mano.

• Imprimir el JSON por consola. (toString())

Page 52: iOS Notifications

Provider

Page 53: iOS Notifications

Requisitos• Componer el payload de la notificación

• Comunicación con API APNs

• Comunicación segura (TLS)

• Envío de datos en binario

• Recepción de la respuesta en binario

• Enviar notificaciones ‘en grupos’

• Obtener feedback periódicamente

Page 54: iOS Notifications

SSL/TLS

• Framework para establecer conexiones seguras entre dos partes que quieren comunicarse.

• La comunicación se inicia con una fase de handshake:

• Deciden algoritmo, longitud de clave, intercambian certificados y, usando encriptación asimétrica, comparten la clave simétrica final.

Page 55: iOS Notifications

Claves y certificados• Claves de cifrado asimétrico

• Generadas en pares (pública-privada)

• Contenido cifrado con una sólo puede ser descifrado por la otra

• Contenido firmado con una sólo puede ser verificado por la otra

• Certificados

• Clave pública + información identificativa + fecha de expiración

Page 56: iOS Notifications

Confianza

• ¿Cómo saber si el certificado que nos están presentando es veraz?

• 1º:¿El certificado es válido?(no ha expirado)

• 2º: ¿El certificado corresponde al host que lo presenta?

• 3º: ¿Confiamos en la CA que lo generó?

Page 57: iOS Notifications

SSL/TLSUnidireccional Bidireccional

Page 58: iOS Notifications

SSL en JAVA

Page 59: iOS Notifications

Requisitos• Componer el payload de la notificación

• Comunicación con API APNs

• Comunicación segura (TLS)

• Envío de datos en binario

• Recepción de la respuesta en binario

• Enviar notificaciones ‘en grupos’

• Obtener feedback periódicamente

Page 60: iOS Notifications

API APNs

• byte 1

• Identificador único de la notificación

• UNIX Timestamp de expiración (en segundos)

• Longitud del token

• Token del dispositivo en binario

• Longitud del payload

• Payload (máximo 256 bytes y no acabar en null)

Page 61: iOS Notifications

Antes de empezar...

• ¿Cuántos bits componen un byte?

• a) 4

• b) 8

• c) 16

• d) Todas son correctas :)

Page 62: iOS Notifications

Antes de empezar...

• ¿Cómo se representa una serie de bits en código fuente?

• a) 0x101010101

• b) 0xFFFF

• c) 1010101

• d) 0b1010101

Page 63: iOS Notifications

Antes de empezar...

• ¿Cómo se extraen, por programación, los bytes de un número?

Page 64: iOS Notifications

Máscaras

• Se aplican con la operación AND (&).

• Sólo dejan ‘pasar’ cierta información.

• Sirve para detectar qué bits están ‘levantados’

100100100110000001000

&

Máscara

Page 65: iOS Notifications

Desplazamiento de bits• Simplemente desplaza bits

• (número) << posiciones

• 0b1 << 1 = 2 (0b10)

• 0b101<< 2 = 20 (0b10100)

• (número) >> posiciones

• 0b1 >> 0 = 0

• 0b101 >> 2 = 1 (0b1)

Page 66: iOS Notifications

Trabajando con bits

• Crear un nuevo proyecto iOS llamado BitsHandler.

• Construir la interfaz necesaria para que el usuario introduzca un número y se le muestre su representación binaria.

• Pista: Aplicar una máscara con un sólo bit a 1, sucesivamente para ir obteniendo si el número introducido tiene o no el bit correspondiente ‘levantado’.

Page 67: iOS Notifications

Trabajando con bits

Page 68: iOS Notifications

Trabajando con bytes

• Un byte son 8 bits

• Un número hexadecimal son 4 bits

• Un un byte son 2 números hexadecimales

• (byte)8 = 0b00001000 = 0x08

• (byte)255 = 0b11111111 = 0xFF

Page 69: iOS Notifications

Trabajando con bytes

• Añadir al proyecto BitsHandler la capacidad para mostrar también los bytes por que está compuesto el número introducido.

• Pista: Recordad que un ‘int’ contiene 32 bits y un byte 8.

Page 70: iOS Notifications

Trabajando con bytes

¿Usable?¿Cómodo?

Page 71: iOS Notifications

Números hexadecimales

• Facilitan el manejo a nivel de bits.

• Toman valores desde 0 a 15

• Ocupan 4 bits

• 0b00000000111111110000000011111111 = 0x00FF00FF

• ¡¡Mucho más manejable!!

Page 72: iOS Notifications

Números hexadecimales

• Reescribir la función anterior utilizando notación hexadecimal en lugar de notación binaria para la extracción de los bytes.

Page 73: iOS Notifications

Números hexadecimales

• Reescribir la función anterior utilizando notación hexadecimal en lugar de notación binaria para la extracción de los bytes.

Page 74: iOS Notifications

Números hexadecimales

• El deviceToken se recibe en el AppDelegate como un array de bytes de números hexadecimales.

• Escribir el código de la función description del objeto NSData.

• Pista: Para representar un byte como dos números hexadecimales usad formateo: %02X

Page 75: iOS Notifications

Números hexadecimales

Page 76: iOS Notifications

Provider

• Construir el array de bytes que se transmitirá a APNs.

• Pista: Poner en práctica todo lo aprendido.

• Pista: Utilizar un ByteArrayOutputStream para escribir bytes a un array

• Pista: Comprobar el resultado con ByteArrayChecker.

Page 77: iOS Notifications
Page 78: iOS Notifications

Envío• Enviar los datos binarios a través del

OutputStream del Socket.

• Recibir la notificación!

Page 79: iOS Notifications

Envío• Enviar los datos binarios a través del

OutputStream del Socket.

• Recibir la notificación!

Page 80: iOS Notifications

Requisitos• Componer el payload de la notificación

• Comunicación con API APNs

• Comunicación segura (TLS)

• Envío de datos en binario

• Recepción de la respuesta en binario

• Enviar notificaciones ‘en grupos’

• Obtener feedback periódicamente

Page 81: iOS Notifications

Respuesta

• ¡¡APNs SÓLO responde en caso de error!!

• Componentes:

• byte 8

• byte que indica el status

• Identificador único que se envió junto con la notificación.

Page 82: iOS Notifications

Códigos de error

Page 83: iOS Notifications

Provider

• Recibir y parsear la respuesta, si la hay.

• Consejo: Siempre utilizar BufferedInputStream para leer datos de red.

• Pista: APNs no devolverá nada en caso de haber aceptado la notificación. Utilizar el timeout del socket sslSock.setSoTimeout.

Page 84: iOS Notifications

Provider

Page 85: iOS Notifications

Requisitos• Componer el payload de la notificación

• Comunicación con API APNs

• Comunicación segura (TLS)

• Envío de datos en binario

• Recepción de la respuesta en binario

• Enviar notificaciones ‘en grupos’

• Obtener feedback periódicamente

Page 86: iOS Notifications

Puesta en común

¿Qué problemas presenta este provider?

Page 87: iOS Notifications

Puesta en común

¿Qué problemas presenta este provider?

¿Cómo solucionarlos?

Page 88: iOS Notifications

Mejorando el provider

• Utilizar Asynchronous Jobs de Play! para procesar el envío de las notificaciones.

• http://www.playframework.com/documentation/1.2/jobs

• Opción 1: Procesar el envío de notificaciones en Jobs ‘inmediatos’.

• Opción 2: Almacenar las notificaciones pendientes y enviarlas en grupos utilizando un Job periódico.

• Tener en cuenta que si APNs rechaza una notificación, inmediatamente responde y cierra la conexión, por tanto, las siguientes notificaciones deben reenviarse.

Page 89: iOS Notifications

• Componer el payload de la notificación

• Comunicación con API APNs

• Comunicación segura (TLS)

• Envío de datos en binario

• Recepción de la respuesta en binario

• Enviar notificaciones ‘en grupos’

• Obtener feedback periódicamente

Requisitos

Page 90: iOS Notifications

Feedback

• Informa de notificaciones rechazadas por los dispositivos.

• Interfaz binario:

• Recomendable consultarlo una vez al día.

Page 91: iOS Notifications

• Componer el payload de la notificación

• Comunicación con API APNs

• Comunicación segura (TLS)

• Envío de datos en binario

• Recepción de la respuesta en binario

• Enviar notificaciones ‘en grupos’

• Obtener feedback periódicamente

Requisitos

Page 92: iOS Notifications

Caso Práctico

Page 93: iOS Notifications

Caso PrácticoUser

Device

iOS Android

Notification

iOS Android

Page 94: iOS Notifications

Carlos Alonso Pérez Developer

Twitter: @calonso LinkedIn: mrcalonso Mail: [email protected]

¡Gracias!