watchOS : les bases du développement Apple Watch avec SwiftUI

Auteur : IT Sectr Publié le : 2026-02-07 Temps de lecture : 12 min

watchOS est le système d'exploitation d'Apple pour l'Apple Watch, lancé pour la première fois en 2015 avec les premières montres. Le développement d'applications watchOS se fait en Swift avec SwiftUI et WatchKit. Caractéristiques : écran rectangulaire petit, consommation limitée de la batterie de 0,3 Wh et intégration étroite avec l'iPhone via Bluetooth. Selon Counterpoint Research, l'Apple Watch détient plus de 30 % du marché mondial des montres connectées.

Points clés

  • watchOS — OS pour Apple Watch basé sur le noyau XNU axé sur une faible consommation d'énergie
  • SwiftUI — le framework principal pour développer les interfaces des applications watchOS
  • Watch Connectivity — mécanisme d'échange de données entre Apple Watch et iPhone
  • Smart Stack — pile intelligente de widgets introduite dans watchOS 10
  • HealthKit — framework d'accès aux capteurs : pouls, SpO2, température, accéléromètre

Qu'est-ce que watchOS ?

watchOS est le système d'exploitation des montres connectées Apple, basé sur le noyau XNU de Darwin. Lancé pour la première fois le 24 avril 2015 avec l'Apple Watch Series 0. Le système est construit sur la même architecture qu'iOS, mais optimisé pour un petit écran (de 1,5 à 1,9 pouce), une mémoire limitée (jusqu'à 1 Go de RAM sur Series 9) et une consommation d'énergie minimale.

Selon StatCounter (2026), watchOS détient environ 55 % du marché des systèmes d'exploitation pour montres connectées, devançant Wear OS et les systèmes propriétaires des fabricants chinois. Apple publie des mises à jour majeures de watchOS chaque année, prenant en charge les montres jusqu'à 5 ans après leur lancement.

Une caractéristique clé de watchOS est sa dépendance à l'iPhone. La plupart des applications utilisent Watch Connectivity pour la synchronisation des données. À partir de watchOS 6, les montres peuvent installer des applications directement depuis l'App Store, mais l'indépendance totale vis-à-vis de l'iPhone n'est prise en charge qu'avec watchOS 9.

Historique des versions de watchOS

La première version Watch OS 1.0 ne prenait pas en charge les applications tierces — seulement les applications Apple préinstallées. watchOS 2 (2015) a ouvert le SDK aux développeurs. watchOS 3 (2016) a accéléré le lancement des applications de 7 fois. watchOS 6 (2019) a introduit l'App Store sur la montre. watchOS 9 (2022) a ajouté les médicaments et un suivi du sommeil amélioré. watchOS 10 (2023) est devenu la plus grande mise à jour de l'interface depuis son lancement.

Version watchOSAnnéeInnovation clé
Watch OS 12015Première version, applications Apple natives uniquement
watchOS 22015SDK ouvert, applications tierces, Watch Connectivity
watchOS 32016Lancement instantané des applications, Dock, Scribble
watchOS 62019App Store sur la montre, Cycle Tracking, application Noise
watchOS 92022Médicaments, phases de sommeil, compagnon de course amélioré
watchOS 102023Smart Stack, Double Tap, nouveaux cadrans

Architecture de watchOS

L'architecture de watchOS se compose de trois couches, isolant le matériel des applications utilisateur. Contrairement à iOS, watchOS utilise une approche basée sur les composants : une application se compose de deux cibles — une extension et un hôte sur l'iPhone.

Noyau et services système

La couche inférieure est un noyau XNU modifié avec des pilotes pour les puces S4/S5/S6/S7/S8/S9 d'Apple. L'Apple Watch Series 9 utilise le S9 SiP avec 5,6 milliards de transistors et un Neural Engine à 4 cœurs. Les services système incluent Core Bluetooth, Watch Connectivity, HealthKit et Core Motion. Toutes les tâches en arrière-plan sont gérées par BGTaskScheduler — un planificateur système qui optimise la consommation d'énergie.

WatchKit — couche applicative

WatchKit est un framework pour créer des interfaces d'applications watchOS. Il comprend WKInterfaceController, WKInterfaceGroup, WKInterfaceLabel et WKInterfaceButton. Depuis watchOS 6, Apple recommande SwiftUI plutôt que WatchKit. SwiftUI offre les mêmes capacités mais avec une syntaxe déclarative et une adaptation automatique à la taille de l'écran : 38 mm (272×340), 42 mm (312×390), 40 mm (324×394), 44 mm (368×448), 45 mm (396×484), 49 mm (410×502 sur Apple Watch Ultra).

