SlideShare a Scribd company logo
1 of 19
Download to read offline
Comment je ne rate plus mon train (ou presque)
Danielo Jean-Louis • Cocoaheads Paris - Juin 2016
Développeur front-end chez DigitasLBI France
Levallois-Perret
Non loin de la gare de Clichy-Levallois
J’oublie de consulter les horaires du train
Je cours pour essayer d’avoir mon train
Je le rate bien souvent car je ne suis pas parti au bon moment
A chaque fois que je pars du travail
Applications qui auraient pu m’aider
Citymapper SNCF Transilien
Une app pour ça (prototype)
Côté fonctionnel
3 minutes d’attente max en gare
Notification pour indiquer le départ
Côté technique
Swift 2.2
Xib
API SNCF
Réponse JSON - Uniquement en GET
Limite : 90 000 requêtes/mois - Dont 3 000 requêtes/jour
Autorisation : Remplissage d’un formulaire
Impossibilité de filtrer par ligne
API SNCF - Points importants
let apiLink:String = “https://api.sncf.com/v1/coverage/sncf/places?q=/(NOM_
DE_GARE)”
Github de la SNCF : https://github.com/SNCFdevelopers/API-trains-sncf/blob/
master/source/integration.rst
Réponse XML - Uniquement en GET
Limite : 20 requêtes/minute
Autorisation : Demande par mail
API SNCF - Horaires temps réel
Exemple données API SNCF Horaires temps réel
<?xml version=”1.0” encoding=”UTF-8”?>
	 <passages gare=”87276386”>
		<train>
			<date mode=”R”>01/06/2016 10:06</date>
			<num>125746</num>
			<miss>AOMA</miss>
			<term>87271031</term>
		</train>
		...
	</passages>
let apiLink:String = “http://api.transilien.com/gare/(departureStationId)/
depart/(arrivalStationId)”
Mode / Horaire
ID gare de départ
Numéro du train
ID du terminus
Prototype réussi
- Je sais quand je dois partir... et je
ne rate plus mon train...
...Mais je ne peux pas gérer
plusieurs gares et tout est en dur
dans le code
Nouveau design
Direction du train (Gare de départ -> Gare d’arrivée)
Durée du trajet Recherche horaires
Nouvelle version
Côté fonctionnel
3 minutes d’attente max en gare
Notification pour indiquer le départ
Ajout de trajet
Possibilité de reporter son départ
Changer le temps de parcours
Côté technique
Swift 2.2
Xib
API SNCF
Alamofire
MapKit
Autolayout (SnapKit)
CoreData (MagicalRecord)
UIAutomation
UIMutableUserNotificationAction
Fonctionnement
Demande d’horaires pour une gare donnée
Récupération de la position de l’utilisateur
Calcul du temps de(s) trajet(s) (Utilisateur -> Gare)
Affichage du premier train eligible / Création d’une notification
Nouvelle version
Côté fonctionnel
3 minutes d’attente max en gare
Notification pour indiquer le départ
Ajout de trajet
Possibilité de reporter son départ
Changer le temps de parcours
Côté technique
Swift 2.2
Xib
API SNCF
Alamofire
MapKit
Autolayout (SnapKit)
CoreData (MagicalRecord)
UIAutomation
UIMutableUserNotificationAction
UIMutableUserNotificationAction
API iOS 8
Permet d’interagir avec une notification via des actions définies
Via des boutons
Possibilité d’afficher un champ de texte (iOS 9+)
UIMutableUserNotificationAction
let myMUNA = UIMutableUserNotificationAction();
myMUNA.identifier = POSTPONE_SCHEDULE;
myMUNA.title = "Prendre le prochain";
myMUNA.destructive = false;
myMUNA.authenticationRequired = false;
myMUNA.activationMode = UIUserNotificationActivationMode.Background;
...
let myMNC = UIMutableUserNotificationCategory();
myMNC.identifier = NotificationID.MY_IDENTIFIER;
myMNC.setActions([myMUNA, myMUNA2, myMUNA3, myMUNA4], forContext:
												 UIUserNotificationActionContext.Default);
myMNC.setActions([myMUNA, myMUNA4], forContext:
												 UIUserNotificationActionContext.Minimal);
