tvOS : développement pour Apple TV avec Focus Engine

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

tvOS — le système d'exploitation d'Apple pour Apple TV, lancé pour la première fois en 2015 avec l'Apple TV de 4e génération. Le développement d'applications pour tvOS se fait en Swift avec SwiftUI et TVMLKit. La principale différence avec iOS est le contrôle du focus via la Siri Remote au lieu du toucher. Selon Apple, tvOS est installé sur plus de 100 millions d'appareils actifs dans le monde.

Points clés

  • tvOS — OS d'Apple pour boîtiers TV sur noyau XNU avec Focus Engine au lieu du touché
  • Focus Engine — système de gestion du focus entre les éléments via Siri Remote
  • SwiftUI et TVMLKit — deux approches de développement : native et modèles JavaScript
  • Top Shelf — contenu dynamique sur l'écran d'accueil d'Apple TV
  • Taille de l'application strictement limitée à 4 Go, recommandé pas plus de 500 Mo

Qu'est-ce que tvOS ?

tvOS — le système d'exploitation d'Apple pour les boîtiers Apple TV, basé sur le même noyau Darwin XNU qu'iOS. Lancé pour la première fois le 30 octobre 2015 avec l'Apple TV de 4e génération. tvOS a remplacé l'ancien Apple TV Software (basé sur iOS, sans App Store ni SDK). Le système est optimisé pour le fonctionnement sur téléviseur avec une résolution allant jusqu'à 4K HDR (Dolby Vision) et son Dolby Atmos.

Selon Apple (WWDC 2025), tvOS est installé sur Apple TV HD (2015), Apple TV 4K (2017, 2021, 2022) et intégré dans certains modèles de Smart TV via AirPlay. Apple TV utilise les puces A8 (HD), A10X Fusion (1re génération 4K), A12 Bionic (2e génération 4K) et A15 Bionic (3e génération 4K). Tous les modèles prennent en charge tvOS 17. tvOS n'a pas de caméra, de microphone (sauf la télécommande), d'écran tactile ni de GPS.

La caractéristique clé de tvOS est Focus Engine, qui remplace le contrôle tactile par la navigation par focus. L'utilisateur déplace la sélection entre les éléments de l'interface à l'aide de la Siri Remote. Les développeurs créent des applications en Swift/SwiftUI (natives) ou JavaScript/TVML (applications médias comme Netflix, Hulu).

Historique des versions tvOS

tvOS 9 (2015) — première version avec SDK et App Store. tvOS 10 (2016) — authentification unique (SSO) pour les abonnements câble. tvOS 11 (2017) — prise en charge d'Amazon Prime Video et mode automatique. tvOS 12 (2018) — Dolby Atmos. tvOS 13 (2019) — mode multi-utilisateur. tvOS 17 (2023) — FaceTime, VPN, profils audio via HDMI.

Version tvOSAnnéeInnovation clé
tvOS 92015App Store, SDK, Siri Remote
tvOS 102016Authentification unique (SSO), Live Tune-In
tvOS 112017Amazon Prime, mode automatique
tvOS 122018Dolby Atmos, mot de passe avec iPhone
tvOS 132019Multi-utilisateur, Centre de contrôle sur TV
tvOS 172023FaceTime, VPN, Rechercher Siri Remote

Architecture de tvOS et différences avec iOS

L'architecture de tvOS est basée sur la même pile qu'iOS : noyau XNU, services système Core Services, couche Media et couche utilisateur Cocoa Touch. Cependant, il existe des différences significatives liées aux spécificités de la plateforme TV.

Limitations matérielles

L'Apple TV 4K de 3e génération utilise A15 Bionic avec 6 cœurs CPU (2 performances, 4 efficacité) et un GPU à 5 cœurs. RAM — 4 Go (stockage SSD interne à partir de 64 Go). Le système ne dispose pas de stockage local persistant au sens classique : toutes les données d'application peuvent être supprimées par tvOS lorsque l'espace est insuffisant (purgeable). Le développeur doit utiliser iCloud Key-Value Storage ou CloudKit pour la préservation de l'état.