Modes d'arrière-plan et consommation d'énergie

watchOS limite l'activité en arrière-plan des applications pour économiser la batterie. Modes d'arrière-plan disponibles : Workout (entraînements), HealthKit (surveillance de la santé), Location (géolocalisation), Audio (lecteur audio) et Complication (données sur le cadran). Chaque mode nécessite une capability distincte dans les entitlements. Consommation d'énergie typique : application active — 50-80 mA, mode arrière-plan — 5-15 mA, veille — 1-3 mA.

swift
import BackgroundTasks
import WatchKit

/// Planification des mises à jour de données en arrière-plan sur watchOS
class BackgroundTaskManager: NSObject {

    func scheduleBackgroundRefresh() {
        let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
        request.earliestBeginDate = Date(timeIntervalSinceNow: 30 * 60)

        try? BGTaskScheduler.shared.submit(request)
    }

    func handleAppRefresh(task: BGAppRefreshTask) {
        task.expirationHandler = { task.setTaskCompleted(success: false) }

        DataService.shared.fetchData { result in
            switch result {
            case .success:
                ComplicationController.reloadComplications()
                task.setTaskCompleted(success: true)
            case .failure:
                task.setTaskCompleted(success: false)
            }
        }
    }
}

/// Enregistrement d'une tâche d'arrière-plan dans WKExtensionDelegate
class ExtensionDelegate: NSObject, WKExtensionDelegate {
    let manager = BackgroundTaskManager()

    func handle(_ backgroundTasks: Set<WKBackgroundTask>) {
        for task in backgroundTasks {
            switch task {
            case let refreshTask as BGAppRefreshTask:
                manager.handleAppRefresh(task: refreshTask)
            default:
                task.setTaskCompleted(success: false)
            }
        }
    }
}

BGTaskScheduler garantit que les tâches en arrière-plan s'exécutent à des moments optimaux — lorsque la montre est en charge et connectée à l'iPhone. WKExtensionDelegate traite les tâches en arrière-plan entrantes et met à jour les données sur le cadran. ComplicationController.reloadComplications met à jour les widgets sur le cadran sélectionné.

watchOS 10 : Smart Stack et Double Tap

watchOS 10 — la plus grande mise à jour de l'interface de l'histoire de la plateforme, publiée en septembre 2023. Le système est passé d'une navigation hiérarchique à une navigation orientée contenu : l'écran principal est devenu Smart Stack — une pile intelligente de widgets qui a remplacé le dock d'applications.

Smart Stack

Smart Stack est une liste verticale de widgets affichée sous le cadran de la montre. Les widgets sont classés par contexte : le matin affiche la météo et le calendrier, l'après-midi — l'activité et les rappels, le soir — la méditation et la préparation au sommeil. Le développeur peut ajouter des widgets personnalisés via WidgetKit pour watchOS, en utilisant les mêmes API que pour iOS 17.

Double Tap

Double Tap est un geste de rapprochement de l'index et du pouce, reconnu par l'accéléromètre et le gyroscope sans toucher l'écran. Sur l'Apple Watch Series 9 et Ultra 2, le geste est traité au niveau matériel via le Neural Engine. Le développeur reçoit l'événement via UIDoubleTapGestureRecognizer ou via le modificateur SwiftUI .onTapGesture(count: 2). Le geste ne nécessite pas de calibrage et fonctionne dans n'importe quelle orientation de la main.

Nouvelles API pour les développeurs

