desarrollando la app de idealista
DESCRIPTION
charla para ironhack explicando el proceso de desarrollo de la app de idealista. centrado en la implementación de la app para ios y el backend creado adhoc para las notificaciones pushTRANSCRIPT
desarrollando la app de idealista
enrique fau@kikefau
● equipo● metodología de desarrollo● herramientas● ¿problemas ios? consejos● mobile backend (api, push notifications)
/índice
¿cuánta gente hay detrás?
desarrollo ágil
● dailies (skype)● sprint● retrospectivas
/agile
desarrollo basado en: scrum
/scrum
/git
● develop● features/xxx● bugs/xxx● release● master
ramas para todo!
herramientas
● jira (kanbantool, trello)● stash (bitbucket, github)● sourcetree● diffmerge● testflight● crashlytics● xiti (google analytics)
/herramientas
pair programming
piloto - copiloto
pomodoros
/pair programming
ping-pong
/pair programming
calidad del producto
● test unitarios (xctest, ocmockito)● test de aceptación (uiautomation)● test manuales (llamar, contactar...)● qa
/calidad
test, test, test!
¿desarrollando para iOS pueden surgir problemas?
● gestión de memoria● compatibilidad iOS 6, 7… 8● statusbar● conflictos git● gestión de dependencias● core data
/problemas
/problemas/memoria
- (id)initWithString:(NSString *)value {if (self = [super init]) {
self.myProperty = [[MyProperty alloc] initWithValue:value];self.myProperty = [[[MyProperty alloc] initWithValue:value] autorelease];_myProperty = [[MyProperty alloc] initWithValue:value];
}return self;
}
- (void)dealloc {[_myProperty release];
[super dealloc];}
@property (nonatomic, retain) MyProperty *myProperty;@synthesize myProperty = _myProperty;
Objective-C message sent to deallocated instance
y entonces llegó... ARC!
/problemas/compatibilidad
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];[[UINavigationBar appearance] setTintColor:[UIColor blueColor]];
} else {[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { [self setNeedsStatusBarAppearanceUpdate];}
- (void)dealloc{
self.tableView.delegate = nil;self.tableView.dataSource = nil;
}
/statusbar
● ¿por qué tocas?, no toques!● soy Dios, y hago todas las vistas a mano● organizarse para tocar *.xib● uso de varios *.storyboard● *.pbxproj text -crlf -diff -merge=union
/problemas/conflictos
*.xib *.storyboard *.pbxproj
/problemas/dependencias
● AFNetworking● RHAddressBook● iRate● SSKeychain● SVProgressHUD
cocoapods con COCO!
chema rodríguez@durbon
mobile backed app idealista.com
10 julio 2014
● api first!● notificaciones push● herramientas● proceso de envío de notificaciones de
idealista● ¿cómo trabajamos juntos?
/índice
“Las APIs son el pegamento de las apps e internet”
Mobile Backend = API + Notificaciones Push
API REST
● JSON (formato de facto)● Stack en Java: Spring framework, Solr,
Oracle, MongoDB, Redis, ActiveMQ
API: Acciones y consultas
● Búsqueda geográfica y por zona ● Información completa de cada anuncio● Usuario: favoritear, descartar, comentar,
contactar, guardar alertas● Subir fotos
¿API pública?
● Ahora, no. Próximamente abierta para todos● API V3 sólo para las apps de iOS y Android● Disponible la V1 (sólo búsqueda geográfica)
Alertas de nuevos inmuebles
1. Email
2. Notificaciones push
Push Notifications
¿Cuántas notificaciones recibimos al día?
Tipo de notificaciones
1. Notificaciones masivas (todos)
2. Suscripción a un topic concreto
3. Notificaciones individuales al usuario
Planteamiento inicial y riesgos
● Registro en APNS del dispositivo● Sincronización entre usuarios: relacionar
usuario idealista con su dispositivo● Badge del número de notificaciones● Límites de envío
Herramientas disponibles: soluciones de terceros
Herramientas disponibles: soluciones de terceros
Ventajas● No necesitas tener un backend propio● Barato si no requieres muchos envíos● SDKs y clientes específicos para iOS o Android. Fácil integración● Paneles de desarrolladores: gestión tipos de push● Integración con plataformas en la nube (Amazon o Google)
Inconvenientes:● Sincronización usuarios BBDD propias fuera de la del servicio● Costes en altos volúmenes de envío
Solución adhoc
Librería JAVAPNS https://code.google.com/p/javapns/
● Encapsula la comunicación con Apple Push Notification Service(APNS)● gestión del certificado de nuestra app (sandbox y production)● Gestión de errores● Envío multihilo de mensajes
● API para el registro de usuarios y activación de alertas
● Construcción de una librería propia (dependencia Maven) de composición de notificaciones (Apple y Android).○ Combinamos JAVAPNS y GCM (también tenemos Android)○ Creamos el mismo mensaje independiente de la plataforma○ Unificamos la gestión de errores de cada plataforma
● Proceso de envío de notificaciones○ Consume alertas que notificar a queue de JMS○ Consultar usuario-token device para el envío○ Construcción de mensaje (BBDD y librería)○ Feedback de errores (canonical deviceID)
PushMessage
String localizedAlert;
List<String> localizedArgs;
Map<String, String> customParameters;
int badge;
{
action = newAds;
adId = 25403184;
adsNumber = 1;
alertId = 513466;
aps = {
alert = {
"loc-args" = (
1,
"pisos, centro hasta 150.000"
);
"loc-key" = "%@ anuncios: %@";
};
badge = 0;
sound = default;
};
typology = homes;
}
"loc-key" debe de estar en los ficheros localizables de la app. el valor
"loc-args" son los posibles argumentos que puede tener el texto:
Payload
Componentes● Tablas de base de datos para la gestión de dispositivos y registro de
notificaciones enviadas: dispositivos activos, log de notificaciones enviadas/falladas/reintentadas, Contador del badge (usado para el envío del badge a iOS).
● Cola JMS a los que estamos suscritos para enviar las alertas● proceso app de envío de notificaciones escalable● proceso de reenvío de notificaciones fallidas● proceso de feedback para el de-registro de dispositivos (cada
madrugada)
¿Cómo trabajamos juntos?
● Documentación API● Entornos de testing (pre producción)● Sandbox para APIs aún en desarrollo● Test de integración con CORE de idealista● Y sobre todo ser ágiles + mucha
comunicación
¿preguntas?
enrique fau@kikefau
chema rodríguez@durbon
¿quieres trabajar con nosotros? mándanos tu CV!