tvOS: vývoj pro Apple TV s Focus Engine

Autor: IT Sectr Publikováno: 2026-02-07 Doba čtení: 11 min

tvOS — operační systém Apple pro Apple TV, poprvé vydaný v roce 2015 společně s Apple TV 4. generace. Vývoj aplikací pro tvOS probíhá ve Swiftu s použitím SwiftUI a TVMLKit. Klíčový rozdíl oproti iOS je ovládání ostření přes Siri Remote místo dotyku. Podle Apple je tvOS nainstalován na více než 100 milionech aktivních zařízení po celém světě.

Hlavní body

  • tvOS — OS Apple pro TV set-top boxy na jádře XNU s Focus Engine místo dotyku
  • Focus Engine — systém správy ostření mezi prvky přes Siri Remote
  • SwiftUI a TVMLKit — dva přístupy k vývoji: nativní a JavaScript šablony
  • Top Shelf — dynamický obsah na hlavní obrazovce Apple TV
  • Velikost aplikace přísně omezena na 4 GB, doporučeno ne více než 500 MB

Co je tvOS?

tvOS — operační systém Apple pro set-top boxy Apple TV, založený na stejném jádře Darwin XNU jako iOS. Poprvé vydán 30. října 2015 s Apple TV 4. generace. tvOS nahradil zastaralý Apple TV Software (založený na iOS, bez App Store a SDK). Systém je optimalizován pro provoz na televizi s rozlišením až 4K HDR (Dolby Vision) a zvukem Dolby Atmos.

Podle Apple (WWDC 2025) je tvOS nainstalován na Apple TV HD (2015), Apple TV 4K (2017, 2021, 2022) a integrován do některých modelů Smart TV přes AirPlay. Apple TV používá čipy A8 (HD), A10X Fusion (1. gen 4K), A12 Bionic (2. gen 4K) a A15 Bionic (3. gen 4K). Všechny modely podporují tvOS 17. tvOS nemá kameru, mikrofon (kromě dálkového ovladače), dotykovou obrazovku ani GPS.

Klíčovou vlastností tvOS je Focus Engine, který nahrazuje dotykové ovládání navigací pomocí ostření. Uživatel přesouvá výběr mezi prvky UI pomocí Siri Remote. Vývojáři vytvářejí aplikace ve Swift/SwiftUI (nativní) nebo JavaScript/TVML (mediální aplikace jako Netflix, Hulu).

Historie verzí tvOS

tvOS 9 (2015) — první verze s SDK a App Store. tvOS 10 (2016) — jednotné přihlášení (SSO) pro kabelové předplatné. tvOS 11 (2017) — podpora Amazon Prime Video a automatický režim. tvOS 12 (2018) — Dolby Atmos. tvOS 13 (2019) — režim více uživatelů. tvOS 17 (2023) — FaceTime, VPN, audio profily přes HDMI.

Verze tvOSRokKlíčová inovace
tvOS 92015App Store, SDK, Siri Remote
tvOS 102016Jednotné přihlášení (SSO), Live Tune-In
tvOS 112017Amazon Prime, automatický režim
tvOS 122018Dolby Atmos, heslo s iPhone
tvOS 132019Více uživatelů, Ovládací centrum na TV
tvOS 172023FaceTime, VPN, Najít Siri Remote

Architektura tvOS a rozdíly od iOS

Architektura tvOS je založena na stejném stacku jako iOS: jádro XNU, systémové služby Core Services, mediální vrstva Media a uživatelská vrstva Cocoa Touch. Existují však významné rozdíly související se specifiky televizní platformy.

Hardwarová omezení

Apple TV 4K 3. generace používá A15 Bionic s 6 jádry CPU (2 výkonnostní, 4 úsporné) a 5jádrovým GPU. RAM — 4 GB (interní SSD úložiště od 64 GB). Systém nemá trvalé místní úložiště v klasickém smyslu: všechna data aplikací mohou být smazána tvOS při nedostatku místa (purgeable). Vývojář musí používat iCloud Key-Value Storage nebo CloudKit pro uchování stavu.

TVMLKit a TVJS

TVMLKit — jedinečný framework pro tvOS umožňující vytváření rozhraní v JavaScriptu a TVML (jazyk podobný XML specifický pro Apple). TVMLKit načítá JSON/XML ze serveru a vykresluje nativní UI komponenty. Toto je primární technologie pro streamovací služby: Netflix, Hulu, Amazon Prime Video používají TVMLKit. TVJS — JavaScriptové prostředí běžící v izolovaném kontextu.

Nedostatek trvalého úložiště

