Introduction
Après avoir travaillé sur la menu bar, le floating panel et le nettoyage des dossiers générés dans les projets, j’ai ajouté une nouvelle amélioration à DevCacheCleaner : permettre à l’application de se lancer automatiquement au démarrage du Mac grâce à SMAppService SwiftUI.
Pour un outil comme DevCacheCleaner, ce comportement a du sens. L’application est pensée comme un utilitaire discret, disponible depuis la barre de menus macOS, que l’on peut ouvrir rapidement lorsqu’on veut nettoyer les caches développeur ou libérer de l’espace. Dans ce contexte, demander à l’utilisateur de relancer manuellement l’application après chaque redémarrage n’est pas idéal.
L’objectif était donc simple : ajouter une option claire dans l’interface pour activer ou désactiver le lancement au démarrage, sans script externe, sans manipulation manuelle et sans solution détournée. Pour cela, j’ai utilisé SMAppService l’API proposée par Apple pour gérer ce type d’intégration sur macOS.
Pourquoi utiliser SMAppService sur macOS ?
Historiquement, gérer le lancement au démarrage d’une application macOS pouvait devenir assez pénible. Selon les cas, il fallait passer par un helper, manipuler des éléments de connexion ou mettre en place une logique plus lourde que nécessaire.
Avec SMAppService, Apple propose une approche plus propre pour enregistrer une application comme élément de connexion. Dans le cas de DevCacheCleaner, je n’avais pas besoin d’un agent complexe. Je voulais simplement que l’application principale soit disponible dans la barre de menus après l’ouverture de session.
C’est précisément ce que permet SMAppService.mainApp. L’application peut s’enregistrer comme élément d’ouverture, puis macOS se charge de la lancer automatiquement lors des prochaines connexions de l’utilisateur.
Cette approche est intéressante parce qu’elle respecte le fonctionnement attendu de macOS. L’utilisateur garde le contrôle, l’application apparaît dans les réglages du système, et le comportement reste compréhensible.
Ajouter une option “Lancer au démarrage” dans SwiftUI
La première étape consiste à proposer un réglage explicite dans l’application. C’est important, car une application ne doit pas décider seule de se lancer automatiquement. Le comportement doit être visible, activable et désactivable par l’utilisateur.
Cette option peut prendre la forme d’un simple Toggle dans l’écran de préférences.
import SwiftUI
import ServiceManagement
struct SettingsView: View {
@State private var launchAtLogin = false
var body: some View {
Form {
Toggle("Lancer DevCacheCleaner au démarrage", isOn: $launchAtLogin)
.onChange(of: launchAtLogin) { _, newValue in
updateLaunchAtLogin(enabled: newValue)
}
}
.onAppear {
launchAtLogin = SMAppService.mainApp.status == .enabled
}
}
private func updateLaunchAtLogin(enabled: Bool) {
do {
if enabled {
try SMAppService.mainApp.register()
} else {
try SMAppService.mainApp.unregister()
}
} catch {
print("Erreur lors de la mise à jour du lancement au démarrage: \(error)")
}
}
}Le principe est assez lisible. Lorsque l’utilisateur active l’option, l’application appelle register(). Lorsqu’il la désactive, elle appelle unregister(). La logique reste donc simple côté SwiftUI, tout en s’intégrant proprement avec macOS.
Juste après l’activation, macOS affiche aussi une notification native indiquant qu’un nouvel élément de connexion a été ajouté. Dans mon cas, le système affiche un message précisant que DevCacheCleaner s’ouvrira automatiquement à la connexion et que ce comportement peut être géré dans “Login Items & Extensions”.

Cette notification est un détail important dans l’expérience utilisateur. Elle rend l’action transparente. Même si l’activation vient bien d’un réglage dans DevCacheCleaner, macOS confirme que l’application vient d’être ajoutée aux éléments d’ouverture. Pour un utilitaire de menu bar, c’est rassurant : le lancement automatique n’est pas caché, il est signalé clairement par le système.
Ne pas stocker uniquement l’état en local
Un point important est de ne pas se contenter d’une valeur sauvegardée dans UserDefaults. L’utilisateur peut aussi modifier les éléments d’ouverture directement depuis les Réglages Système de macOS.
Une fois l’application enregistrée avec SMAppService.mainApp.register(), DevCacheCleaner apparaît dans : Réglages Système > Général > Ouverture et extensions
L’application est alors visible dans la liste des éléments qui s’ouvrent automatiquement avec la session. L’utilisateur peut donc vérifier que DevCacheCleaner est bien enregistré, mais aussi le désactiver directement depuis macOS sans repasser par l’application.

