tvOS: розробка під Apple TV з Focus Engine

Автор: IT Sectr Опубліковано: 2026-02-07 Час читання: 11 хв

tvOS — операційна система Apple для Apple TV, вперше випущена в 2015 році разом з Apple TV 4 покоління. Розробка додатків для tvOS ведеться на Swift з використанням SwiftUI та TVMLKit. Ключова відмінність від iOS — керування фокусом через пульт Siri Remote замість дотиків. За даними Apple, tvOS встановлено на більш ніж 100 млн активних пристроїв по всьому світу.

Головне

  • tvOS — ОС Apple для телевізійних приставок на XNU-ядрі з Focus Engine замість touch
  • Focus Engine — система керування фокусом між елементами через Siri Remote
  • SwiftUI та TVMLKit — два підходи до розробки: нативний та JavaScript-шаблони
  • Top Shelf — динамічний контент на головному екрані Apple TV
  • Розмір додатку суворо обмежений 4 ГБ, рекомендовано не більше 500 МБ

Що таке tvOS?

tvOS — операційна система Apple для телевізійних приставок Apple TV, заснована на тому ж XNU-ядрі Darwin, що й iOS. Вперше випущена 30 жовтня 2015 року з Apple TV 4-го покоління. tvOS замінила застарілу Apple TV Software (на базі iOS, без App Store та SDK). Система оптимізована для роботи на телевізорі з роздільною здатністю до 4K HDR (Dolby Vision) та звуком Dolby Atmos.

За даними Apple (WWDC 2025), tvOS встановлена на Apple TV HD (2015), Apple TV 4K (2017, 2021, 2022) та вбудована в деякі моделі Smart TV через AirPlay. Apple TV використовує чипи A8 (HD), A10X Fusion (4K 1-го покоління), A12 Bionic (4K 2-го) та A15 Bionic (4K 3-го). Всі моделі підтримують tvOS 17. tvOS не має камери, мікрофона (крім пульта), сенсорного екрану та GPS.

Ключова особливість tvOS — Focus Engine, що замінює touch-управління на фокусну навігацію. Користувач переміщує виділення між UI-елементами за допомогою пульта Siri Remote. Розробники створюють додатки на Swift/SwiftUI (нативні) або на JavaScript/TVML (медіа-додатки Netflix, Hulu).

Історія версій tvOS

tvOS 9 (2015) — перша версія з SDK та App Store. tvOS 10 (2016) — єдиний вхід (SSO) для кабельних підписок. tvOS 11 (2017) — підтримка Amazon Prime Video та автоматичний режим. tvOS 12 (2018) — Dolby Atmos. tvOS 13 (2019) — багатокористувацький режим. tvOS 17 (2023) — FaceTime, VPN, звукові профілі через HDMI.

Версія tvOSРікКлючове нововведення
tvOS 92015App Store, SDK, Siri Remote
tvOS 102016Єдиний вхід (SSO), Live Tune-In
tvOS 112017Amazon Prime, автоматичний режим
tvOS 122018Dolby Atmos, пароль з iPhone
tvOS 132019Multi-user, Control Center на TV
tvOS 172023FaceTime, VPN, Find My Siri Remote

Архітектура tvOS та відмінність від iOS

Архітектура tvOS базується на тому ж стеку, що й iOS: XNU-ядро, системні служби Core Services, медіа-рівень Media та користувацький шар Cocoa Touch. Однак є суттєві відмінності, пов'язані зі специфікою телевізійної платформи.

Апаратні обмеження

Apple TV 4K 3-го покоління використовує A15 Bionic з 6 ядрами CPU (2 продуктивних, 4 енергоефективних) та 5-ядерним GPU. ОЗП — 4 ГБ (внутрішнє сховище SSD від 64 ГБ). Система не має постійного локального сховища в класичному сенсі: всі дані додатків можуть бути видалені tvOS при нестачі місця (purgeable). Розробник повинен використовувати iCloud Key-Value Storage або CloudKit для зберігання стану.

TVMLKit та TVJS

TVMLKit — унікальний для tvOS фреймворк, що дозволяє створювати інтерфейси на JavaScript та TVML (Apple-специфічний XML-подібний мову). TVMLKit завантажує JSON/XML з сервера та відображає нативні UI-компоненти. Це основна технологія для стрімінгових сервісів: Netflix, Hulu, Amazon Prime Video використовують TVMLKit. TVJS — JavaScript-середовище, що виконується в ізольованому контексті.

Відсутність постійного сховища

