Slide 1

Slide 1 text

El pegamento de las Apps con Internet José María Rodríguez Hurtado (@durbon) Android Engineer Herramientas para el desarrollo móvil de apps

Slide 2

Slide 2 text

José Manuel Pereira García ANDROID TEAM LEAD www.jmpergar.com @JMPergar [email protected] +JoseMPereira José María Rodríguez Hurtado ANDROID DEVELOPER & APIs LOVER @durbon [email protected] + +JoséMRodríguez

Slide 3

Slide 3 text

“Casi cualquier app necesita una conexión de red para funcionar” (incluso la app que ahuyenta los mosquitos)

Slide 4

Slide 4 text

¿Somos eficientes usando las peticiones de red en nuestras Apps? 1. Velocidad 2. Errores de red 3. Offline 4. Sincronización 5. Seguridad

Slide 5

Slide 5 text

Velocidad de conexión La red (puede ser) lenta ● Ajustes de conexión según si estamos en WiFi, 3G, 4G: ○ Calidad de las imágenes. Solicitar resoluciones, formatos al API ○ Descarga de datos pesados sólo en WiFi. Ajustes de applicación ○ Usa datos en caché siempre que puedas. Cache-control, ETag ● Usa siempre GZIP, reduce hasta un 70%

Slide 6

Slide 6 text

Errores de conexión Gestionar los errores 4xx y 500. ● Enviar errores a Crashlytics o Analytics para analizarlo. ¿fallos de backend? ● Mensajes informativos, intenta recoger feedback del usuario ¿hay algo incorrecto?

Slide 7

Slide 7 text

Errores de conexión Definir Timeout. ● Gestionar los tiempos de espera: nunca más de 10 seg ● Feedback de loading o fallo. Evitar el loading infinito

Slide 8

Slide 8 text

Errores de conexión Retries ● Reintentos manuales. Botón de reintento UI ● Respetar la transaccionalidad de las acciones. Rollback de las acciones y comprobar estado ● Cola de reintentos en segundo plano. Diferenciar acciones que no requieren más interacción de usuario. Ejemplo: whatsapp

Slide 9

Slide 9 text

¿Funcionamiento offline? Offline First: http://offlinefirst.org/ Probar a usar la app en modo avión (sin conexión) Caché de los datos más usados. Equilibrio entre lógica de negocio en la app y directa del backend Persistir todos los datos posibles de la App Sincronización del uso offline. Colas de sincronización

Slide 10

Slide 10 text

Notificaciones Push Utilizar SaaS que nos faciliten la vida ● Parse ● Amazon SNS Tipos de notificaciones: bulk, topic, personalizadas Sincronización en background usando push

Slide 11

Slide 11 text

Notificaciones Push

Slide 12

Slide 12 text

Seguridad Utilizar HTTPS para TODAS las llamadas Uso de OAuth2 Signature en llamadas para no poder repetir llamadas si alguien intenta crawlear nuestra API

Slide 13

Slide 13 text

Trabajar con APIs (y no acabar con los dedos pegados)

Slide 14

Slide 14 text

“Las APIs son el pegamento entre las apps e Internet”

Slide 15

Slide 15 text

Las frustraciones del desarrollador de apps móviles ● Falta de documentación ● Parseo de respuestas y gestión de errores ● El API aún no está desarrollada (mocks) ● “Manual testing” ● Versionado y mantenimiento de APIs ● Seguridad de las peticiones

Slide 16

Slide 16 text

¿Documentación estática o sandbox interactivos? ● Definición de endpoints, parámetros, response, errores, etc.. (actualizada, por favor) ..pero también necesitamos... ● Entorno trasteable y testable

Slide 17

Slide 17 text

Swagger: agnostic framework for APIs “The goal of Swagger™ is to define a standard, language-agnostic interface to REST APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection” swagger.io

Slide 18

Slide 18 text

Sandbox interactivo

Slide 19

Slide 19 text

Network Traffic Inspection ¿Cómo visualizar que envío y recibo al hacer peticiones a un API? ...y también sirve para “descubrir” APIs

Slide 20

Slide 20 text

