2 janvier 2025

Storma 2.0 sera open source

J’ai commencé le développement de la version 2.0 de Storma. Ma liste de tâches est bien remplie. Voici quelques-unes des fonctionnalités que j'espère livrer :

  • Une meilleure expérience sur iPad.
  • Une version Mac et Apple Watch.
  • Une optimisation des performances de la carte.
  • Pouvoir revenir dans le temps pour observer la trajectoire des orages.
  • Définir un rayon personnalisé pour les alertes.

Proposer une version Mac passe par une amélioration de l’expérience sur iPad que je trouve plutôt médiocre actuellement. J’utilisais 2 composants standards NavigationSplitView et .inspector() mais qui ne fonctionnait pas bien avec une interface centrée sur la carte. J’ai donc décidé de créer mon propre composant NavigationCard. Il reprend la même logique que NavigationStack, mais se présente sous la forme de cartes sur iPad et en sheet sur iPhone.

NavigationSplitView iPad La version iPad actuelle utilisant NavigationSplitView et .inspector().

NavigationCard iPad La version iPad de Storma 2.0 utilisant NavigationCard avec une navigation plus cohérente.

NavigationCard iPhone La version iPhone de Storma 2.0 utilisant NavigationCard avec une navigation en sheet sans code supplémentaire requis.

struct ContentView: View {
    @State private var path: CardPath = .init()
 
    var body: some View {
        NavigationCard(path: $path) {
            strikeMap
        } card: {
            alertList
                .cardTitle("Alerts")
                .cardToolbar {
                    CardDismissButton()
                }
                .cardDestination(for: Alert.self) { alert in
                    AlertDetailView(alert: alert)
                }
        }
    }
}

Le challenge Apple Watch

L’app iOS est parfois en difficulté sur les endroits avec beaucoup d’orages. L’Apple Watch n’ayant pas les mêmes capacités qu’un iPhone, il a fallu réécrire entièrement la carte pour qu’elle soit la plus performante possible.

Storma sur Apple Watch Storma 2.0 sur Apple Watch avec des performances améliorées.

Pour ça, j’utilise un algorithme de quadtree. Même si il existe plusieurs implémentations open source en Swift, j’ai décidé d’écrire le mien pour qu’il soit générique et qu’il fonctionne parfaitement avec Swift 6.

// Define a quadtree that stores `Strike` and use `MKCoordinateRegion` as boundary.
// `Strike` conforms to `QuadtreeElement`.
// `MKCoordinateRegion` conforms to `QuadtreeRect`.
let quadTree: QuadTree<Strike, MKCoordinateRegion> = .init(
    boundary: .world,
    capacity: 10
)
 
quadtree.insert(strike) // Insert a strike in the quadtree
let strikes = quadtree.query(region) // Query all strikes in a given region

Open source

La plus grosse nouveauté, c’est que je vais rendre ces composants open source. Sticker, NavigationCard et Quadtree sont le coeur de Storma et ils seront disponibles librement sur mon GitHub prochainement.

Depuis longtemps, je me pose la question d’open sourcer une app. Mais j’ai toujours eu peur de me faire voler le code. Avec Storma, c’est différent. L’app est gratuite et repose sur des données open source sous licence qui interdisent la commercialisation lors de leur utilisation.

L’avenir me le dira, mais je suis convaincu que les avantages surpassent les inconvénients.

  • Je facilite les contributions d’autres devs qui peuvent enrichir ces projets avec leurs idées et leurs compétences.
  • Ça permet à mes clients de découvrir ma manière de coder et l’organisation derrière mes projets.
  • Ça force à moduler encore plus son code.

Sticker est déjà disponible (je vous en avais parlé dans un précédent article). NavigationCard et Quadtree seront disponibles prochainement. Restez au courant en me suivant sur Bluesky et Mastodon ou en vous abonnant au flux RSS !