tvOS автоматично керує дисковим простором: при нестачі місця система може видалити кеш, завантажені ресурси та навіть сам додаток (із збереженням іконки). При повторному відкритті додаток повинен відновити стан. iCloud NSUbiquitousKeyValueStore — єдине гарантоване постійне сховище для налаштувань (до 1 МБ на додаток).

swift
import Foundation

// // Збереження та відновлення стану в tvOS
final class StateManager {

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

    // Зберігаємо прогрес перегляду
    func saveProgress<T: Codable>(_ value: T, for key: String) {
        if let data = try? coder.encode(value) {
            store.set(data, for: key)
            store.synchronize()
        }
    }

    // Відновлюємо стан після видалення кешу
    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)
    }

    // Обробка сповіщення про зміну на іншому пристрої
    init() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(ubiquitousKeyValueStoreDidChange),
            name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
            object: store
        )
    }

    @objc
    private func ubiquitousKeyValueStoreDidChange(_ notification: Notification) {
        print("Дані змінено на іншому пристрої")
    }
}

Менеджер StateManager використовує NSUbiquitousKeyValueStore для збереження стану додатку на tvOS. Оскільки локальне сховище може бути очищене системою, тільки iCloud гарантує збереження даних. store.synchronize() негайно відправляє дані на сервер, а didChangeExternallyNotification сповіщає додаток про зміни з інших пристроїв користувача.

Focus Engine: навігація та фокус

Focus Engine — ключовий механізм tvOS, що замінює touch-події на фокусну навігацію. Користувач переміщує виділення між UI-елементами за допомогою Siri Remote (тач-поверхня або кнопки). Система автоматично обчислює наступний елемент фокусу на основі відстані та напрямку руху.

UIFocusEnvironment та ієрархія фокусу

Кожен UI-елемент, здатний отримувати фокус, реалізує протокол UIFocusEnvironment. UIKit автоматично визначає порядок навігації на основі геометрії елементів. Розробник може перевизначити бажаний фокус через preferredFocusEnvironments, вказати масив дочірніх focusEnvironment та керувати переміщенням через UIFocusHeading (up, down, left, right). UIFocusGuide дозволяє задати кастомний маршрут для нетривіальних макетів.

UIFocusEffect та паралакс

tvOS автоматично додає UIFocusEffect до сфокусованого елементу: тінь, підсвітка та паралакс-ефект (зміщення при нахилі пульта). Розробник може вимкнути ефект через focusedValue або кастомізувати через UIFocusEffect.transform. В SwiftUI паралакс додається модифікатором .hoverEffect(.highlight).

swift
import SwiftUI

// // tvOS-компонент з кастомним фокусом
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 {
            // Обробка кнопки Play/Pause на пульті
            startPlayback()
        }
        .focusable()
        .focusEffect { phase in
            // Кастомний ефект фокусу
            phase == .active ?
                AnyView(self.scaleEffect(1.08)) :
                AnyView(self.scaleEffect(1.0))
        }
    }

    private func startPlayback() {
        print("Відтворення: \(movie.title)")
    }
}

// // Головний екран з сіткою фільмів
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() // Группировка для навигации
    }
}

MovieCardView демонструє роботу Focus Engine в SwiftUI: модифікатор .focusable() робить елемент доступним для фокусу, .onHover відстежує зміну стану, .focusEffect дозволяє кастомно анімувати виділення. .onPlayPauseCommand обробляє натискання кнопки Play/Pause на Siri Remote. focusSection групує сітку для циклічної навігації.

Siri Remote: жести та кнопки

Siri Remote другого покоління (2021) має тач-поверхню, 5 кнопок та мікрофон. tvOS підтримує жести: свайпи (навігація), tap (вибір), double-tap (центрування), pinch-zoom (зображення), довге натискання (контекстне меню). UIPress з типом .select, .playPause, .menu, .upArrow, .downArrow, .leftArrow, .rightArrow — визначені типи натискань. Мікрофон пульта використовується для Siri та голосового пошуку.

Top Shelf та екран додатків

Top Shelf — область на головному екрані Apple TV, що відображає динамічний контент додатку, коли він знаходиться у верхньому ряду. В tvOS 17 Top Shelf підтримує до 8 віджетів з кастомним фоном та інтерактивними елементами. Розробник реалізує TVTopShelfProvider для надання контенту.

Види Top Shelf