tvOS automaticky spravuje místo na disku: při nedostatku místa může systém smazat mezipaměť, stažené zdroje a dokonce i samotnou aplikaci (při zachování ikony). Při opětovném otevření musí aplikace obnovit svůj stav. iCloud NSUbiquitousKeyValueStore je jediné zaručené trvalé úložiště pro nastavení (až 1 MB na aplikaci).

swift
import Foundation

// // Uložení a obnovení stavu v tvOS
final class StateManager {

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

    // Ukládání průběhu sledování
    func saveProgress<T: Codable>(_ value: T, for key: String) {
        if let data = try? coder.encode(value) {
            store.set(data, for: key)
            store.synchronize()
        }
    }

    // Obnovení stavu po smazání mezipaměti
    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)
    }

    // Zpracování oznámení o změně na jiném zařízení
    init() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(ubiquitousKeyValueStoreDidChange),
            name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
            object: store
        )
    }

    @objc
    private func ubiquitousKeyValueStoreDidChange(_ notification: Notification) {
        print("Data změněna na jiném zařízení")
    }
}

Správce StateManager používá NSUbiquitousKeyValueStore k ukládání stavu aplikace na tvOS. Protože místní úložiště může být systémem vymazáno, pouze iCloud zaručuje trvanlivost dat. store.synchronize() okamžitě odesílá data na server, zatímco didChangeExternallyNotification informuje aplikaci o změnách z jiných zařízení uživatele.

Focus Engine: navigace a ostření

Focus Engine — klíčový mechanismus tvOS, který nahrazuje dotykové události navigací pomocí ostření. Uživatel přesouvá výběr mezi prvky UI pomocí Siri Remote (dotykový povrch nebo tlačítka). Systém automaticky vypočítá další prvek ostření na základě vzdálenosti a směru pohybu.

UIFocusEnvironment a hierarchie ostření

Každý prvek UI schopný přijímat ostření implementuje protokol UIFocusEnvironment. UIKit automaticky určuje pořadí navigace na základě geometrie prvků. Vývojář může přepsat preferované ostření pomocí preferredFocusEnvironments, zadat pole podřízených focusEnvironment a řídit pohyb pomocí UIFocusHeading (up, down, left, right). UIFocusGuide umožňuje nastavit vlastní trasy pro netriviální rozvržení.

UIFocusEffect a paralaxa

tvOS automaticky přidává UIFocusEffect k zaostřenému prvku: stín, zvýraznění a efekt paralaxy (posun při naklonění dálkového ovladače). Vývojář může efekt vypnout pomocí focusedValue nebo přizpůsobit pomocí UIFocusEffect.transform. Ve SwiftUI se paralaxa přidává modifikátorem .hoverEffect(.highlight).

swift
import SwiftUI

// // tvOS komponent s vlastním ostřením
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 {
            // Zpracování tlačítka Play/Pause na dálkovém ovladači
            startPlayback()
        }
        .focusable()
        .focusEffect { phase in
            // Vlastní efekt ostření
            phase == .active ?
                AnyView(self.scaleEffect(1.08)) :
                AnyView(self.scaleEffect(1.0))
        }
    }

    private func startPlayback() {
        print("Přehrávání: \(movie.title)")
    }
}

// // Hlavní obrazovka s mřížkou filmů
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() // Seskupení pro navigaci
    }
}

MovieCardView demonstruje Focus Engine ve SwiftUI: modifikátor .focusable() činí prvek zaostřitelným, .onHover sleduje změny stavu, .focusEffect umožňuje vlastní animaci ostření. .onPlayPauseCommand zpracovává stisk tlačítka Play/Pause na Siri Remote. focusSection seskupuje mřížku pro cyklickou navigaci.

Siri Remote: gesta a tlačítka

Siri Remote druhé generace (2021) má dotykový povrch, 5 tlačítek a mikrofon. tvOS podporuje gesta: přejetí (navigace), klepnutí (výběr), dvojité klepnutí (centrování), sevření-zoom (obrázky), dlouhé stisknutí (kontextová nabídka). UIPress s typy .select, .playPause, .menu, .upArrow, .downArrow, .leftArrow, .rightArrow — předdefinované typy stisku. Mikrofon dálkového ovladače se používá pro Siri a hlasové vyhledávání.

Top Shelf a obrazovka aplikací

Top Shelf je oblast na hlavní obrazovce Apple TV zobrazující dynamický obsah aplikace, když je v horním řádku. V tvOS 17 podporuje Top Shelf až 8 widgetů s vlastním pozadím a interaktivními prvky. Vývojář implementuje TVTopShelfProvider pro poskytování obsahu.

Styly Top Shelf

