tvOS: dezvoltare pentru Apple TV cu Focus Engine

Autor: IT Sectr Publicat: 2026-02-07 Timp de citire: 11 min

tvOS — sistemul de operare Apple pentru Apple TV, lansat pentru prima dată în 2015 împreună cu Apple TV de generația a 4-a. Dezvoltarea aplicațiilor pentru tvOS se face în Swift folosind SwiftUI și TVMLKit. Diferența cheie față de iOS este controlul focalizării prin Siri Remote în loc de atingere. Potrivit Apple, tvOS este instalat pe peste 100 de milioane de dispozitive active în întreaga lume.

Puncte cheie

  • tvOS — sistemul Apple pentru decodificatoare TV pe nucleul XNU cu Focus Engine în loc de touch
  • Focus Engine — sistem de gestionare a focalizării între elemente prin Siri Remote
  • SwiftUI și TVMLKit — două abordări de dezvoltare: nativă și șabloane JavaScript
  • Top Shelf — conținut dinamic pe ecranul principal Apple TV
  • Dimensiunea aplicației strict limitată la 4 GB, recomandat nu mai mult de 500 MB

Ce este tvOS?

tvOS — sistemul de operare Apple pentru decodificatoarele Apple TV, bazat pe același nucleu Darwin XNU ca iOS. Lansat pentru prima dată pe 30 octombrie 2015 cu Apple TV de generația a 4-a. tvOS a înlocuit vechiul Apple TV Software (bazat pe iOS, fără App Store și SDK). Sistemul este optimizat pentru funcționarea pe TV cu rezoluție de până la 4K HDR (Dolby Vision) și sunet Dolby Atmos.

Potrivit Apple (WWDC 2025), tvOS este instalat pe Apple TV HD (2015), Apple TV 4K (2017, 2021, 2022) și integrat în unele modele Smart TV prin AirPlay. Apple TV folosește cipurile A8 (HD), A10X Fusion (generația 1 4K), A12 Bionic (generația 2 4K) și A15 Bionic (generația 3 4K). Toate modelele suportă tvOS 17. tvOS nu are cameră, microfon (cu excepția telecomenzii), ecran tactil sau GPS.

Caracteristica cheie a tvOS este Focus Engine, care înlocuiește controlul tactil cu navigarea prin focalizare. Utilizatorul mută selecția între elementele UI folosind Siri Remote. Dezvoltatorii creează aplicații în Swift/SwiftUI (native) sau JavaScript/TVML (aplicații media precum Netflix, Hulu).

Istoricul versiunilor tvOS

tvOS 9 (2015) — prima versiune cu SDK și App Store. tvOS 10 (2016) — autentificare unică (SSO) pentru abonamentele cablu. tvOS 11 (2017) — suport Amazon Prime Video și mod automat. tvOS 12 (2018) — Dolby Atmos. tvOS 13 (2019) — mod multi-utilizator. tvOS 17 (2023) — FaceTime, VPN, profiluri audio prin HDMI.

Versiune tvOSAnInovație cheie
tvOS 92015App Store, SDK, Siri Remote
tvOS 102016Autentificare unică (SSO), Live Tune-In
tvOS 112017Amazon Prime, mod automat
tvOS 122018Dolby Atmos, parolă cu iPhone
tvOS 132019Multi-utilizator, Centru de Control pe TV
tvOS 172023FaceTime, VPN, Găsește Siri Remote

Arhitectura tvOS și diferențele față de iOS

Arhitectura tvOS se bazează pe același stack ca iOS: nucleul XNU, serviciile de sistem Core Services, stratul Media și stratul utilizator Cocoa Touch. Cu toate acestea, există diferențe semnificative legate de specificul platformei TV.

Limitări hardware

Apple TV 4K de generația a 3-a folosește A15 Bionic cu 6 nuclee CPU (2 performanță, 4 eficiență) și un GPU cu 5 nuclee. RAM — 4 GB (stocare SSD internă de la 64 GB). Sistemul nu are stocare locală persistentă în sensul clasic: toate datele aplicațiilor pot fi șterse de tvOS când spațiul este insuficient (purgeable). Dezvoltatorul trebuie să folosească iCloud Key-Value Storage sau CloudKit pentru păstrarea stării.

TVMLKit și TVJS

TVMLKit — un framework unic pentru tvOS care permite crearea de interfețe în JavaScript și TVML (un limbaj asemănător XML specific Apple). TVMLKit încarcă JSON/XML de pe server și afișează componente UI native. Aceasta este tehnologia principală pentru serviciile de streaming: Netflix, Hulu, Amazon Prime Video folosesc TVMLKit. TVJS — un mediu JavaScript care rulează într-un context izolat.