Доступні три стилі Top Shelf: Sectioned — категоризований список (серіали за жанрами), Inset — центральний елемент з детальним описом (рекомендований фільм), Photo — сітка зображень (фотоальбоми). Система оновлює Top Shelf в фоні через BGTaskScheduler, аналогічно watchOS. Провайдер повинен повертати контент швидко — tvOS кешує дані на 24 години.

Екран додатків

Головний екран tvOS складається з рядка Top Shelf та сітки додатків. Користувач може переставляти іконки, створювати папки. tvOS автоматично вивантажує додатки з пам'яті при нестачі ресурсів, тому розробник повинен коректно обробляти UISceneDidDisconnectNotification та відновлювати стан при повторному запуску.

Стиль Top ShelfФорматКоли використовувати
SectionedСекції з заголовками та елементамиСеріали, подкасти, плейлисти
InsetОдин великий елемент з описомГоловний фільм дня, ексклюзив
PhotoСітка зображень без підписівФотоальбоми, галереї
TabВкладки з перемиканнямСпорт за видами, новини за темами

SwiftUI для Apple TV

SwiftUI повністю підтримується в tvOS починаючи з tvOS 13. Apple рекомендує SwiftUI для всіх нових проектів. Той же код на SwiftUI працює на iOS, iPadOS, macOS та tvOS з мінімальними адаптаціями під Focus Engine. SwiftUI для tvOS надає модифікатори .focusable(), .focusSection(), .onPlayPauseCommand та .onExitCommand.

Адаптація під tvOS

При портуванні iOS-додатку на tvOS необхідно: замінити TabView на NavigationView з focus-навігацією, збільшити розмір шрифтів (мінімум 30pt для заголовків, 22pt для тексту), додати відступи (мінімум 40pt від країв — safe area на телевізорах). tvOS не підтримує UIAlertController з текстовим полем, UIWebView та MFMailComposeViewController.

Компонент iOSАналог в tvOSПримітка
UISliderUIProgressView + кнопкиSlider не підтримується
UIPickerViewТаблиця з фокусомPicker замінено списком
UITextFieldUIAlertController (тільки read-only)Введення тексту через Siri
UIActionSheetUIAlertControllerПідтримується
UIWebViewНе підтримуєтьсяВикористовувати WKWebView
MFMailComposeНе підтримуєтьсяВідкрити mailto: URL

Рекомендації з дизайну

Apple HIG для tvOS: мінімальний розмір touch-області 60×60 точок, текст читаємо з відстані 3 метри (кегль не менше 22pt для body), контраст тексту 4.5:1, темний фон (світлий фон бликує на OLED-телевізорах), всі елементи доступні без складних жестів. Роздільна здатність: Apple TV 4K виводить 3840×2160 (4K) або 1920×1080 (HD) при 60 FPS. Всі зображення повинні бути в @2x (для 1080p) та @4x (для 4K).

TVMLKit та медіадодатки

TVMLKit — фреймворк для створення медіадодатків на tvOS з використанням веб-технологій: JavaScript (TVJS) та TVML (Apple-специфічний XML). Додатки на TVMLKit не потребують компіляції — інтерфейс завантажується з сервера, що дозволяє оновлювати контент без проходження App Review. Використовується великими стрімінговими сервісами для каруселей контенту.

TVML: структура шаблонів

TVML надає готові шаблони: CatalogTemplate (каталог з секціями), ProductTemplate (детальна сторінка контенту), FormTemplate (форми входу), LoadingTemplate (індикатор завантаження). Шаблони описуються в XML та стилізуються через CSS-подібні атрибути. TVJS-код обробляє натискання та викликає нативні API.

xml
<!-- CatalogTemplate — каталог фильмов на TVML -->
<document>
  <catalogTemplate>
    <banner>
      <title>Новинки кино</title>
      <description>Свежие премьеры и эксклюзивы</description>
    </banner>
    <section>
      <header>
        <title>Популярное</title>
      </header>
      <items>
        <lockup>
          <img src="https://cdn.example.com/movie1.jpg" width=300 height=450/>
          <title>Интерстеллар</title>
        </lockup>
        <lockup>
          <img src="https://cdn.example.com/movie2.jpg" width=300 height=450/>
          <title>Начало</title>
        </lockup>
      </items>
    </section>
  </catalogTemplate>
</document>

TVML-шаблон CatalogTemplate містить banner з заголовком та секції з lockup-елементами. Кожен lockup — картка фільму із зображенням та назвою. Focus Engine автоматично керує навігацією по lockup-елементах. При натисканні TVJS-обробник отримує подію select та може показати детальну сторінку через ProductTemplate.

