Blablacar - Going native - Erwan Robin
-
Upload
cocoaheads-france -
Category
Software
-
view
3.696 -
download
2
Transcript of Blablacar - Going native - Erwan Robin
Going NATIVE
A fast growing community
A global phenomenon
Historique Mobile
Première version en 2009 en webview
First apps
Natif
Webview
Natif
Avantages
Une seule base de code !!
Mise à jour sans nouvelles soumissions !!
Le web est le coeur de métier de BlaBlaCar
Quelques screenshots
Tout le monde adore !
… en 2010 !
Mais maintenant …
…
État des apps en 2013 …
It does the job… but it can be better !
//Flat Design & iOS 7
Technologies dépassée
Refonte totale du site principal ! …
sur lequel se basent les apps mobiles
V3 : Symfony + ElasticSearch
Conclusion
- we need a FULL redesign -
Why Native ?
Why Native ?
- UI plus adaptée - Meilleures performances - API demandée par les partenaires - Accès aux fonctions avancées du device - Gestion d’un mode offline
Archi!
Full-native OAuth2 + REST
Quelques screenshots
Problématique
On souhaite garder la flexibilité d’un site web (traductions) !L’app existante dispose de beaucoup de fonctionnalités
On veut déployer le plus vite possible
BBLocalization !
- Fichiers JSON - Clés "significatives" : écran.vue.element.trad - Traductions chargées au démarrage -> dict - Récupération des nouvelles trads à chaque lancement - Interface web simplifiée :
http://openl10n.io
#define BBLocalizedString(key, comment) [BBLocalization localizedStringForKey:key comment:comment]
Gestion des traductions
Mise à jour des trads sans re-soumission !Dev + Prod
S3
BBLocalization : avantages
- Possibilité de dissocier la langue de l’app et du device - Correction des lacunes de NSLocalizable : - Gestion des pluriels - Ordre des paramètres - Gestion de configs dev / prod - Même format Android / iOS
Soft Launch
Spécificités @BlaBlaCar : Feature spread between countries : - Booking - Non-Booking
Nouveaux pays régulièrement
=> Rollout Progressif par config
Soft Launch-(void) loadAppWithOptions:(NSDictionary *)launchOptions { [self loadVersionOnce]; BOOL isV3 = [[BBDATA configuration] isV3]; UIViewController *rootVC = nil; if (isV3) {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; rootVC = [storyboard instantiateInitialViewController]; UINavigationController *nvc = (UINavigationController *)rootVC; } else { rootVC = [[BlaBlaCarViewController alloc] initWithNibName:@"BlaBlaCarViewController" bundle:nil]; if([self needsCleaning]){ [self cleanEverything:rootVC]; } [self managePush:(BlaBlaCarViewController*)rootVC withOptions: launchOptions]; }
[self.window setRootViewController:rootVC];
}
Roadmap
21/03 09/04 16/04 21/04
Easter
Prod Non booking
April
23/04 30/04
March May June
16/06 30/06 07/07
Continue developing booking & improve non-booking
Internal release
Beta Non booking
Beta Booking
Prod Booking
Internal release
July
Et pour la France ?
Le plus gros pays
= Utilisateurs les plus exigeants
+ Système de réservation + Paiement en ligne
=> Rollout progressif par tirage au sort
+ maitrise de la charge serveur
BBRolloutManager
-(BOOL) canOpenV3 { if (BBDATA.configuration.isV3) { // Bypass : [self recordV3Rollout]; return YES; }
return [self checkRollOut]; } !!-(BOOL) checkRollOut { if ([[NSUserDefaults standardUserDefaults] boolForKey:ROLLOUT_VERIFIED] ) { return YES; } [self rollOutTreatment]; return NO; }
BBRolloutManager
-(void) rollOutTreatment { NSNumber *rollOutValue = [[NSUserDefaults standardUserDefaults] objectForKey:ROLLOUT_VALUE]; if (!rollOutValue) { int random = 1 + arc4random()%100; //1+random(0..99) rollOutValue = [NSNumber numberWithInt:random]; [[NSUserDefaults standardUserDefaults] setValue:rollOutValue forKey: ROLLOUT_VALUE]; } // […] DownLoadFile if (!error) { [self completeRolloutForRandomValue:rollOutValue]; } } !!!!
BBRolloutManager
-(void) recordV3Rollout { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:ROLLOUT_VERIFIED ]; [[NSUserDefaults standardUserDefaults] synchronize]; } !!- (void) completeRolloutForRandomValue:(NSNumber *)value { NSDictionary *dict = [self getDictionaryFrom:[self getRollOutFilePath]]; if (value and dict) { NSNumber *number = [dict objectForKey:ROLLOUT_VALUE]; if ([value intValue]<=[number intValue]) { [self recordV3Rollout]; }
}
}
Rollout
Résultats
Résultats
FeedBacks
Système de tirage au sort pour les « anciens » Nouvelle version automatique pour les nouveaux
Beaucoup de maj sans nouveautés pour les non-‐élus
Ne pas annoncer le switch trop tôt : crée de l’attente
We’re hiring!
-‐> Android Developer ;-‐) -‐> Product Manager
Erwann ROBIN iOS Developer @Diwann
Thanks!