watchOS 10 a introduit : SwiftUI Animation avec prise en charge des animations Spring et Keyframe, MapKit pour afficher des cartes sur la montre, VideoPlayer pour lire des vidéos courtes (jusqu'à 30 secondes), VoiceOver amélioré avec des gestes et un nouveau paradigme de navigation NavigationStack à la place de NavigationView.

APIObjectifDisponible depuis
WidgetKit for watchOSWidgets pour Smart StackwatchOS 10
UIDoubleTapGestureGeste Double TapwatchOS 10 (S9+)
MapKitAffichage de cartes sur la montrewatchOS 10
NavigationStackNouveau paradigme de navigationwatchOS 10
SwiftUI KeyframeAnimation image par imagewatchOS 10

SwiftUI pour Apple Watch

SwiftUI est le framework principal pour développer les interfaces watchOS. Apple recommande SwiftUI pour tous les nouveaux projets à partir de watchOS 7. SwiftUI pour la montre utilise les mêmes principes que pour iOS, mais avec des modificateurs et des composants spécifiques à watchOS.

Composants SwiftUI spécifiques à watchOS

SwiftUI pour watchOS inclut : TabView avec style de page pour glisser entre les écrans, DigitalCrownRotation pour gérer la rotation de la couronne, SceneStorage pour conserver l'état entre les lancements, WKNotificationScene pour les notifications personnalisées et ComplicationDescriptor pour les données sur le cadran.

swift
import SwiftUI
import HealthKit

/// Application watchOS pour la surveillance du pouls
@main
struct HeartMonitorApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        WKNotificationScene(
            controller: NotificationController.self,
            category: "heartAlert"
        )
    }
}

struct ContentView: View {
    @State private var heartRate: Double = 0
    private let healthStore = HKHealthStore()

    var body: some View {
        TabView {
            HeartRateView(rate: heartRate)
                .tabItem { Label("Pouls", systemImage: "heart.fill") }

            StepsView()
                .tabItem { Label("Pas", systemImage: "figure.walk") }

            SettingsView()
                .tabItem { Label("Paramètres", systemImage: "gear") }
        }
        .tabViewStyle(.page)
        .onAppear(perform: setupHealthKit)
    }

    private func setupHealthKit() {
        guard HKHealthStore.isHealthDataAvailable() else { return }
        let heartType = HKQuantityType(.heartRate)

        healthStore.requestAuthorization(toShare: nil, read: [heartType]) { success, error in
            guard success else { return }
            startHeartRateQuery()
        }
    }

    private func startHeartRateQuery() {
        let heartType = HKQuantityType(.heartRate)
        let query = HKObserverQuery(sampleType: heartType, predicate: nil) { _, _, error in
            guard error == nil else { return }
            fetchLatestHeartRate()
        }
        healthStore.execute(query)
    }

    private func fetchLatestHeartRate() {
        let heartType = HKQuantityType(.heartRate)
        let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
        let query = HKSampleQuery(sampleType: heartType, predicate: nil,
                                    limit: 1, sortDescriptors: [sort]) { _, samples, _ in
            guard let sample = samples?.first as? HKQuantitySample else { return }
            let rate = sample.quantity.doubleValue(for: HKUnit(from: "count/min"))
            DispatchQueue.main.async { heartRate = rate }
        }
        healthStore.execute(query)
    }
}

struct HeartRateView: View {
    let rate: Double

    var body: some View {
        VStack(spacing: 12) {
            Image(systemName: "heart.fill")
                .foregroundStyle(.red)
                .font(.system(size: 48))
                .symbolEffect(.pulse)

            Text("\(Int(rate))")
                .font(.system(.title, design: .rounded))
                .contentTransition(.numericText())
                .bold()

            Text("bpm")
                .font(.caption)
                .foregroundStyle(.secondary)
        }
    }
}

L'application HeartMonitorApp illustre une structure typique d'application watchOS en SwiftUI : TabView avec style de page pour glisser entre les écrans, intégration avec HealthKit pour lire le pouls en temps réel, WKNotificationScene pour gérer les notifications. SymbolEffect avec animation pulse utilise l'accélération matérielle du Neural Engine pour une animation fluide sans consommation CPU.

Digital Crown et gestes

La Digital Crown est la molette sur le côté de l'Apple Watch. SwiftUI fournit DigitalCrownRotation pour lier une valeur à la rotation de la couronne. Le modificateur accepte un binding, une plage et un pas. Gestes : tap (toucher), longPress (appui long), swipe (glissement) et pan (glisser-déposer) — tous standard pour SwiftUI et adaptés à la taille de l'écran de la montre.

WatchKit et composants d'une application watchOS

WatchKit est le framework d'origine de watchOS utilisant une approche UIKit. Bien qu'Apple recommande SwiftUI, WatchKit reste pertinent pour les projets hérités et les tâches spécifiques : animations complexes sur WKInterfaceGroup et intégration SiriKit.

Structure d'une application watchOS

Une application watchOS se compose de deux cibles : WatchKit Extension (logique et interface) et iOS Companion App (paramètres et synchronisation). À partir de Xcode 15, il est possible de créer une application autonome sans compagnon iOS. L'interface est décrite dans Interface.storyboard (WatchKit) ou programmatiquement via SwiftUI.