K dispozici jsou tři styly Top Shelf: Sectioned — kategorizovaný seznam (seriály podle žánru), Inset — centrální prvek s podrobným popisem (doporučený film), Photo — mřížka obrázků (fotoalba). Systém aktualizuje Top Shelf na pozadí přes BGTaskScheduler, podobně jako watchOS. Poskytovatel musí rychle vracet obsah — tvOS ukládá data do mezipaměti na 24 hodin.

Obrazovka aplikací

Hlavní obrazovka tvOS se skládá z řádku Top Shelf a mřížky aplikací. Uživatelé mohou přeskupovat ikony a vytvářet složky. tvOS automaticky uvolňuje aplikace z paměti při nedostatku zdrojů, proto musí vývojář správně zpracovat UISceneDidDisconnectNotification a obnovit stav při restartu.

Styl Top ShelfFormátKdy použít
SectionedSekce s nadpisy a položkamiSeriály, podcasty, seznamy skladeb
InsetJedna velká položka s popisemFilm dne, exkluzivně
PhotoMřížka obrázků bez popiskůFotoalba, galerie
TabZáložky s přepínánímSport podle typu, zprávy podle tématu

SwiftUI pro Apple TV

SwiftUI je plně podporováno v tvOS od tvOS 13. Apple doporučuje SwiftUI pro všechny nové projekty. Stejný kód SwiftUI funguje na iOS, iPadOS, macOS a tvOS s minimálními úpravami pro Focus Engine. SwiftUI pro tvOS poskytuje modifikátory .focusable(), .focusSection(), .onPlayPauseCommand a .onExitCommand.

Přizpůsobení tvOS

Při přenášení iOS aplikace na tvOS je třeba: nahradit TabView NavigationView s navigací pomocí ostření, zvětšit velikosti písma (minimálně 30pt pro nadpisy, 22pt pro text), přidat okraje (minimálně 40pt od okrajů — bezpečná zóna na televizorech). tvOS nepodporuje UIAlertController s textovým polem, UIWebView a MFMailComposeViewController.

Komponent iOSEkvivalent tvOSPoznámka
UISliderUIProgressView + tlačítkaSlider není podporován
UIPickerViewTabulka s ostřenímPicker nahrazen seznamem
UITextFieldUIAlertController (pouze čtení)Vstup textu přes Siri
UIActionSheetUIAlertControllerPodporováno
UIWebViewNení podporovánoPoužijte WKWebView
MFMailComposeNení podporovánoOtevřete mailto: URL

Doporučení pro design

Apple HIG pro tvOS: minimální velikost dotykové oblasti 60×60 bodů, text čitelný ze vzdálenosti 3 metrů (velikost písma ne menší než 22pt pro tělo), kontrast textu 4.5:1, tmavé pozadí (světlé pozadí způsobuje odlesky na OLED televizorech), všechny prvky přístupné bez složitých gest. Rozlišení: Apple TV 4K produkuje 3840×2160 (4K) nebo 1920×1080 (HD) při 60 FPS. Všechny obrázky by měly být @2x (pro 1080p) a @4x (pro 4K).

TVMLKit a mediální aplikace

TVMLKit — framework pro vytváření mediálních aplikací na tvOS pomocí webových technologií: JavaScript (TVJS) a TVML (XML specifické pro Apple). Aplikace TVMLKit nevyžadují kompilaci — rozhraní se načítá ze serveru, což umožňuje aktualizace obsahu bez procházení App Review. Používají ho hlavní streamovací služby pro karusely obsahu.

TVML: struktura šablon

TVML poskytuje hotové šablony: CatalogTemplate (katalog s sekcemi), ProductTemplate (stránka podrobností obsahu), FormTemplate (přihlašovací formuláře), LoadingTemplate (indikátor načítání). Šablony jsou popsány v XML a stylovány pomocí atributů podobných CSS. Kód TVJS zpracovává stisky a volá nativní API.

xml
<!-- CatalogTemplate — katalog filmů pro TVML -->
<document>
  <catalogTemplate>
    <banner>
      <title>Filmové novinky</title>
      <description>Čerstvé premiéry a exkluzivity</description>
    </banner>
    <section>
      <header>
        <title>Oblíbené</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>Počátek</title>
        </lockup>
      </items>
    </section>
  </catalogTemplate>
</document>

Šablona TVML CatalogTemplate obsahuje banner s názvem a sekce s prvky lockup. Každý lockup je karta filmu s obrázkem a názvem. Focus Engine automaticky spravuje navigaci mezi prvky lockup. Při stisku obdrží obsluha TVJS událost select a může zobrazit stránku podrobností přes ProductTemplate.

TVJS: zpracování událostí

