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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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