Lipsa stocării persistente

tvOS gestionează automat spațiul pe disc: când spațiul este insuficient, sistemul poate șterge cache-ul, resursele descărcate și chiar aplicația însăși (păstrând pictograma). La redeschidere, aplicația trebuie să își restabilească starea. iCloud NSUbiquitousKeyValueStore este singura stocare persistentă garantată pentru setări (până la 1 MB per aplicație).

swift
import Foundation

// // Păstrarea și restaurarea stării în tvOS
final class StateManager {

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

    // Se salvează progresul vizionării
    func saveProgress<T: Codable>(_ value: T, for key: String) {
        if let data = try? coder.encode(value) {
            store.set(data, for: key)
            store.synchronize()
        }
    }

    // Se restaurează starea după ștergerea cache-ului
    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)
    }

    // Gestionarea notificării de modificare pe alt dispozitiv
    init() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(ubiquitousKeyValueStoreDidChange),
            name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
            object: store
        )
    }

    @objc
    private func ubiquitousKeyValueStoreDidChange(_ notification: Notification) {
        print("Date modificate pe alt dispozitiv")
    }
}

Managerul StateManager folosește NSUbiquitousKeyValueStore pentru a salva starea aplicației pe tvOS. Deoarece stocarea locală poate fi curățată de sistem, doar iCloud garantează persistența datelor. store.synchronize() trimite imediat datele pe server, iar didChangeExternallyNotification notifică aplicația despre modificări de pe alte dispozitive ale utilizatorului.

Focus Engine: navigare și focalizare

Focus Engine — mecanismul cheie al tvOS care înlocuiește evenimentele tactile cu navigarea prin focalizare. Utilizatorul mută selecția între elementele UI folosind Siri Remote (suprafață tactilă sau butoane). Sistemul calculează automat următorul element de focalizare pe baza distanței și direcției de mișcare.

UIFocusEnvironment și ierarhia focalizării

Fiecare element UI capabil să primească focalizare implementează protocolul UIFocusEnvironment. UIKit determină automat ordinea de navigare pe baza geometriei elementelor. Dezvoltatorul poate suprascrie focalizarea preferată prin preferredFocusEnvironments, poate specifica un array de focusEnvironment copil și poate controla mișcarea prin UIFocusHeading (up, down, left, right). UIFocusGuide permite setarea de rute personalizate pentru layout-uri netriviale.

UIFocusEffect și paralaxă

tvOS adaugă automat UIFocusEffect elementului focalizat: umbră, evidențiere și efect de paralaxă (deplasare la înclinarea telecomenzii). Dezvoltatorul poate dezactiva efectul prin focusedValue sau îl poate personaliza prin UIFocusEffect.transform. În SwiftUI, paralaxa se adaugă cu modificatorul .hoverEffect(.highlight).

swift
import SwiftUI

// // Component tvOS cu focalizare personalizată
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 {
            // Gestionarea butonului Play/Pause pe telecomandă
            startPlayback()
        }
        .focusable()
        .focusEffect { phase in
            // Efect de focalizare personalizat
            phase == .active ?
                AnyView(self.scaleEffect(1.08)) :
                AnyView(self.scaleEffect(1.0))
        }
    }

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

// // Ecran principal cu grilă de filme
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() // Grupare pentru navigare
    }
}

MovieCardView demonstrează Focus Engine în SwiftUI: modificatorul .focusable() face elementul focalizabil, .onHover urmărește schimbările de stare, .focusEffect permite animația personalizată a focalizării. .onPlayPauseCommand gestionează apăsarea butonului Play/Pause pe Siri Remote. focusSection grupează o grilă pentru navigare ciclică.

Siri Remote: gesturi și butoane

Siri Remote de a doua generație (2021) are o suprafață tactilă, 5 butoane și un microfon. tvOS suportă gesturi: glisări (navigare), atingere (selectare), atingere dublă (centrare), ciupire-zoom (imagini), apăsare lungă (meniu contextual). UIPress cu tipurile .select, .playPause, .menu, .upArrow, .downArrow, .leftArrow, .rightArrow — tipuri de apăsare predefinite. Microfonul telecomenzii este folosit pentru Siri și căutare vocală.

Top Shelf și ecranul aplicațiilor

Top Shelf este o zonă pe ecranul principal Apple TV care afișează conținut dinamic al aplicației când aceasta se află în rândul superior. În tvOS 17, Top Shelf suportă până la 8 widget-uri cu fundaluri personalizate și elemente interactive. Dezvoltatorul implementează TVTopShelfProvider pentru a furniza conținut.

Stiluri Top Shelf

Sunt disponibile trei stiluri Top Shelf: Sectioned — listă categorisită (seriale după gen), Inset — element central cu descriere detaliată (film recomandat), Photo — grilă de imagini (albume foto). Sistemul actualizează Top Shelf în fundal prin BGTaskScheduler, similar cu watchOS. Furnizorul trebuie să returneze conținutul rapid — tvOS memorează datele în cache timp de 24 de ore.

Ecranul aplicațiilor

Ecranul principal tvOS constă dintr-un rând Top Shelf și o grilă de aplicații. Utilizatorii pot rearanja pictogramele și pot crea dosare. tvOS descarcă automat aplicațiile din memorie când resursele sunt scăzute, deci dezvoltatorul trebuie să gestioneze corect UISceneDidDisconnectNotification și să restabilească starea la repornire.

Stil Top ShelfFormatCând să folosiți
SectionedSecțiuni cu antete și elementeSeriale, podcasturi, liste de redare
InsetUn element mare cu descriereFilmul zilei, exclusiv
PhotoGrilă de imagini fără legendeAlbume foto, galerii
TabFile cu comutareSport după tip, știri după subiect

SwiftUI pentru Apple TV

SwiftUI este complet suportat în tvOS începând cu tvOS 13. Apple recomandă SwiftUI pentru toate proiectele noi. Același cod SwiftUI funcționează pe iOS, iPadOS, macOS și tvOS cu adaptări minime pentru Focus Engine. SwiftUI pentru tvOS oferă modificatorii .focusable(), .focusSection(), .onPlayPauseCommand și .onExitCommand.

Adaptarea la tvOS

La portarea unei aplicații iOS pe tvOS, trebuie să: înlocuiți TabView cu NavigationView cu navigare prin focalizare, măriți dimensiunile fonturilor (minimum 30pt pentru titluri, 22pt pentru text), adăugați margini (minimum 40pt de la margini — zona sigură pe televizoare). tvOS nu suportă UIAlertController cu câmp de text, UIWebView și MFMailComposeViewController.

Component iOSEchivalent tvOSNotă
UISliderUIProgressView + butoaneSlider neacceptat
UIPickerViewTabel cu focalizarePicker înlocuit cu listă
UITextFieldUIAlertController (doar citire)Introducere text prin Siri
UIActionSheetUIAlertControllerSuportat
UIWebViewNeacceptatUtilizați WKWebView
MFMailComposeNeacceptatDeschideți URL mailto:

Recomandări de design

Apple HIG pentru tvOS: dimensiunea minimă a zonei tactile 60×60 de puncte, text lizibil de la 3 metri (dimensiune font nu mai mică de 22pt pentru corp), contrast text 4.5:1, fundal închis (fundalul deschis creează reflexii pe televizoarele OLED), toate elementele accesibile fără gesturi complexe. Rezoluție: Apple TV 4K produce 3840×2160 (4K) sau 1920×1080 (HD) la 60 FPS. Toate imaginile trebuie să fie @2x (pentru 1080p) și @4x (pentru 4K).

TVMLKit și aplicații media

TVMLKit — un framework pentru crearea aplicațiilor media pe tvOS folosind tehnologii web: JavaScript (TVJS) și TVML (XML specific Apple). Aplicațiile TVMLKit nu necesită compilare — interfața se încarcă de pe server, permițând actualizări de conținut fără a trece prin App Review. Este folosit de marile servicii de streaming pentru carusele de conținut.

TVML: structura șabloanelor

TVML oferă șabloane gata făcute: CatalogTemplate (catalog cu secțiuni), ProductTemplate (pagina de detalii a conținutului), FormTemplate (formulare de autentificare), LoadingTemplate (indicator de încărcare). Șabloanele sunt descrise în XML și stilizate prin atribute asemănătoare CSS. Codul TVJS gestionează apăsările și apelează API-urile native.

xml
<!-- CatalogTemplate — catalog de filme pe TVML -->
<document>
  <catalogTemplate>
    <banner>
      <title>Noutăți de cinema</title>
      <description>Premiere proaspete și exclusivități</description>
    </banner>
    <section>
      <header>
        <title>Populare</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>

Șablonul TVML CatalogTemplate conține un banner cu titlu și secțiuni cu elemente lockup. Fiecare lockup este o carte de film cu imagine și titlu. Focus Engine gestionează automat navigarea între elementele lockup. La apăsare, handlerul TVJS primește evenimentul select și poate afișa o pagină de detalii prin ProductTemplate.

TVJS: gestionarea evenimentelor

TVJS este un mediu JavaScript izolat de aplicația principală. Codul TVJS este apelat la încărcarea unui șablon TVML și la gestionarea evenimentelor. TVJS are acces la API-urile native prin Appliance și Player pentru controlul redării video. Apple recomandă utilizarea TVMLKit numai pentru aplicațiile media cu actualizări frecvente de conținut. Pentru jocuri și aplicații interactive, SwiftUI este preferat.

Publicarea aplicațiilor tvOS

Publicarea unei aplicații tvOS necesită un abonament Apple Developer Program ($99/an). Aplicația este încărcată prin App Store Connect ca produs separat sau ca parte a unui binar universal (iOS + tvOS). App Review verifică stabilitatea, conformitatea cu HIG și limita de dimensiune de 4 GB.

Construire și distribuire

Xcode creează o țintă tvOS cu extensia .app (pachet .ipa). Arhitectură — arm64 (Apple TV folosește cipuri ARM Apple Silicon). tvOS nu suportă framework-uri cu i386 sau x86_64. Aplicația este semnată cu un certificat Apple Development (testare) sau Apple Distribution (publicare). Distribuirea prin Volume Purchase Program pentru clienții business este posibilă.

Cerințe App Review

Cerințe speciale tvOS: toate elementele interfeței trebuie să fie accesibile prin Focus Engine fără a utiliza ecran tactil sau tastatură. Aplicațiile care necesită autorizare trebuie să suporte autentificarea unică (SSO) prin iTunes Store. Conținutul publicitar nu poate întrerupe redarea fără consimțământul utilizatorului. Dimensiunea binarului încărcat nu trebuie să depășească 4 GB.

CerințăDescriere
Dimensiune aplicațieNu mai mult de 4 GB, recomandat 500 MB
Rezoluție grafică@2x (1920×1080) și @4x (3840×2160) pentru 4K
Navigare prin focalizareToate elementele accesibile prin Siri Remote
Format videoH.264, HEVC, Dolby Vision (Profile 5)
AudioDolby Atmos (E-AC-3 JOC) și stereo AAC

Întrebări frecvente

Ce limbaje sunt folosite pentru dezvoltarea tvOS?

Limbajul principal este Swift cu framework-urile SwiftUI și UIKit. Pentru aplicațiile media, se folosește TVMLKit cu JavaScript și șabloane TVML încărcate de pe server. Objective-C este suportat pentru proiecte moștenite. Apple recomandă SwiftUI pentru toate proiectele tvOS noi.

Cu ce se deosebește tvOS de iOS?

tvOS folosește Focus Engine în loc de evenimente tactile, nu are cameră sau microfon (cu excepția Siri Remote), limitează dimensiunea aplicației la 4 GB, nu suportă stocare locală persistentă (purgeable) și necesită Metal pentru randare. Toate aplicațiile funcționează doar pe ARM64.

Cum funcționează Focus Engine în tvOS?

Focus Engine gestionează mișcarea focalizării între elementele UI folosind Siri Remote. Dezvoltatorul setează focalizarea preferată prin preferredFocusEnvironments. UIFocusHeading (up, down, left, right) determină direcția. UIFocusEffect adaugă automat paralaxă și umbră elementului activ.

Cum să publicați aplicații pentru Apple TV?

Publicarea necesită un abonament Apple Developer Program ($99/an). Aplicația este încărcată prin Xcode Organizer sau Transporter în App Store Connect. Moderarea verifică: compatibilitatea cu Focus Engine, stabilitatea, absența UIWebView și limita de dimensiune de 4 GB.

Se poate folosi UIKit în tvOS?

Da, UIKit este complet suportat în tvOS: UIView, UIViewController, UICollectionView, UITableView. Totuși, UIKit este adaptat pentru Focus Engine: UIButton și UIControl primesc evenimente prin apăsarea telecomenzii, nu prin atingere. SwiftUI este recomandat pentru proiecte noi datorită adaptării automate la focalizare.

Rezumat

  • tvOS — sistemul Apple pentru decodificatoare TV pe nucleul XNU cu control Focus Engine
  • Focus Engine înlocuiește controlul tactil cu mișcarea focalizării prin Siri Remote cu efecte de paralaxă
  • TVMLKit — un framework unic pentru aplicații media în JavaScript cu șabloane TVML pe partea de server
  • Top Shelf oferă conținut dinamic pe ecranul principal prin TVTopShelfProvider
  • SwiftUI este complet suportat din tvOS 13 cu modificatorii focusable, focusSection și onPlayPauseCommand
  • Limitări tvOS: dimensiune 4 GB, stocare purgeable, fără cameră, UIWebView sau MFMailCompose
  • Publicare necesită Apple Developer Program, grafică @2x/@4x, format HEVC și Dolby Atmos

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și