BlaBlaCar - Going Native !

1 018 vues

Publié le

Comment migrer d'une web-app vers une app native ?

Publié dans : Mobile
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 018
Sur SlideShare
0
Issues des intégrations
0
Intégrations
23
Actions
Partages
0
Téléchargements
16
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

BlaBlaCar - Going Native !

  1. 1. Going NATIVE
  2. 2. A fast growing community
  3. 3. A global phenomenon
  4. 4. Historique  Mobile Première  version  en  2009  en  webview  
  5. 5. First apps Natif Webview Natif
  6. 6. Avantages Une  seule  base  de  code   ! ! Mise  à  jour  sans  nouvelles  soumissions   ! ! Le  web  est  le  coeur  de  métier  de  BlaBlaCar    
  7. 7. Quelques  screenshots
  8. 8. Tout  le  monde  adore  !
  9. 9. …  en  2010  !
  10. 10. Mais maintenant …
  11. 11.
  12. 12. État des apps en 2013 … It does the job… but it can be better ! //Flat Design & iOS 7
  13. 13. Technologies dépassée Refonte totale du site principal ! … sur lequel se basent les apps mobiles
  14. 14. V3 : Symfony + ElasticSearch
  15. 15. Conclusion - we need a FULL redesign -
  16. 16. Why Native ?
  17. 17. 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
  18. 18. Archi ! Full-native OAuth2 + REST
  19. 19. Quelques  screenshots
  20. 20. 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
  21. 21. 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]
  22. 22. Gestion des traductions Mise à jour des trads sans re-soumission ! Dev + Prod S3
  23. 23. 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
  24. 24. Soft Launch Spécificités @BlaBlaCar : Feature spread between countries : 
 - Booking
 - Non-Booking
 Nouveaux pays régulièrement => Rollout Progressif par config
  25. 25. 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]; }
  26. 26. 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
  27. 27. 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
  28. 28. 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; }
  29. 29. 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]; } } ! ! ! !
  30. 30. 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]; } } }
  31. 31. Rollout
  32. 32. Résultats
  33. 33. Résultats
  34. 34. 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
  35. 35. We’re hiring! -­‐>  Android  Developer  ;-­‐)   -­‐>  Product  Manager
  36. 36. Erwann ROBIN iOS Developer @Diwann Thanks!

×