ComposantWatchKitSwiftUI
ÉcranWKInterfaceControllerView
BoutonWKInterfaceButtonButton
TableauWKInterfaceTableList
GroupeWKInterfaceGroupVStack / HStack
ImageWKInterfaceImageImage / AsyncImage
ÉtiquetteWKInterfaceLabelText
CarteWKInterfaceMapMap (watchOS 10+)
ComplicationCLKComplicationDataSourceComplicationDescriptor

Complications — données sur le cadran

Une Complication est un widget qui affiche des données sur le cadran de l'Apple Watch. Le développeur implémente le protocole CLKComplicationDataSource, fournissant des modèles pour différents types de cadrans (circular, rectangular, modular, extraLarge). watchOS 10 prend en charge ComplicationDescriptor — une API simplifiée pour SwiftUI. Les données sont mises à jour via des tâches d'arrière-plan avec une période allant jusqu'à 30 minutes.

Intégration avec l'iPhone via Watch Connectivity

Watch Connectivity est un framework pour échanger des données entre l'Apple Watch et l'iPhone via Bluetooth ou Wi-Fi. C'est la seule méthode de communication entre les appareils appairés. WCSession est la classe centrale qui gère la session. L'application iOS et l'extension watchOS doivent implémenter WCSessionDelegate.

Méthodes de transfert de données

Watch Connectivity propose quatre méthodes de transfert de données : sendMessage — envoi immédiat avec accusé de réception (fonctionne uniquement lorsque les deux applications sont actives), transferUserInfo — livraison en arrière-plan d'un dictionnaire de données, transferFile — transfert de fichiers avec métadonnées, updateApplicationContext — synchronisation de l'état partagé. Toutes les méthodes garantissent la livraison lors du rétablissement de la connexion.

swift
import WatchConnectivity

/// Gestionnaire de synchronisation entre iPhone et Apple Watch
final class ConnectivityManager: NSObject, WCSessionDelegate {

    static let shared = ConnectivityManager()
    private let session = WCSession.default

    override private init() {
        super.init()
        session.delegate = self
        session.activate()
    }

    // MARK : — Envoi de données de l'iPhone à la montre
    func sendWorkoutData(_ data: [String: Any]) {
        guard session.isReachable else {
            // Si la montre est indisponible — sauvegarder dans le contexte
            try? session.updateApplicationContext(data)
            return
        }
        session.sendMessage(data, replyHandler: nil) { error in
            print("Erreur d'envoi : \(error.localizedDescription)")
        }
    }

    // MARK : — Réception de données sur la montre
    func session(_ session: WCSession,
                 didReceiveMessage message: [String: Any]) {
        DispatchQueue.main.async {
            NotificationCenter.default.post(
                name: NSNotification.Name("dataReceived"),
                object: message
            )
        }
    }

    func session(_ session: WCSession,
                 activationDidCompleteWith activationState: WCSessionActivationState,
                 error: Error?) {
        print("WCSession activée : \(activationState.rawValue)")
    }

    // Non requis sur watchOS mais obligatoire pour le protocole
    func sessionDidBecomeInactive(_ session: WCSession) {}
    func sessionDidDeactivate(_ session: WCSession) {
        session.activate()
    }
}

ConnectivityManager implémente un singleton pour travailler avec WCSession. sendWorkoutData vérifie isReachable : si la montre est active, les données sont envoyées immédiatement via sendMessage ; sinon, elles sont sauvegardées dans applicationContext pour une livraison différée. onReceiveMessage du côté récepteur traite les messages entrants et notifie l'application via NotificationCenter.

Échange de fichiers et synchronisation

transferFile permet de transférer de gros volumes de données : images, fichiers audio, archives. La taille maximale du fichier est de 100 Mo. Les fichiers sont sauvegardés dans le répertoire Inbox sur l'appareil récepteur. transferUserInfo est adapté aux données JSON jusqu'à 100 Ko. Toutes les méthodes fonctionnent en arrière-plan : si l'appareil est indisponible, le transfert est mis en file d'attente et reprend automatiquement lorsque la connexion est rétablie.

Publication d'applications watchOS

La publication d'une application watchOS suit les mêmes règles que iOS : un abonnement Apple Developer Program (99 $/an) et la modération App Review sont requis. L'application est téléchargée sur App Store Connect en tant que partie d'une application iOS ou en tant qu'application autonome.

Compilation et distribution