TVMLKit et TVJS

TVMLKit — un framework unique à tvOS permettant de créer des interfaces en JavaScript et TVML (langage de type XML spécifique à Apple). TVMLKit charge le JSON/XML depuis le serveur et rend les composants d'interface natifs. C'est la technologie principale pour les services de streaming : Netflix, Hulu, Amazon Prime Video utilisent TVMLKit. TVJS — un environnement JavaScript s'exécutant dans un contexte isolé.

Absence de stockage persistant

tvOS gère automatiquement l'espace disque : lorsque l'espace est insuffisant, le système peut supprimer le cache, les ressources téléchargées et même l'application elle-même (en conservant l'icône). Lors de la réouverture, l'application doit restaurer son état. iCloud NSUbiquitousKeyValueStore est le seul stockage persistant garanti pour les paramètres (jusqu'à 1 Mo par application).

swift
import Foundation

// // Préservation et restauration de l'état dans tvOS
final class StateManager {

    private let store = NSUbiquitousKeyValueStore.default
    private let coder = JSONEncoder()
    private let decoder = JSONDecoder()

    // Sauvegarde de la progression de visualisation
    func saveProgress<T: Codable>(_ value: T, for key: String) {
        if let data = try? coder.encode(value) {
            store.set(data, for: key)
            store.synchronize()
        }
    }

    // Restauration de l'état après suppression du cache
    func restoreProgress<T: Codable>(_ type: T.Type, for key: String) -> T? {
        guard let data = store.data(for: key) else { return nil }
        return try? decoder.decode(type, from: data)
    }

    // Gestion de la notification de changement sur un autre appareil
    init() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(ubiquitousKeyValueStoreDidChange),
            name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
            object: store
        )
    }

    @objc
    private func ubiquitousKeyValueStoreDidChange(_ notification: Notification) {
        print("Données modifiées sur un autre appareil")
    }
}

Le StateManager utilise NSUbiquitousKeyValueStore pour sauvegarder l'état de l'application sur tvOS. Étant donné que le stockage local peut être effacé par le système, seul iCloud garantit la persistance des données. store.synchronize() envoie immédiatement les données au serveur, tandis que didChangeExternallyNotification notifie l'application des changements provenant d'autres appareils de l'utilisateur.

Focus Engine : navigation et focus

Focus Engine — le mécanisme clé de tvOS qui remplace les événements tactiles par la navigation par focus. L'utilisateur déplace la sélection entre les éléments de l'interface à l'aide de la Siri Remote (surface tactile ou boutons). Le système calcule automatiquement l'élément de focus suivant en fonction de la distance et de la direction du mouvement.

UIFocusEnvironment et hiérarchie du focus

Chaque élément d'interface capable de recevoir le focus implémente le protocole UIFocusEnvironment. UIKit détermine automatiquement l'ordre de navigation en fonction de la géométrie des éléments. Le développeur peut remplacer le focus préféré via preferredFocusEnvironments, spécifier un tableau de focusEnvironment enfants et contrôler le mouvement via UIFocusHeading (up, down, left, right). UIFocusGuide permet de définir des chemins personnalisés pour des dispositions non triviales.

UIFocusEffect et parallaxe

tvOS ajoute automatiquement UIFocusEffect à l'élément ciblé : ombre, surbrillance et effet de parallaxe (décalage lors de l'inclinaison de la télécommande). Le développeur peut désactiver l'effet via focusedValue ou le personnaliser via UIFocusEffect.transform. Dans SwiftUI, la parallaxe est ajoutée avec le modificateur .hoverEffect(.highlight).

swift
import SwiftUI

// // Composant tvOS avec focus personnalisé
struct MovieCardView: View {
    let movie: Movie
    @State private var isFocused = false
    @Environment(\.isFocused) var envFocused

    var body: some View {
        VStack(spacing: 8) {
            AsyncImage(url: movie.posterURL) { phase in
                if let image = phase.image {
                    image
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(width: 320, height: 180)
                        .cornerRadius(8)
                        .overlay(
                            RoundedRectangle(cornerRadius: 8)
                                .stroke(isFocused ? Color.blue : Color.clear, lineWidth: 3)
                        )
                        .scaleEffect(isFocused ? 1.08 : 1.0)
                }
            }

            Text(movie.title)
                .font(.caption)
                .lineLimit(2)
                .foregroundStyle(isFocused ? .white : .gray)
        }
        .onHover { hovering in
            withAnimation(.spring(response: 0.35)) {
                isFocused = hovering
            }
        }
        .onPlayPauseCommand {
            // Gestion du bouton Play/Pause sur la télécommande
            startPlayback()
        }
        .focusable()
        .focusEffect { phase in
            // Effet de focus personnalisé
            phase == .active ?
                AnyView(self.scaleEffect(1.08)) :
                AnyView(self.scaleEffect(1.0))
        }
    }

    private func startPlayback() {
        print("Lecture : \(movie.title)")
    }
}

// // Écran principal avec grille de films
struct MovieGridScreen: View {
    let movies: [Movie]

    var body: some View {
        ScrollView {
            LazyVGrid(columns: [GridItem(.adaptive(minimum: 320, maximum: 400))], spacing: 24) {
                ForEach(movies) { movie in
                    MovieCardView(movie: movie)
                }
            }
            .padding(60)
        }
        .focusSection() // Groupement pour la navigation
    }
}

MovieCardView démontre Focus Engine dans SwiftUI : le modificateur .focusable() rend l'élément focusable, .onHover suit les changements d'état, .focusEffect permet une animation de focus personnalisée. .onPlayPauseCommand gère l'appui sur le bouton Play/Pause de la Siri Remote. focusSection regroupe une grille pour la navigation cyclique.

Siri Remote : gestes et boutons

La Siri Remote de deuxième génération (2021) dispose d'une surface tactile, de 5 boutons et d'un microphone. tvOS prend en charge les gestes : balayages (navigation), tap (sélection), double-tap (centrage), pincement-zoom (images), appui long (menu contextuel). UIPress avec les types .select, .playPause, .menu, .upArrow, .downArrow, .leftArrow, .rightArrow — types d'appui prédéfinis. Le microphone de la télécommande est utilisé pour Siri et la recherche vocale.

Top Shelf et écran d'applications

Top Shelf est une zone sur l'écran d'accueil d'Apple TV qui affiche le contenu dynamique de l'application lorsqu'elle est dans la rangée supérieure. Dans tvOS 17, Top Shelf prend en charge jusqu'à 8 widgets avec des arrière-plans personnalisés et des éléments interactifs. Le développeur implémente TVTopShelfProvider pour fournir le contenu.

Styles de Top Shelf

Trois styles de Top Shelf sont disponibles : Sectioned — liste catégorisée (séries par genre), Inset — élément central avec description détaillée (film recommandé), Photo — grille d'images (albums photos). Le système met à jour Top Shelf en arrière-plan via BGTaskScheduler, similaire à watchOS. Le fournisseur doit retourner le contenu rapidement — tvOS met en cache les données pendant 24 heures.

Écran d'applications

L'écran d'accueil tvOS se compose d'une rangée Top Shelf et d'une grille d'applications. Les utilisateurs peuvent réorganiser les icônes et créer des dossiers. tvOS décharge automatiquement les applications de la mémoire lorsque les ressources sont faibles, donc le développeur doit gérer correctement UISceneDidDisconnectNotification et restaurer l'état au redémarrage.

Style Top ShelfFormatQuand l'utiliser
SectionedSections avec en-têtes et élémentsSéries, podcasts, playlists
InsetUn grand élément avec descriptionFilm du jour, exclusif
PhotoGrille d'images sans légendesAlbums photos, galeries
TabOnglets avec commutationSports par type, actualités par sujet

SwiftUI pour Apple TV

SwiftUI est entièrement pris en charge dans tvOS depuis tvOS 13. Apple recommande SwiftUI pour tous les nouveaux projets. Le même code SwiftUI fonctionne sur iOS, iPadOS, macOS et tvOS avec des adaptations minimales pour Focus Engine. SwiftUI pour tvOS fournit les modificateurs .focusable(), .focusSection(), .onPlayPauseCommand et .onExitCommand.