● Debug traffic: request, response, header, cache- control, etc.. ● Man-in-middle: desencriptar HTTPS visualizando y modificando request. Reverse proxy SSL ● Performance testing: lag

Slide 21

Slide 21 text

Herramientas Network Traffic Inspection Charles charlesproxy.com/

Slide 22

Slide 22 text

Herramientas Network Traffic Inspection Fiddler telerik.com/fiddler

Slide 23

Slide 23 text

API Workflow Herramientas para almacenar colecciones de llamadas APIs ● Crear peticiones de forma simple y reproducibles ● Documentar llamadas y exportarlas ● Trabajar con distintos entornos staging y pro ● Utilizar helper de autenticación ● Crear script de pruebas ● En definitiva, un Sandbox de pruebas

Slide 24

Slide 24 text

Herramientas API Workflow POSTMAN getpostman.com

Slide 25

Slide 25 text

Mock server ● Evita el bloqueo mientras se está desarrollando una API ● Adelantar trabajo y definir JSON al equipo de Backend ● Pruebas en local sin necesidad de conexión de red. Mock server integrado. ● Y los más importante… TESTING

Slide 26

Slide 26 text

Mockweb server https://github.com/square/okhttp/tree/master/mockwebserver MockResponse. Simular respuestas: header, body, tiempo de respuestas RecorderRequest. Similar al verify podemos comprobar el orden y si se hacen las request correctas. Dispatcher. Crear un pequeño dispatcher para dar lógica a los test.

Slide 27

Slide 27 text

Construir un cliente API ¡NO REINVENTES LA RUEDA! Mantenible y extensible Usa OkHttp y Retrofit

Slide 28

Slide 28 text

OKHttp ● Soporta HTTP/2 y SPDY ● GZIP shrinks ● Response caching evitando repetir llamadas innecesarias. Cache-control ● Pinnear certificados ● Interceptors http://square.github.io/okhttp/

Slide 29

Slide 29 text

Certificates pinning EVITA MAN-IN-THE-MIDDLE public CertificatePinning() { client = new OkHttpClient(); client.setCertificatePinner( new CertificatePinner.Builder() .add("publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=") .add("publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=") .add("publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=") .add("publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=") .build()); } http://square.github.io/okhttp/javadoc/com/squareup/okhttp/CertificatePinner.html

Slide 30

Slide 30 text

Certificates pinning javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure! Peer certificate chain: sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=: CN=publicobject.com, OU=PositiveSSL sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=: CN=COMODO RSA Domain Validation Secure Server CA sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=: CN=COMODO RSA Certification Authority sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=: CN=AddTrust External CA Root Pinned certificates for publicobject.com: sha1/BOGUSPIN at com.squareup.okhttp.CertificatePinner.check(CertificatePinner.java) at com.squareup.okhttp.Connection.upgradeToTls(Connection.java) at com.squareup.okhttp.Connection.connect(Connection.java) at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java) http://square.github.io/okhttp/javadoc/com/squareup/okhttp/CertificatePinner.html

Slide 31

Slide 31 text

OKHttp Interceptors Autentication. Servicio adhoc con la seguridad del API Parámetro comunes de la App. Header con app version, ids Caché Logging y debugging

Slide 32

Slide 32 text

OKHttp Interceptors

Slide 33

Slide 33 text

Retrofit http://square.github.io/retrofit Convertir HTTP APIs en interface Java public interface GitHubService { @GET("/users/{user}/repos") Call> listRepos(@Path("user") String user); } public interface GitHubService { @GET("/users/{user}/repos") Call> listRepos(@Path("user") String user); }

Slide 34

Slide 34 text

Conclusiones Cuidar la capa de red de las aplicaciones Offline First. Diseñar la UI y el componente de caché pensando en ello Utiliza herramientas para debuggear la API

Slide 35

Slide 35 text

Referencias Android Tech Talk: HTTP In A Hostile World - Jesse Wilson https://www.youtube.com/watch?v=tfD2uYjzXFo Offline First http://offlinefirst.org/ OkHTTP Recipes https://github.com/square/okhttp/wiki/Recipes Retrofit http://square.github.io/retrofit/

Slide 36

Slide 36 text

Preguntas @durbon [email protected] + +JoséMRodríguez