SlideShare une entreprise Scribd logo
1  sur  36
Télécharger pour lire hors ligne
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!

Contenu connexe

Tendances

Tendances (20)

3D Touch
3D Touch3D Touch
3D Touch
 
Test flight
Test flightTest flight
Test flight
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par Celedev
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers Storyboards
 
Nouveauté iOS 6
Nouveauté iOS 6Nouveauté iOS 6
Nouveauté iOS 6
 
Multi-Threading Et Cocoa
Multi-Threading Et CocoaMulti-Threading Et Cocoa
Multi-Threading Et Cocoa
 
Plugins Xcode
Plugins XcodePlugins Xcode
Plugins Xcode
 
How javascript core helped PAW to move from a small app to an extensible tool
How javascript core helped PAW to move from a small app to an extensible toolHow javascript core helped PAW to move from a small app to an extensible tool
How javascript core helped PAW to move from a small app to an extensible tool
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter Meuel
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & Android
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - Epitez
 
Ionic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,SassIonic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,Sass
 
J'ai fait une app native en React Native
J'ai fait une app native en React NativeJ'ai fait une app native en React Native
J'ai fait une app native en React Native
 
Xcode 4.5
Xcode 4.5Xcode 4.5
Xcode 4.5
 
Développement web mobile avec IONIC 2
Développement web mobile avec IONIC 2Développement web mobile avec IONIC 2
Développement web mobile avec IONIC 2
 
Firebase par nicolas lehovetzki
Firebase par nicolas lehovetzkiFirebase par nicolas lehovetzki
Firebase par nicolas lehovetzki
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
5 android web_service
5 android web_service5 android web_service
5 android web_service
 
Introduction à Play Framework 2
Introduction à Play Framework 2Introduction à Play Framework 2
Introduction à Play Framework 2
 

Similaire à Blablacar - Going native - Erwan Robin

Introduction à TeamCity
Introduction à TeamCityIntroduction à TeamCity
Introduction à TeamCity
Ulrich VACHON
 
Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...
Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...
Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...
Publicis Sapient Engineering
 

Similaire à Blablacar - Going native - Erwan Robin (20)

jQuery Mobile & Applications Web
jQuery Mobile & Applications WebjQuery Mobile & Applications Web
jQuery Mobile & Applications Web
 
Cours cordova & REST
Cours cordova & RESTCours cordova & REST
Cours cordova & REST
 
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
 
jQuery mobile vs Twitter bootstrap
jQuery mobile vs Twitter bootstrapjQuery mobile vs Twitter bootstrap
jQuery mobile vs Twitter bootstrap
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrine
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libre
 
Cobalt chez Orange Lannion, 2015
Cobalt chez Orange Lannion, 2015Cobalt chez Orange Lannion, 2015
Cobalt chez Orange Lannion, 2015
 
[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR
 
Meetup - Construire des applications serverless avec Azure
Meetup - Construire des applications serverless avec AzureMeetup - Construire des applications serverless avec Azure
Meetup - Construire des applications serverless avec Azure
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
Introduction à TeamCity
Introduction à TeamCityIntroduction à TeamCity
Introduction à TeamCity
 
Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...
Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...
Open XKE - De l'intégration continue au déploiement continu sur iOS et Androi...
 
Qualité & Industrialisation des développements mobiles sur iOS & Android
Qualité & Industrialisation des développements mobiles sur iOS & AndroidQualité & Industrialisation des développements mobiles sur iOS & Android
Qualité & Industrialisation des développements mobiles sur iOS & Android
 
Human Talks Grenoble 08/09/2015 - AngularJS et Cordova = applications WEB et ...
Human Talks Grenoble 08/09/2015 - AngularJS et Cordova = applications WEB et ...Human Talks Grenoble 08/09/2015 - AngularJS et Cordova = applications WEB et ...
Human Talks Grenoble 08/09/2015 - AngularJS et Cordova = applications WEB et ...
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 
Solution d'OTA
Solution d'OTASolution d'OTA
Solution d'OTA
 
Java dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasJava dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de Jonas
 
Comment créer une application Angular performante ?
Comment créer une application Angular performante ?Comment créer une application Angular performante ?
Comment créer une application Angular performante ?
 
Introduction à web assembly
Introduction à web assemblyIntroduction à web assembly
Introduction à web assembly
 

Plus de CocoaHeads France

Plus de CocoaHeads France (20)

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
 
Super combinators
Super combinatorsSuper combinators
Super combinators
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
 
Handle the error
Handle the errorHandle the error
Handle the error
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
 

Blablacar - Going native - Erwan Robin