Adaptation à tvOS

Lors du portage d'une application iOS vers tvOS, il faut : remplacer TabView par NavigationView avec navigation par focus, augmenter la taille des polices (minimum 30pt pour les titres, 22pt pour le texte), ajouter des marges (minimum 40pt des bords — zone de sécurité sur les téléviseurs). tvOS ne prend pas en charge UIAlertController avec champ de texte, UIWebView et MFMailComposeViewController.

Composant iOSÉquivalent tvOSNote
UISliderUIProgressView + boutonsSlider non supporté
UIPickerViewTableau avec focusPicker remplacé par liste
UITextFieldUIAlertController (lecture seule)Saisie de texte via Siri
UIActionSheetUIAlertControllerSupporté
UIWebViewNon supportéUtiliser WKWebView
MFMailComposeNon supportéOuvrir URL mailto:

Recommandations de conception

HIG d'Apple pour tvOS : taille minimale de la zone tactile 60×60 points, texte lisible à 3 mètres (taille de police pas moins de 22pt pour le corps), contraste du texte 4.5:1, fond sombre (le fond clair provoque des reflets sur les écrans OLED), tous les éléments accessibles sans gestes complexes. Résolution : Apple TV 4K produit 3840×2160 (4K) ou 1920×1080 (HD) à 60 FPS. Toutes les images doivent être en @2x (pour 1080p) et @4x (pour 4K).

TVMLKit et applications médias

TVMLKit — un framework pour créer des applications médias sur tvOS avec des technologies web : JavaScript (TVJS) et TVML (XML spécifique à Apple). Les applications TVMLKit ne nécessitent pas de compilation — l'interface est chargée depuis le serveur, permettant des mises à jour de contenu sans passer par l'App Review. Il est utilisé par les principaux services de streaming pour les carrousels de contenu.

TVML : structure des modèles

TVML fournit des modèles prêts à l'emploi : CatalogTemplate (catalogue avec sections), ProductTemplate (page de détail du contenu), FormTemplate (formulaires de connexion), LoadingTemplate (indicateur de chargement). Les modèles sont décrits en XML et stylisés via des attributs de type CSS. Le code TVJS gère les pressions et appelle les API natives.

xml
<!-- CatalogTemplate — catalogue de films sur TVML -->
<document>
  <catalogTemplate>
    <banner>
      <title>Nouveautés du cinéma</title>
      <description>Premières récentes et exclusivités</description>
    </banner>
    <section>
      <header>
        <title>Populaire</title>
      </header>
      <items>
        <lockup>
          <img src="https://cdn.example.com/movie1.jpg" width=300 height=450/>
          <title>Interstellar</title>
        </lockup>
        <lockup>
          <img src="https://cdn.example.com/movie2.jpg" width=300 height=450/>
          <title>Inception</title>
        </lockup>
      </items>
    </section>
  </catalogTemplate>
</document>

Le modèle TVML CatalogTemplate contient une bannière avec un titre et des sections avec des éléments lockup. Chaque lockup est une carte de film avec une image et un titre. Focus Engine gère automatiquement la navigation entre les éléments lockup. Lors de la pression, le gestionnaire TVJS reçoit l'événement select et peut afficher une page de détail via ProductTemplate.

TVJS : gestion des événements

TVJS est un environnement JavaScript isolé de l'application principale. Le code TVJS est appelé lors du chargement d'un modèle TVML et de la gestion des événements. TVJS a accès aux API natives via Appliance et Player pour contrôler la lecture vidéo. Apple recommande d'utiliser TVMLKit uniquement pour les applications médias avec des mises à jour fréquentes de contenu. Pour les jeux et les applications interactives, SwiftUI est préféré.

Publication d'applications tvOS

Publier une application tvOS nécessite un abonnement Apple Developer Program (99 $/an). L'application est téléchargée via App Store Connect en tant que produit distinct ou dans le cadre d'un binaire universel (iOS + tvOS). L'App Review vérifie la stabilité, la conformité HIG et la limite de taille de 4 Go.