TVJS: обробка подій

TVJS — середовище JavaScript, ізольоване від основного додатку. Код на TVJS викликається при завантаженні TVML-шаблону та обробці подій. TVJS має доступ до нативних API через Appliance та Player для керування відтворенням відео. Apple рекомендує використовувати TVMLKit тільки для медіа-додатків з частим оновленням контенту. Для ігор та інтерактивних додатків кращий SwiftUI.

Публікація tvOS-додатків

Публікація tvOS-додатку потребує підписки Apple Developer Program ($99/рік). Додаток завантажується через App Store Connect як окремий продукт або у складі універсального бінарника (iOS + tvOS). App Review перевіряє стабільність, відповідність HIG та обмеження розміру 4 ГБ.

Збірка та дистрибуція

Xcode створює tvOS-таргет з розширенням .app (пакет .ipa). Архітектура — arm64 (Apple TV використовує ARM-чипи Apple Silicon). tvOS не підтримує фреймворки з i386 або x86_64. Додаток підписується сертифікатом Apple Development (тестування) або Apple Distribution (публікація). Можлива дистрибуція через Volume Purchase Program для бізнес-клієнтів.

Вимоги App Review

Особливі вимоги tvOS: всі елементи інтерфейсу повинні бути доступні через Focus Engine без використання сенсорного екрану або клавіатури. Додатки, що потребують авторизації, повинні підтримувати єдиний вхід (SSO) через iTunes Store. Рекламний контент не може переривати відтворення без згоди користувача. Розмір завантажуваного бінарника не більше 4 ГБ.

ВимогаОпис
Розмір додаткуНе більше 4 ГБ, рекомендовано 500 МБ
Роздільна здатність графіки@2x (1920×1080) та @4x (3840×2160) для 4K
Focus навігаціяВсі елементи доступні через Siri Remote
ВідеоформатH.264, HEVC, Dolby Vision (Profile 5)
ЗвукDolby Atmos (E-AC-3 JOC) та стерео AAC

Часто задавані питання

Які мови використовуються для розробки під tvOS?

Основна мова — Swift з фреймворками SwiftUI та UIKit. Для медіадодатків використовується TVMLKit з JavaScript та TVML-шаблонами, що завантажуються з сервера. Objective-C підтримується для легасі-проектів. Apple рекомендує SwiftUI для всіх нових проектів під tvOS.

Чим tvOS відрізняється від iOS?

tvOS використовує Focus Engine замість touch-подій, не має камери та мікрофона (крім Siri Remote), обмежує розмір додатку 4 ГБ, не підтримує постійне локальне сховище (purgeable) та потребує використання Metal для рендерингу. Всі додатки працюють тільки на ARM64.

Як працює Focus Engine в tvOS?

Focus Engine керує переміщенням фокусу між UI-елементами за допомогою Siri Remote. Розробник задає бажаний фокус через preferredFocusEnvironments. UIFocusHeading (up, down, left, right) визначає напрямок. UIFocusEffect автоматично додає паралакс та тінь до активного елементу.

Як публікувати додатки для Apple TV?

Публікація потребує підписки Apple Developer Program ($99/рік). Додаток завантажується через Xcode Organizer або Transporter в App Store Connect. Модерація перевіряє: сумісність з Focus Engine, стабільність, відсутність UIWebView та обмеження розміру 4 ГБ.

Чи можна використовувати UIKit в tvOS?

Так, UIKit повністю підтримується в tvOS: UIView, UIViewController, UICollectionView, UITableView. Однак UIKit адаптований під Focus Engine: UIButton та UIControl отримують подію через натискання пульта, а не touch. SwiftUI рекомендується для нових проектів через автоматичну адаптацію під фокус.

Підсумки

  • tvOS — ОС Apple для телевізійних приставок на XNU-ядрі з керуванням через Focus Engine
  • Focus Engine замінює touch-управління на переміщення фокусу через Siri Remote з паралакс-ефектами
  • TVMLKit — унікальний фреймворк для медіадодатків на JavaScript з серверними шаблонами TVML
  • Top Shelf надає динамічний контент на головному екрані через TVTopShelfProvider
  • SwiftUI повністю підтримується з tvOS 13 з модифікаторами focusable, focusSection та onPlayPauseCommand
  • Обмеження tvOS: розмір 4 ГБ, purgeable-сховище, відсутність камери, UIWebView та MFMailCompose
  • Публікація потребує Apple Developer Program, графіка @2x/@4x, формат HEVC та Dolby Atmos

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також