let notification = UILocalNotification();
...
notification.identifier = NotificationID.MY_IDENTIFIER;
.Minimal .Default
UIMutableUserNotificationAction
application:handleActionWithIdentifier:forLocalNotification:completionHandler:
application:handleActionWithIdentifier:forRemoteNotification:completionHandler:
if (identifier == “IDENTIFIER_1”) {
NSNotificationCenter.defaultCenter()
								 .postNotificationName(
										"NOTIFICATION_NAME",
										object: nil,
										 userInfo: notification.userInfo);
} else if (identifier == “IDENTIFIER_2”) {...}
Merci
Questions ?
https://github.com/DanYellow/SNCF_API

More Related Content

Viewers also liked

Viewers also liked (20)

Alamofire
AlamofireAlamofire
Alamofire
 
Chainable datasource
Chainable datasourceChainable datasource
Chainable datasource
 
Un retour d'expérience sur Apple Pay
Un retour d'expérience sur Apple PayUn retour d'expérience sur Apple Pay
Un retour d'expérience sur Apple Pay
 
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
 
Rebranding an ios application
Rebranding an ios applicationRebranding an ios application
Rebranding an ios application
 
Introduction to WebRTC on iOS
Introduction to WebRTC on iOSIntroduction to WebRTC on iOS
Introduction to WebRTC on iOS
 
Fastlane snapshot presentation
Fastlane snapshot presentationFastlane snapshot presentation
Fastlane snapshot presentation
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
 
BitTorrent on iOS
BitTorrent on iOSBitTorrent on iOS
BitTorrent on iOS
 
CloudKit as a backend
CloudKit as a backendCloudKit as a backend
CloudKit as a backend
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
What's new in iOS9
What's new in iOS9What's new in iOS9
What's new in iOS9
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
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
 
La sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de BockLa sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de Bock
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
 

Similar to Comment je ne rate plus mon train

Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...
Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...
Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...ATECITSFRANCE
 
Delémont GIS Prototype
Delémont GIS PrototypeDelémont GIS Prototype
Delémont GIS PrototypeSimone Campora
 
Navigare - Cartographier les gares SNCF
Navigare - Cartographier les gares SNCFNavigare - Cartographier les gares SNCF
Navigare - Cartographier les gares SNCFOW2 Consortium
 
Fiche symuvia v5
Fiche symuvia v5Fiche symuvia v5
Fiche symuvia v5FabMob
 
Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020
Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020
Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020Open Transport meetup by Kisio
 
Projet de cartographie du transport public de Bamako " Sotrama"
Projet de cartographie du transport public de Bamako " Sotrama"Projet de cartographie du transport public de Bamako " Sotrama"
Projet de cartographie du transport public de Bamako " Sotrama"bamaemmanuel
 
#AssistantsVocaux : REX de RadioFrance & SNCF
#AssistantsVocaux : REX de RadioFrance & SNCF#AssistantsVocaux : REX de RadioFrance & SNCF
#AssistantsVocaux : REX de RadioFrance & SNCFThiga
 
Comment construire une interface vocale en 6 étapes ?
Comment construire une interface vocale en 6 étapes ?Comment construire une interface vocale en 6 étapes ?
Comment construire une interface vocale en 6 étapes ?Cécilia Ossoro
 
Danny NGUYEN-LUONG, Expert Transport – IAU île-de-France
Danny NGUYEN-LUONG, Expert Transport – IAU île-de-FranceDanny NGUYEN-LUONG, Expert Transport – IAU île-de-France
Danny NGUYEN-LUONG, Expert Transport – IAU île-de-FranceATECITSFRANCE
 
151214_Note_communication_Périph_Nantes_PTVGroup.pdf
151214_Note_communication_Périph_Nantes_PTVGroup.pdf151214_Note_communication_Périph_Nantes_PTVGroup.pdf
151214_Note_communication_Périph_Nantes_PTVGroup.pdfBakiss
 
Atelier Hackcess SNCF Transilien
Atelier Hackcess SNCF TransilienAtelier Hackcess SNCF Transilien
Atelier Hackcess SNCF TransilienSNCFopendata
 
Open Data : Trouver son chemin dans les données de transport en commun
Open Data : Trouver son chemin dans les données de transport en communOpen Data : Trouver son chemin dans les données de transport en commun
Open Data : Trouver son chemin dans les données de transport en communNicolas KEMPF
 