Une application watchOS peut être distribuée de deux manières : en tant qu'extension intégrée d'une application iOS (le bundle de l'application iOS contient le .app watchOS) ou en tant qu'application autonome (téléchargée et fonctionne sans iPhone). Pour le mode autonome, WKRunsIndependently = YES est requis dans Info.plist. La taille de l'application watchOS est limitée à 50 Mo pour les téléchargements par réseau cellulaire.

Exigences d'App Review

Exigences particulières pour watchOS : l'application doit fonctionner correctement sans iPhone actif (si déclarée comme autonome), l'interface doit être lisible sans zoom, tous les éléments interactifs doivent avoir au moins 44 points de taille. Les applications qui dupliquent des fonctionnalités intégrées (par exemple, un moniteur de pouls sans valeur ajoutée) sont interdites.

ExigenceDescription
Taille de l'applicationJusqu'à 50 Mo pour le téléchargement cellulaire, jusqu'à 4 Go via Wi-Fi
Mode autonomeWKRunsIndependently = YES dans Info.plist
Cibles tactilesMinimum 44 pt pour tous les éléments interactifs
SécuritéLes données HealthKit ne peuvent pas être envoyées au serveur sans consentement
PerformancesLancement de l'application pas plus de 5 secondes

Foire aux questions

Quels langages sont utilisés pour le développement watchOS ?

Le langage principal est Swift avec le framework SwiftUI. WatchKit sur UIKit est également pris en charge, mais Apple recommande SwiftUI pour tous les nouveaux projets watchOS. Objective-C n'est utilisé que dans les applications héritées publiées avant 2019. Depuis watchOS 7, tous les exemples Apple utilisent exclusivement SwiftUI.

Un iPhone est-il nécessaire pour qu'une application watchOS fonctionne ?

À partir de watchOS 6, l'Apple Watch peut installer des applications directement depuis l'App Store sans iPhone. Cependant, de nombreuses fonctionnalités — synchronisation des données, notifications push, géolocalisation — nécessitent l'appairage avec un iPhone. Les applications entièrement autonomes sont possibles avec watchOS 9 et WKRunsIndependently dans les paramètres de build.

Quelle est l'autonomie de l'Apple Watch avec une application active ?

L'autonomie typique de l'Apple Watch Series 9 est de 18 heures en mode mixte. Avec une utilisation active du GPS et du moniteur de pouls — 5 à 7 heures. watchOS 10 optimise la consommation d'énergie via Smart Stack et BGTaskScheduler, réduisant l'activité en arrière-plan des applications jusqu'à 4 fois par rapport à watchOS 9.

Comment transférer des données entre l'iPhone et l'Apple Watch ?

Le framework Watch Connectivity fournit quatre méthodes : sendMessage (transfert immédiat), transferUserInfo (arrière-plan), transferFile (fichiers jusqu'à 100 Mo) et updateApplicationContext (synchronisation d'état). Toutes les méthodes fonctionnent via Bluetooth ou Wi-Fi avec mise en file d'attente automatique en cas de perte de connexion.

Quels capteurs sont disponibles sur l'Apple Watch ?

L'Apple Watch Series 9 et Ultra 2 incluent : accéléromètre, gyroscope, moniteur de pouls optique et électrique, SpO2 (saturation), capteur de température du poignet, baromètre, boussole, GPS L1+L5 et microphone. L'accès aux capteurs se fait via HealthKit et Core Motion. Les données de pouls et SpO2 nécessitent une autorisation explicite de l'utilisateur.

Résumé

  • watchOS — système d'exploitation d'Apple pour montres connectées sur noyau XNU, axé sur l'efficacité énergétique et l'intégration avec l'iPhone
  • SwiftUI — le framework principal pour watchOS, offrant une mise en page déclarative et une adaptation automatique à la taille de l'écran
  • watchOS 10 a introduit Smart Stack, Double Tap (S9+), NavigationStack et WidgetKit pour les widgets
  • Watch Connectivity — le seul canal de communication avec l'iPhone via Bluetooth/Wi-Fi avec quatre modes de transfert
  • HealthKit donne accès aux capteurs de l'Apple Watch : pouls, SpO2, température, accéléromètre, GPS
  • Complications — widgets sur le cadran implémentés via CLKComplicationDataSource ou SwiftUI
  • Publication nécessite Apple Developer Program, taille jusqu'à 50 Mo (cellulaire) et un contrôle strict des performances

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi