tvOS: tworzenie aplikacji na Apple TV z Focus Engine

Autor: IT Sectr Opublikowano: 2026-02-07 Czas czytania: 11 min

tvOS — system operacyjny Apple dla Apple TV, wydany po raz pierwszy w 2015 roku wraz z Apple TV 4. generacji. Tworzenie aplikacji dla tvOS odbywa się w języku Swift z użyciem SwiftUI i TVMLKit. Kluczową różnicą w stosunku do iOS jest sterowanie fokusem za pomocą Siri Remote zamiast dotyku. Według Apple, tvOS jest zainstalowany na ponad 100 milionach aktywnych urządzeń na całym świecie.

Najważniejsze punkty

  • tvOS — system Apple dla dekoderów TV na jądrze XNU z Focus Engine zamiast dotyku
  • Focus Engine — system zarządzania fokusem między elementami przez Siri Remote
  • SwiftUI i TVMLKit — dwa podejścia do tworzenia: natywne i szablony JavaScript
  • Top Shelf — dynamiczna zawartość na ekranie głównym Apple TV
  • Rozmiar aplikacji ściśle ograniczony do 4 GB, zalecane nie więcej niż 500 MB

Co to jest tvOS?

tvOS — system operacyjny Apple dla dekoderów Apple TV, oparty na tym samym jądrze Darwin XNU co iOS. Wydany po raz pierwszy 30 października 2015 roku z Apple TV 4. generacji. tvOS zastąpił przestarzałe Apple TV Software (oparte na iOS, bez App Store i SDK). System jest zoptymalizowany do pracy na telewizorze z rozdzielczością do 4K HDR (Dolby Vision) i dźwiękiem Dolby Atmos.

Według Apple (WWDC 2025), tvOS jest zainstalowany na Apple TV HD (2015), Apple TV 4K (2017, 2021, 2022) i wbudowany w niektóre modele Smart TV przez AirPlay. Apple TV używa układów A8 (HD), A10X Fusion (1. gen 4K), A12 Bionic (2. gen 4K) i A15 Bionic (3. gen 4K). Wszystkie modele obsługują tvOS 17. tvOS nie ma kamery, mikrofonu (oprócz pilota), ekranu dotykowego ani GPS.

Kluczową cechą tvOS jest Focus Engine, który zastępuje sterowanie dotykowe nawigacją fokusową. Użytkownik przesuwa zaznaczenie między elementami interfejsu za pomocą Siri Remote. Deweloperzy tworzą aplikacje w Swift/SwiftUI (natywne) lub JavaScript/TVML (aplikacje multimedialne Netflix, Hulu).

Historia wersji tvOS

tvOS 9 (2015) — pierwsza wersja z SDK i App Store. tvOS 10 (2016) — pojedyncze logowanie (SSO) dla subskrypcji kablowych. tvOS 11 (2017) — obsługa Amazon Prime Video i tryb automatyczny. tvOS 12 (2018) — Dolby Atmos. tvOS 13 (2019) — tryb wieloużytkownikowy. tvOS 17 (2023) — FaceTime, VPN, profile audio przez HDMI.

Wersja tvOSRokKluczowa innowacja
tvOS 92015App Store, SDK, Siri Remote
tvOS 102016Pojedyncze logowanie (SSO), Live Tune-In
tvOS 112017Amazon Prime, tryb automatyczny
tvOS 122018Dolby Atmos, hasło z iPhone
tvOS 132019Wielu użytkowników, Centrum sterowania na TV
tvOS 172023FaceTime, VPN, Znajdź Siri Remote

Architektura tvOS i różnice od iOS

Architektura tvOS opiera się na tym samym stosie co iOS: jądro XNU, usługi systemowe Core Services, warstwa medialna Media i warstwa użytkownika Cocoa Touch. Istnieją jednak znaczące różnice związane ze specyfiką platformy telewizyjnej.

Ograniczenia sprzętowe