C’est pour cette raison que je préfère relire l’état réel depuis le système :
SMAppService.mainApp.status == .enabledCela permet d’afficher une interface cohérente avec la configuration réelle du Mac. Si l’utilisateur retire DevCacheCleaner des éléments d’ouverture depuis macOS, l’application peut refléter ce changement au prochain affichage des réglages.
C’est un détail, mais c’est exactement le type de détail qui rend une application macOS plus propre et plus professionnelle. L’interface ne montre pas seulement ce que l’application pense avoir enregistré. Elle montre ce que macOS considère réellement comme actif.
Une fonctionnalité simple, mais utile pour l’expérience utilisateur
Sur le papier, le lancement au démarrage peut sembler secondaire. Pourtant, pour une application de menu bar, c’est presque une fonctionnalité naturelle.
DevCacheCleaner n’est pas une application que l’on ouvre pour y passer du temps. C’est un outil que l’on veut avoir sous la main au bon moment. Le fait de le retrouver automatiquement dans la barre de menus après le démarrage rend l’expérience plus fluide.
C’est aussi cohérent avec l’évolution de la série d’articles autour de DevCacheCleaner. Le projet a commencé par une idée simple : nettoyer les caches développeur sur macOS. Ensuite, il a fallu construire une interface adaptée avec SwiftUI, ajouter une menu bar utile, ouvrir une fenêtre avancée avec un floating panel, puis enrichir le nettoyage avec les dossiers générés dans les projets.
Avec SMAppService, on ajoute une brique supplémentaire : l’intégration naturelle au quotidien de l’utilisateur macOS.
Ce que j’en retiens
La mise en place de SMAppService dans DevCacheCleaner m’a rappelé qu’une bonne application macOS ne se limite pas à ses fonctionnalités principales. Elle doit aussi respecter les habitudes de la plateforme.
Un utilitaire de menu bar doit être discret, rapide à ouvrir et présent quand on en a besoin. Le lancement au démarrage va dans ce sens, à condition de rester une option claire, activable et désactivable par l’utilisateur.
Techniquement, l’intégration reste assez simple avec SwiftUI. Il faut importer ServiceManagement, utiliser SMAppService.mainApp, appeler register() ou unregister(), puis synchroniser l’interface avec le statut réel du système.
Cette dernière partie est importante, car macOS reste la source de vérité. Si l’utilisateur modifie l’état de DevCacheCleaner dans les Réglages Système, l’application doit pouvoir s’adapter à cette configuration.
C’est une petite amélioration, mais elle rend DevCacheCleaner plus agréable à utiliser au quotidien.
Conclusion
Ajouter le lancement au démarrage avec SMAppService est une étape logique pour une application macOS développée avec SwiftUI, surtout lorsqu’il s’agit d’un utilitaire de menu bar comme DevCacheCleaner.
Cette fonctionnalité améliore l’expérience utilisateur sans complexifier l’application. Elle montre aussi l’importance de penser un outil dans son usage réel : pas seulement ce qu’il fait, mais la manière dont il s’intègre dans le quotidien du développeur.
C’est exactement l’approche que je cherche à garder avec DevCacheCleaner : construire progressivement un outil simple, utile et bien intégré à macOS. Si vous développez une application macOS avec SwiftUI et que vous voulez améliorer son intégration au système, SMAppService est une solution propre à envisager pour gérer le lancement au démarrage.
Article similaire
- Créer un outil macOS pour nettoyer les caches développeur : retour d’expérience
- Comment créer une menu bar utile sur macOS avec SwiftUI
- DevCacheCleaner 0.2.2-alpha : nettoyer aussi les dossiers générés de vos projets
- Floating Panel sur macOS avec SwiftUI : ouvrir une fenêtre avancée depuis la menu bar