TVJS je JavaScriptové prostředí izolované od hlavní aplikace. Kód TVJS je volán při načítání šablony TVML a zpracování událostí. TVJS má přístup k nativním API přes Appliance a Player pro ovládání přehrávání videa. Apple doporučuje používat TVMLKit pouze pro mediální aplikace s častými aktualizacemi obsahu. Pro hry a interaktivní aplikace je preferován SwiftUI.

Publikování tvOS aplikací

Publikování tvOS aplikace vyžaduje předplatné Apple Developer Program ($99/rok). Aplikace se nahrává přes App Store Connect jako samostatný produkt nebo jako součást univerzálního binárního souboru (iOS + tvOS). App Review kontroluje stabilitu, shodu s HIG a omezení velikosti 4 GB.

Sestavení a distribuce

Xcode vytváří tvOS cíl s příponou .app (balíček .ipa). Architektura — arm64 (Apple TV používá ARM čipy Apple Silicon). tvOS nepodporuje frameworky s i386 nebo x86_64. Aplikace je podepsána certifikátem Apple Development (testování) nebo Apple Distribution (publikace). Distribuce přes Volume Purchase Program pro firemní klienty je možná.

Požadavky App Review

Speciální požadavky tvOS: všechny prvky rozhraní musí být přístupné přes Focus Engine bez použití dotykové obrazovky nebo klávesnice. Aplikace vyžadující autorizaci musí podporovat jednotné přihlášení (SSO) přes iTunes Store. Reklamní obsah nesmí přerušovat přehrávání bez souhlasu uživatele. Velikost nahraného binárního souboru nesmí překročit 4 GB.

PožadavekPopis
Velikost aplikaceNe více než 4 GB, doporučeno 500 MB
Rozlišení grafiky@2x (1920×1080) a @4x (3840×2160) pro 4K
Navigace ostřenímVšechny prvky přístupné přes Siri Remote
Formát videaH.264, HEVC, Dolby Vision (Profile 5)
AudioDolby Atmos (E-AC-3 JOC) a stereo AAC

Často kladené otázky

Jaké jazyky se používají pro vývoj tvOS?

Hlavním jazykem je Swift s frameworky SwiftUI a UIKit. Pro mediální aplikace se používá TVMLKit s JavaScriptem a šablonami TVML načítanými ze serveru. Objective-C je podporováno pro starší projekty. Apple doporučuje SwiftUI pro všechny nové projekty tvOS.

Čím se tvOS liší od iOS?

tvOS používá Focus Engine místo dotykových událostí, nemá kameru ani mikrofon (kromě Siri Remote), omezuje velikost aplikace na 4 GB, nepodporuje trvalé místní úložiště (purgeable) a vyžaduje Metal pro vykreslování. Všechny aplikace běží pouze na ARM64.

Jak funguje Focus Engine v tvOS?

Focus Engine spravuje pohyb ostření mezi prvky UI pomocí Siri Remote. Vývojář nastavuje preferované ostření přes preferredFocusEnvironments. UIFocusHeading (up, down, left, right) určuje směr. UIFocusEffect automaticky přidává paralaxu a stín aktivnímu prvku.

Jak publikovat aplikace pro Apple TV?

Publikace vyžaduje předplatné Apple Developer Program ($99/rok). Aplikace se nahrává přes Xcode Organizer nebo Transporter do App Store Connect. Moderace kontroluje: kompatibilitu s Focus Engine, stabilitu, nepřítomnost UIWebView a omezení velikosti 4 GB.

Lze použít UIKit v tvOS?

Ano, UIKit je plně podporován v tvOS: UIView, UIViewController, UICollectionView, UITableView. Nicméně UIKit je přizpůsoben pro Focus Engine: UIButton a UIControl přijímají události stiskem dálkového ovladače, ne dotykem. SwiftUI je doporučován pro nové projekty kvůli automatickému přizpůsobení ostření.

Shrnutí

  • tvOS — OS Apple pro TV set-top boxy na jádře XNU s ovládáním Focus Engine
  • Focus Engine nahrazuje dotykové ovládání pohybem ostření přes Siri Remote s efekty paralaxy
  • TVMLKit — jedinečný framework pro mediální aplikace v JavaScriptu se serverovými šablonami TVML
  • Top Shelf poskytuje dynamický obsah na hlavní obrazovce přes TVTopShelfProvider
  • SwiftUI je plně podporováno od tvOS 13 s modifikátory focusable, focusSection a onPlayPauseCommand
  • Omezení tvOS: velikost 4 GB, purgeable úložiště, bez kamery, UIWebView nebo MFMailCompose
  • Publikace vyžaduje Apple Developer Program, grafiku @2x/@4x, formát HEVC a Dolby Atmos

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také