Apple TV 4K 3. generacji używa A15 Bionic z 6 rdzeniami CPU (2 wydajnościowe, 4 energooszczędne) i 5-rdzeniowym GPU. RAM — 4 GB (wewnętrzna pamięć SSD od 64 GB). System nie ma trwałej pamięci lokalnej w klasycznym sensie: wszystkie dane aplikacji mogą zostać usunięte przez tvOS przy braku miejsca (purgeable). Deweloper musi używać iCloud Key-Value Storage lub CloudKit do przechowywania stanu.

TVMLKit i TVJS

TVMLKit — unikalny dla tvOS framework umożliwiający tworzenie interfejsów w JavaScript i TVML (język podobny do XML specyficzny dla Apple). TVMLKit ładuje JSON/XML z serwera i renderuje natywne komponenty interfejsu. Jest to podstawowa technologia dla usług przesyłania strumieniowego: Netflix, Hulu, Amazon Prime Video używają TVMLKit. TVJS — środowisko JavaScript działające w izolowanym kontekście.

Brak trwałego przechowywania

tvOS automatycznie zarządza miejscem na dysku: przy braku miejsca system może usunąć pamięć podręczną, pobrane zasoby, a nawet samą aplikację (zachowując ikonę). Przy ponownym otwarciu aplikacja musi przywrócić swój stan. iCloud NSUbiquitousKeyValueStore to jedyne gwarantowane trwałe przechowywanie ustawień (do 1 MB na aplikację).

swift
import Foundation

// // Zapisywanie i przywracanie stanu w tvOS
final class StateManager {

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

    // Zapisywanie postępu oglądania
    func saveProgress<T: Codable>(_ value: T, for key: String) {
        if let data = try? coder.encode(value) {
            store.set(data, for: key)
            store.synchronize()
        }
    }

    // Przywracanie stanu po usunięciu pamięci podręcznej
    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)
    }

    // Obsługa powiadomienia o zmianie na innym urządzeniu
    init() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(ubiquitousKeyValueStoreDidChange),
            name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
            object: store
        )
    }

    @objc
    private func ubiquitousKeyValueStoreDidChange(_ notification: Notification) {
        print("Dane zmienione na innym urządzeniu")
    }
}

Menedżer StateManager używa NSUbiquitousKeyValueStore do zapisywania stanu aplikacji na tvOS. Ponieważ lokalna pamięć może zostać wyczyszczona przez system, tylko iCloud gwarantuje trwałość danych. store.synchronize() natychmiast wysyła dane na serwer, a didChangeExternallyNotification powiadamia aplikację o zmianach z innych urządzeń użytkownika.

Focus Engine: nawigacja i fokus

Focus Engine — kluczowy mechanizm tvOS, który zastępuje zdarzenia dotykowe nawigacją fokusową. Użytkownik przesuwa zaznaczenie między elementami interfejsu za pomocą Siri Remote (powierzchnia dotykowa lub przyciski). System automatycznie oblicza następny element fokusu na podstawie odległości i kierunku ruchu.

UIFocusEnvironment i hierarchia fokusu

Każdy element interfejsu zdolny do otrzymania fokusu implementuje protokół UIFocusEnvironment. UIKit automatycznie określa kolejność nawigacji na podstawie geometrii elementów. Deweloper może zastąpić preferowany fokus przez preferredFocusEnvironments, określić tablicę podrzędnych focusEnvironment i kontrolować ruch przez UIFocusHeading (up, down, left, right). UIFocusGuide umożliwia ustawienie niestandardowych tras dla nietrywialnych układów.

UIFocusEffect i paralaksa

tvOS automatycznie dodaje UIFocusEffect do sfokusowanego elementu: cień, podświetlenie i efekt paralaksy (przesunięcie przy pochyleniu pilota). Deweloper może wyłączyć efekt przez focusedValue lub dostosować przez UIFocusEffect.transform. W SwiftUI paralaksa jest dodawana modyfikatorem .hoverEffect(.highlight).

swift
import SwiftUI