Présentation du projet So Mobility
Présentation du projet So MobilityPrésentation du projet So Mobility
Présentation du projet So MobilitySo Mobility
 

Similar to Comment je ne rate plus mon train (20)

Mapotempo
MapotempoMapotempo
Mapotempo
 
Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...
Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...
Jean-Marc ROUFFET, Chef du service Systèmes Équipement - Patrimoine de transp...
 
Delémont GIS Prototype
Delémont GIS PrototypeDelémont GIS Prototype
Delémont GIS Prototype
 
Prez nos transportspaca_140618
Prez nos transportspaca_140618Prez nos transportspaca_140618
Prez nos transportspaca_140618
 
Présentation stage 2ème année
Présentation stage 2ème annéePrésentation stage 2ème année
Présentation stage 2ème année
 
Stage 2ème année SNCF
Stage 2ème année SNCFStage 2ème année SNCF
Stage 2ème année SNCF
 
Navigare - Cartographier les gares SNCF
Navigare - Cartographier les gares SNCFNavigare - Cartographier les gares SNCF
Navigare - Cartographier les gares SNCF
 
New one
New oneNew one
New one
 
New new one
New new oneNew new one
New new one
 
Fiche symuvia v5
Fiche symuvia v5Fiche symuvia v5
Fiche symuvia v5
 
Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020
Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020
Prez irt system-x_ti_iva_meetup_opentransport_05.11.2020
 
Projet de cartographie du transport public de Bamako " Sotrama"
Projet de cartographie du transport public de Bamako " Sotrama"Projet de cartographie du transport public de Bamako " Sotrama"
Projet de cartographie du transport public de Bamako " Sotrama"
 
#AssistantsVocaux : REX de RadioFrance & SNCF
#AssistantsVocaux : REX de RadioFrance & SNCF#AssistantsVocaux : REX de RadioFrance & SNCF
#AssistantsVocaux : REX de RadioFrance & SNCF
 
Comment construire une interface vocale en 6 étapes ?
Comment construire une interface vocale en 6 étapes ?Comment construire une interface vocale en 6 étapes ?
Comment construire une interface vocale en 6 étapes ?
 
Danny NGUYEN-LUONG, Expert Transport – IAU île-de-France
Danny NGUYEN-LUONG, Expert Transport – IAU île-de-FranceDanny NGUYEN-LUONG, Expert Transport – IAU île-de-France
Danny NGUYEN-LUONG, Expert Transport – IAU île-de-France
 
151214_Note_communication_Périph_Nantes_PTVGroup.pdf
151214_Note_communication_Périph_Nantes_PTVGroup.pdf151214_Note_communication_Périph_Nantes_PTVGroup.pdf
151214_Note_communication_Périph_Nantes_PTVGroup.pdf
 
Atelier Hackcess SNCF Transilien
Atelier Hackcess SNCF TransilienAtelier Hackcess SNCF Transilien
Atelier Hackcess SNCF Transilien
 
Open Data : Trouver son chemin dans les données de transport en commun
Open Data : Trouver son chemin dans les données de transport en communOpen Data : Trouver son chemin dans les données de transport en commun
Open Data : Trouver son chemin dans les données de transport en commun
 
Protocole rip
Protocole ripProtocole rip
Protocole rip
 
Présentation du projet So Mobility
Présentation du projet So MobilityPrésentation du projet So Mobility
Présentation du projet So Mobility
 

More from CocoaHeads France

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer FutureCocoaHeads France
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11CocoaHeads France
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeadsCocoaHeads France
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notificationsCocoaHeads France
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECocoaHeads France
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec BitriseCocoaHeads France
 

More from CocoaHeads France (11)

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
 
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
 

