Ma participation au
Swift Student Challenge 2025

English version coming later

Halobus

Halobus est une application hors ligne qui affiche l’ensemble du réseau de transports en commun de Nice, avec la position actuelle de tous les bus et tramways. Elle met en valeur l’étendue du réseau et invite les utilisateurs à explorer la ville sans voiture.

Un utilisateur est train d'écrire

Idée

J'ai eu l'idée de cette application en prenant connaissance des contraintes imposées pour ce défi. En effet, il faut une application :

  • Légère (25 MB)
  • Qui fonctionne hors-ligne
  • Qui puisse se tester en moins de 3 minutes.

J'ai voulu réinvestir mes connaissances acquises en développant Wagon, j'ai donc reflechi à une application sur la thématique des transports en commun, qui intégrerait ces contraintes.

Mais je ne voulais pas une application trop basique, il me fallait un côté "Waouh". C'est ainsi que m'est venue l'idée : une application 100% hors-ligne, ou l'on verrait les bus bouger sur une carte ; simple en apparence, mais plutôt technique à réaliser.

Icône de l'application représentant un tramway sur l'écran d'un radar vert

Défis techniques

Pour respecter les contraintes, j'ai fait face à quelques difficultés en réalisant mon app.

Carte hors-ligne

Bien qu'Apple Plan propose un mode hors-ligne depuis iOS 17, le SDK disponible dans Swift UI ne propose pas d'option analogue. J'ai recréé ma propre carte à partir des données OpenStreetMap et des options permises par MapKit.

  1. Initialisation d'une carte MapKit classique
  2. Affichage en mode Satellite pour retirer les labels
  3. Itération sur chaque type de zone OpenStreetMap pour créer les polygones correspondants sur la carte

Taille des données

C'est un choix crucial pour l'application : Comment stocker efficacement les données pour être capable d'afficher tous les bus du réseau à chaque instant, de manière précise et ce pour tous les jours de l'année ?

J'ai d'abord pensé à stocker, pour chaque moment dans la journée (disons toutes les 10 secondes) la position de tous les véhicules en service. Mais les données étaient beaucoup trop volumineuses. En stockant de cette manière, on avait trop de répétitions de données.

J'ai donc opté pour une approche plus proche du format de stockage dans le GTFS, en retirant le maximum d'informations inutiles à mon app. Je me retrouve donc avec 5 extraits JSON :

Une autre optimisation consiste en la rénumérotation des IDs du GTFS, qui sont étrangement extremement verbeux.

102031 au lieu de chouette:TimeTable:43c17fa7-3a55-4e11-95e1-7ac11d989e14:LOC

Tester le Playground

Télécharger le Playground

Requiert un Mac ou un iPad avec l'application Swift Playground d'installée.