// // Komponent tvOS z niestandardowym fokusem
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 {
            // Obsługa przycisku Play/Pause na pilocie
            startPlayback()
        }
        .focusable()
        .focusEffect { phase in
            // Niestandardowy efekt fokusu
            phase == .active ?
                AnyView(self.scaleEffect(1.08)) :
                AnyView(self.scaleEffect(1.0))
        }
    }

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

// // Ekran główny z siatką filmów
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() // Grupowanie dla nawigacji
    }
}

MovieCardView demonstruje Focus Engine w SwiftUI: modyfikator .focusable() czyni element fokusowalnym, .onHover śledzi zmiany stanu, .focusEffect umożliwia niestandardową animację fokusu. .onPlayPauseCommand obsługuje naciśnięcie przycisku Play/Pause na Siri Remote. focusSection grupuje siatkę dla nawigacji cyklicznej.

Siri Remote: gesty i przyciski

Siri Remote drugiej generacji (2021) ma powierzchnię dotykową, 5 przycisków i mikrofon. tvOS obsługuje gesty: przesunięcia (nawigacja), dotknięcie (wybór), podwójne dotknięcie (centrowanie), ściśnięcie-zoom (obrazy), długie naciśnięcie (menu kontekstowe). UIPress z typami .select, .playPause, .menu, .upArrow, .downArrow, .leftArrow, .rightArrow — predefiniowane typy naciśnięć. Mikrofon pilota jest używany dla Siri i wyszukiwania głosowego.

Top Shelf i ekran aplikacji

Top Shelf — obszar na ekranie głównym Apple TV wyświetlający dynamiczną zawartość aplikacji, gdy znajduje się ona w górnym rzędzie. W tvOS 17 Top Shelf obsługuje do 8 widżetów z niestandardowym tłem i interaktywnymi elementami. Deweloper implementuje TVTopShelfProvider do dostarczania treści.

Style Top Shelf

Dostępne są trzy style Top Shelf: Sectioned — kategoryzowana lista (seriale według gatunku), Inset — element centralny ze szczegółowym opisem (polecany film), Photo — siatka obrazów (albumy zdjęć). System aktualizuje Top Shelf w tle przez BGTaskScheduler, podobnie jak watchOS. Dostawca musi szybko zwracać treść — tvOS buforuje dane przez 24 godziny.

Ekran aplikacji

Ekran główny tvOS składa się z rzędu Top Shelf i siatki aplikacji. Użytkownicy mogą zmieniać układ ikon i tworzyć foldery. tvOS automatycznie zwalnia aplikacje z pamięci przy braku zasobów, dlatego deweloper musi poprawnie obsługiwać UISceneDidDisconnectNotification i przywracać stan przy ponownym uruchomieniu.

Styl Top ShelfFormatKiedy używać
SectionedSekcje z nagłówkami i elementamiSeriale, podcasty, playlisty
InsetJeden duży element z opisemFilm dnia, ekskluzywny
PhotoSiatka obrazów bez podpisówAlbumy zdjęć, galerie
TabZakładki z przełączaniemSport według typu, wiadomości według tematu

SwiftUI dla Apple TV

SwiftUI jest w pełni obsługiwane w tvOS od tvOS 13. Apple zaleca SwiftUI dla wszystkich nowych projektów. Ten sam kod SwiftUI działa na iOS, iPadOS, macOS i tvOS z minimalnymi adaptacjami do Focus Engine. SwiftUI dla tvOS udostępnia modyfikatory .focusable(), .focusSection(), .onPlayPauseCommand i .onExitCommand.

Adaptacja do tvOS

Podczas przenoszenia aplikacji iOS na tvOS należy: zastąpić TabView NavigationView z nawigacją fokusową, zwiększyć rozmiary czcionek (minimum 30pt dla nagłówków, 22pt dla tekstu), dodać marginesy (minimum 40pt od krawędzi — bezpieczny obszar na telewizorach). tvOS nie obsługuje UIAlertController z polem tekstowym, UIWebView i MFMailComposeViewController.