Comment je ne rate plus mon train

  • 1. Comment je ne rate plus mon train (ou presque) Danielo Jean-Louis • Cocoaheads Paris - Juin 2016
  • 2. Développeur front-end chez DigitasLBI France Levallois-Perret Non loin de la gare de Clichy-Levallois
  • 3. J’oublie de consulter les horaires du train Je cours pour essayer d’avoir mon train Je le rate bien souvent car je ne suis pas parti au bon moment A chaque fois que je pars du travail
  • 4. Applications qui auraient pu m’aider Citymapper SNCF Transilien
  • 5. Une app pour ça (prototype) Côté fonctionnel 3 minutes d’attente max en gare Notification pour indiquer le départ Côté technique Swift 2.2 Xib API SNCF
  • 6. Réponse JSON - Uniquement en GET Limite : 90 000 requêtes/mois - Dont 3 000 requêtes/jour Autorisation : Remplissage d’un formulaire Impossibilité de filtrer par ligne API SNCF - Points importants let apiLink:String = “https://api.sncf.com/v1/coverage/sncf/places?q=/(NOM_ DE_GARE)” Github de la SNCF : https://github.com/SNCFdevelopers/API-trains-sncf/blob/ master/source/integration.rst
  • 7. Réponse XML - Uniquement en GET Limite : 20 requêtes/minute Autorisation : Demande par mail API SNCF - Horaires temps réel
  • 8. Exemple données API SNCF Horaires temps réel <?xml version=”1.0” encoding=”UTF-8”?> <passages gare=”87276386”> <train> <date mode=”R”>01/06/2016 10:06</date> <num>125746</num> <miss>AOMA</miss> <term>87271031</term> </train> ... </passages> let apiLink:String = “http://api.transilien.com/gare/(departureStationId)/ depart/(arrivalStationId)” Mode / Horaire ID gare de départ Numéro du train ID du terminus
  • 9. Prototype réussi - Je sais quand je dois partir... et je ne rate plus mon train... ...Mais je ne peux pas gérer plusieurs gares et tout est en dur dans le code
  • 11. Direction du train (Gare de départ -> Gare d’arrivée) Durée du trajet Recherche horaires
  • 12. Nouvelle version Côté fonctionnel 3 minutes d’attente max en gare Notification pour indiquer le départ Ajout de trajet Possibilité de reporter son départ Changer le temps de parcours Côté technique Swift 2.2 Xib API SNCF Alamofire MapKit Autolayout (SnapKit) CoreData (MagicalRecord) UIAutomation UIMutableUserNotificationAction
  • 13. Fonctionnement Demande d’horaires pour une gare donnée Récupération de la position de l’utilisateur Calcul du temps de(s) trajet(s) (Utilisateur -> Gare) Affichage du premier train eligible / Création d’une notification
  • 14. Nouvelle version Côté fonctionnel 3 minutes d’attente max en gare Notification pour indiquer le départ Ajout de trajet Possibilité de reporter son départ Changer le temps de parcours Côté technique Swift 2.2 Xib API SNCF Alamofire MapKit Autolayout (SnapKit) CoreData (MagicalRecord) UIAutomation UIMutableUserNotificationAction
  • 15. UIMutableUserNotificationAction API iOS 8 Permet d’interagir avec une notification via des actions définies Via des boutons Possibilité d’afficher un champ de texte (iOS 9+)
  • 16. UIMutableUserNotificationAction let myMUNA = UIMutableUserNotificationAction(); myMUNA.identifier = POSTPONE_SCHEDULE; myMUNA.title = "Prendre le prochain"; myMUNA.destructive = false; myMUNA.authenticationRequired = false; myMUNA.activationMode = UIUserNotificationActivationMode.Background; ... let myMNC = UIMutableUserNotificationCategory(); myMNC.identifier = NotificationID.MY_IDENTIFIER; myMNC.setActions([myMUNA, myMUNA2, myMUNA3, myMUNA4], forContext: UIUserNotificationActionContext.Default); myMNC.setActions([myMUNA, myMUNA4], forContext: UIUserNotificationActionContext.Minimal); let notification = UILocalNotification(); ... notification.identifier = NotificationID.MY_IDENTIFIER;
  • 18. UIMutableUserNotificationAction application:handleActionWithIdentifier:forLocalNotification:completionHandler: application:handleActionWithIdentifier:forRemoteNotification:completionHandler: if (identifier == “IDENTIFIER_1”) { NSNotificationCenter.defaultCenter() .postNotificationName( "NOTIFICATION_NAME", object: nil, userInfo: notification.userInfo); } else if (identifier == “IDENTIFIER_2”) {...}