Construction et distribution

Xcode crée une cible tvOS avec l'extension .app (package .ipa). Architecture — arm64 (Apple TV utilise des puces ARM Apple Silicon). tvOS ne prend pas en charge les frameworks avec i386 ou x86_64. L'application est signée avec un certificat Apple Development (test) ou Apple Distribution (publication). La distribution via Volume Purchase Program pour les clients professionnels est possible.

Exigences de l'App Review

Exigences spéciales tvOS : tous les éléments de l'interface doivent être accessibles via Focus Engine sans utiliser d'écran tactile ni de clavier. Les applications nécessitant une autorisation doivent prendre en charge l'authentification unique (SSO) via iTunes Store. Le contenu publicitaire ne peut pas interrompre la lecture sans le consentement de l'utilisateur. La taille du binaire téléchargé ne doit pas dépasser 4 Go.

ExigenceDescription
Taille de l'applicationPas plus de 4 Go, recommandé 500 Mo
Résolution graphique@2x (1920×1080) et @4x (3840×2160) pour 4K
Navigation par focusTous les éléments accessibles via Siri Remote
Format vidéoH.264, HEVC, Dolby Vision (Profile 5)
AudioDolby Atmos (E-AC-3 JOC) et stéréo AAC

Foire aux questions

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

Le langage principal est Swift avec les frameworks SwiftUI et UIKit. Pour les applications médias, TVMLKit avec JavaScript et des modèles TVML chargés depuis le serveur est utilisé. Objective-C est pris en charge pour les projets existants. Apple recommande SwiftUI pour tous les nouveaux projets tvOS.

En quoi tvOS diffère-t-il d'iOS ?

tvOS utilise Focus Engine au lieu des événements tactiles, n'a pas de caméra ni de microphone (sauf Siri Remote), limite la taille de l'application à 4 Go, ne prend pas en charge le stockage local persistant (purgeable) et nécessite Metal pour le rendu. Toutes les applications fonctionnent uniquement sur ARM64.

Comment fonctionne Focus Engine dans tvOS ?

Focus Engine gère le mouvement du focus entre les éléments de l'interface à l'aide de la Siri Remote. Le développeur définit le focus préféré via preferredFocusEnvironments. UIFocusHeading (up, down, left, right) détermine la direction. UIFocusEffect ajoute automatiquement la parallaxe et l'ombre à l'élément actif.

Comment publier des applications pour Apple TV ?

La publication nécessite un abonnement Apple Developer Program (99 $/an). L'application est téléchargée via Xcode Organizer ou Transporter vers App Store Connect. La modération vérifie : la compatibilité avec Focus Engine, la stabilité, l'absence d'UIWebView et la limite de taille de 4 Go.

Peut-on utiliser UIKit dans tvOS ?

Oui, UIKit est entièrement pris en charge dans tvOS : UIView, UIViewController, UICollectionView, UITableView. Cependant, UIKit est adapté à Focus Engine : UIButton et UIControl reçoivent les événements par pression de la télécommande, et non par toucher. SwiftUI est recommandé pour les nouveaux projets en raison de l'adaptation automatique au focus.

Résumé

  • tvOS — OS d'Apple pour boîtiers TV sur noyau XNU avec contrôle Focus Engine
  • Focus Engine remplace le contrôle tactile par le mouvement du focus via Siri Remote avec effets de parallaxe
  • TVMLKit — un framework unique pour les applications médias en JavaScript avec des modèles TVML côté serveur
  • Top Shelf fournit du contenu dynamique sur l'écran d'accueil via TVTopShelfProvider
  • SwiftUI est entièrement pris en charge depuis tvOS 13 avec les modificateurs focusable, focusSection et onPlayPauseCommand
  • Limitations de tvOS : taille 4 Go, stockage purgeable, pas de caméra, UIWebView ni MFMailCompose
  • Publication nécessite Apple Developer Program, graphismes @2x/@4x, format HEVC et Dolby Atmos

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