Komponent iOSOdpowiednik tvOSUwaga
UISliderUIProgressView + przyciskiSlider nieobsługiwany
UIPickerViewTabela z fokusemPicker zastąpiony listą
UITextFieldUIAlertController (tylko do odczytu)Wprowadzanie tekstu przez Siri
UIActionSheetUIAlertControllerObsługiwany
UIWebViewNieobsługiwanyUżyj WKWebView
MFMailComposeNieobsługiwanyOtwórz URL mailto:

Zalecenia projektowe

Apple HIG dla tvOS: minimalny rozmiar obszaru dotykowego 60×60 punktów, tekst czytelny z odległości 3 metrów (rozmiar czcionki nie mniejszy niż 22pt dla treści), kontrast tekstu 4.5:1, ciemne tło (jasne tło odbija się na telewizorach OLED), wszystkie elementy dostępne bez skomplikowanych gestów. Rozdzielczość: Apple TV 4K wyświetla 3840×2160 (4K) lub 1920×1080 (HD) przy 60 FPS. Wszystkie obrazy powinny być w @2x (dla 1080p) i @4x (dla 4K).

TVMLKit i aplikacje multimedialne

TVMLKit — framework do tworzenia aplikacji multimedialnych na tvOS z użyciem technologii webowych: JavaScript (TVJS) i TVML (XML specyficzny dla Apple). Aplikacje TVMLKit nie wymagają kompilacji — interfejs jest ładowany z serwera, co pozwala na aktualizacje treści bez przechodzenia przez App Review. Jest używany przez główne usługi przesyłania strumieniowego do karuzel treści.

TVML: struktura szablonów

TVML udostępnia gotowe szablony: CatalogTemplate (katalog z sekcjami), ProductTemplate (strona szczegółów treści), FormTemplate (formularze logowania), LoadingTemplate (wskaźnik ładowania). Szablony są opisane w XML i stylizowane przez atrybuty podobne do CSS. Kod TVJS obsługuje naciśnięcia i wywołuje natywne API.

xml
<!-- CatalogTemplate — katalog filmów na TVML -->
<document>
  <catalogTemplate>
    <banner>
      <title>Nowości filmowe</title>
      <description>Świeże premiery i ekskluzywne treści</description>
    </banner>
    <section>
      <header>
        <title>Popularne</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>Nachalo</title>
        </lockup>
      </items>
    </section>
  </catalogTemplate>
</document>

Szablon TVML CatalogTemplate zawiera baner z tytułem i sekcje z elementami lockup. Każdy lockup to karta filmu z obrazem i tytułem. Focus Engine automatycznie zarządza nawigacją między elementami lockup. Po naciśnięciu program obsługi TVJS otrzymuje zdarzenie select i może wyświetlić stronę szczegółów przez ProductTemplate.

TVJS: obsługa zdarzeń

TVJS to środowisko JavaScript odizolowane od głównej aplikacji. Kod TVJS jest wywoływany podczas ładowania szablonu TVML i obsługi zdarzeń. TVJS ma dostęp do natywnych API przez Appliance i Player do sterowania odtwarzaniem wideo. Apple zaleca używanie TVMLKit tylko dla aplikacji multimedialnych z częstymi aktualizacjami treści. Do gier i aplikacji interaktywnych preferowany jest SwiftUI.

Publikowanie aplikacji tvOS

Publikowanie aplikacji tvOS wymaga subskrypcji Apple Developer Program ($99/rok). Aplikacja jest przesyłana przez App Store Connect jako osobny produkt lub w ramach uniwersalnego pliku binarnego (iOS + tvOS). App Review sprawdza stabilność, zgodność z HIG i limit rozmiaru 4 GB.

Budowanie i dystrybucja

Xcode tworzy cel tvOS z rozszerzeniem .app (pakiet .ipa). Architektura — arm64 (Apple TV używa układów ARM Apple Silicon). tvOS nie obsługuje frameworków z i386 lub x86_64. Aplikacja jest podpisywana certyfikatem Apple Development (testowanie) lub Apple Distribution (publikacja). Możliwa jest dystrybucja przez Volume Purchase Program dla klientów biznesowych.

Wymagania App Review

Specjalne wymagania tvOS: wszystkie elementy interfejsu muszą być dostępne przez Focus Engine bez użycia ekranu dotykowego lub klawiatury. Aplikacje wymagające autoryzacji muszą obsługiwać pojedyncze logowanie (SSO) przez iTunes Store. Treści reklamowe nie mogą przerywać odtwarzania bez zgody użytkownika. Rozmiar przesłanego pliku binarnego nie może przekraczać 4 GB.

WymaganieOpis
Rozmiar aplikacjiNie więcej niż 4 GB, zalecane 500 MB
Rozdzielczość grafiki@2x (1920×1080) i @4x (3840×2160) dla 4K
Nawigacja fokusowaWszystkie elementy dostępne przez Siri Remote
Format wideoH.264, HEVC, Dolby Vision (Profile 5)
AudioDolby Atmos (E-AC-3 JOC) i stereo AAC

Często zadawane pytania

Jakie języki są używane do tworzenia aplikacji tvOS?

Głównym językiem jest Swift z frameworkami SwiftUI i UIKit. Do aplikacji multimedialnych używa się TVMLKit z JavaScript i szablonami TVML ładowanymi z serwera. Objective-C jest obsługiwane dla starszych projektów. Apple zaleca SwiftUI dla wszystkich nowych projektów tvOS.

Czym tvOS różni się od iOS?

tvOS używa Focus Engine zamiast zdarzeń dotykowych, nie ma kamery ani mikrofonu (oprócz Siri Remote), ogranicza rozmiar aplikacji do 4 GB, nie obsługuje trwałej pamięci lokalnej (purgeable) i wymaga Metal do renderowania. Wszystkie aplikacje działają tylko na ARM64.

Jak działa Focus Engine w tvOS?

Focus Engine zarządza ruchem fokusu między elementami interfejsu za pomocą Siri Remote. Deweloper ustawia preferowany fokus przez preferredFocusEnvironments. UIFocusHeading (up, down, left, right) określa kierunek. UIFocusEffect automatycznie dodaje paralaksę i cień do aktywnego elementu.

Jak publikować aplikacje dla Apple TV?

Publikacja wymaga subskrypcji Apple Developer Program ($99/rok). Aplikacja jest przesyłana przez Xcode Organizer lub Transporter do App Store Connect. Moderacja sprawdza: zgodność z Focus Engine, stabilność, brak UIWebView i limit rozmiaru 4 GB.

Czy można używać UIKit w tvOS?

Tak, UIKit jest w pełni obsługiwany w tvOS: UIView, UIViewController, UICollectionView, UITableView. Jednak UIKit jest dostosowany do Focus Engine: UIButton i UIControl otrzymują zdarzenia przez naciśnięcie pilota, a nie dotyk. SwiftUI jest zalecany dla nowych projektów ze względu na automatyczną adaptację fokusu.

Podsumowanie

  • tvOS — system Apple dla dekoderów TV na jądrze XNU ze sterowaniem Focus Engine
  • Focus Engine zastępuje sterowanie dotykowe ruchem fokusu przez Siri Remote z efektami paralaksy
  • TVMLKit — unikalny framework dla aplikacji multimedialnych w JavaScript z szablonami TVML po stronie serwera
  • Top Shelf dostarcza dynamiczną zawartość na ekranie głównym przez TVTopShelfProvider
  • SwiftUI jest w pełni obsługiwane od tvOS 13 z modyfikatorami focusable, focusSection i onPlayPauseCommand
  • Ograniczenia tvOS: rozmiar 4 GB, pamięć purgeable, brak kamery, UIWebView i MFMailCompose
  • Publikacja wymaga Apple Developer Program, grafiki @2x/@4x, formatu HEVC i Dolby Atmos

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również