tvOS — операционная система Apple для Apple TV, впервые выпущенная в 2015 году вместе с Apple TV 4 поколения. Разработка приложений под tvOS ведётся на Swift с использованием SwiftUI и TVMLKit. Ключевое отличие от iOS — управление фокусом через пульт Siri Remote вместо касаний. По данным Apple, tvOS установлена на более чем 100 млн активных устройств по всему миру.
Главное
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 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 9 | 2015 | App Store, SDK, Siri Remote |
| tvOS 10 | 2016 | Единый вход (SSO), Live Tune-In |
| tvOS 11 | 2017 | Amazon Prime, автоматический режим |
| tvOS 12 | 2018 | Dolby Atmos, пароль с iPhone |
| tvOS 13 | 2019 | Multi-user, Control Center на TV |
| tvOS 17 | 2023 | FaceTime, VPN, Find My Siri Remote |
Архитектура 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 — уникальный для tvOS фреймворк, позволяющий создавать интерфейсы на JavaScript и TVML (Apple-специфичный XML-подобный язык). TVMLKit загружает JSON/XML с сервера и отображает нативные UI-компоненты. Это основная технология для стриминговых сервисов: Netflix, Hulu, Amazon Prime Video используют TVMLKit. TVJS — JavaScript-среда, выполняющаяся в изолированном контексте.
tvOS автоматически управляет дисковым пространством: при нехватке места система может удалить кеш, загруженные ресурсы и даже само приложение (с сохранением иконки). При повторном открытии приложение должно восстановить состояние. iCloud NSUbiquitousKeyValueStore — единственное гарантированное постоянное хранилище для настроек (до 1 МБ на приложение).
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 — ключевой механизм tvOS, заменяющий touch-события на фокусную навигацию. Пользователь перемещает выделение между UI-элементами с помощью Siri Remote (тач-поверхность или кнопки). Система автоматически вычисляет следующий элемент фокуса на основе расстояния и направления движения.
Каждый UI-элемент, способный получать фокус, реализует протокол UIFocusEnvironment. UIKit автоматически определяет порядок навигации на основе геометрии элементов. Разработчик может переопределить предпочтительный фокус через preferredFocusEnvironments, указать массив дочерних focusEnvironment и управлять перемещением через UIFocusHeading (up, down, left, right). UIFocusGuide позволяет задать кастомный маршрут для нетривиальных макетов.
tvOS автоматически добавляет UIFocusEffect к сфокусированному элементу: тень, подсветка и параллакс-эффект (смещение при наклоне пульта). Разработчик может отключить эффект через focusedValue или кастомизировать через UIFocusEffect.transform. В SwiftUI параллакс добавляется модификатором .hoverEffect(.highlight).
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 второго поколения (2021) имеет тач-поверхность, 5 кнопок и микрофон. tvOS поддерживает жесты: свайпы (навигация), tap (выбор), double-tap (центрирование), pinch-zoom (изображения), долгое нажатие (контекстное меню). UIPress с типом .select, .playPause, .menu, .upArrow. .downArrow, .leftArrow, .rightArrow — предопределённые типы нажатий. Микрофон пульта используется для Siri и голосового поиска.
Top Shelf — область на главном экране Apple TV, отображающая динамический контент приложения, когда оно находится в верхнем ряду. В tvOS 17 Top Shelf поддерживает до 8 виджетов с кастомным фоном и интерактивными элементами. Разработчик реализует TVTopShelfProvider для предоставления контента.
Доступны три стиля Top Shelf: Sectioned — категоризированный список (сериалы по жанрам), Inset — центральный элемент с детальным описанием (рекомендуемый фильм), Photo — сетка изображений (фотоальбомы). Система обновляет Top Shelf в фоне через BGTaskScheduler, аналогично watchOS. Провайдер должен возвращать контент быстро — tvOS кеширует данные на 24 часа.
Главный экран tvOS состоит из строки Top Shelf и сетки приложений. Пользователь может переставлять иконки, создавать папки. tvOS автоматически выгружает приложения из памяти при нехватке ресурсов, поэтому разработчик должен корректно обрабатывать UISceneDidDisconnectNotification и восстанавливать состояние при повторном запуске.
| Стиль Top Shelf | Формат | Когда использовать |
|---|---|---|
| Sectioned | Секции с заголовками и элементами | Сериалы, подкасты, плейлисты |
| Inset | Один крупный элемент с описанием | Главный фильм дня, эксклюзив |
| Photo | Сетка изображений без подписей | Фотоальбомы, галереи |
| Tab | Вкладки с переключением | Спорт по видам, новости по темам |
SwiftUI полностью поддерживается в tvOS начиная с tvOS 13. Apple рекомендует SwiftUI для всех новых проектов. Тот же код на SwiftUI работает на iOS, iPadOS, macOS и tvOS с минимальными адаптациями под Focus Engine. SwiftUI для tvOS предоставляет модификаторы .focusable(), .focusSection(), .onPlayPauseCommand и .onExitCommand.
При портировании iOS-приложения на tvOS необходимо: заменить TabView на NavigationView с focus-навигацией, увеличить размер шрифтов (минимум 30pt для заголовков, 22pt для текста), добавить отступы (минимум 40pt от краёв — safe area на телевизорах). TVOS не поддерживает UIAlertController с текстовым полем, UIWebView и MFMailComposeViewController.
| Компонент iOS | Аналог в tvOS | Примечание |
|---|---|---|
| UISlider | UIProgressView + кнопки | Slider не поддерживается |
| UIPickerView | Таблица с фокусом | Picker заменён списком |
| UITextField | UIAlertController (только read-only) | Ввод текста через Siri |
| UIActionSheet | UIAlertController | Поддерживается |
| 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 — фреймворк для создания медиаприложений на tvOS с использованием веб-технологий: JavaScript (TVJS) и TVML (Apple-специфичный XML). Приложения на TVMLKit не требуют компиляции — интерфейс загружается с сервера, что позволяет обновлять контент без прохождения App Review. Используется крупными стриминговыми сервисами для каруселей контента.
TVML предоставляет готовые шаблоны: CatalogTemplate (каталог с секциями), ProductTemplate (детальная страница контента), FormTemplate (формы входа), LoadingTemplate (индикатор загрузки). Шаблоны описываются в XML и стилизуются через CSS-подобные атрибуты. TVJS-код обрабатывает нажатия и вызывает нативные API.
<!-- 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 — среда JavaScript, изолированная от основного приложения. Код на TVJS вызывается при загрузке TVML-шаблона и обработке событий. TVJS имеет доступ к нативным API через Appliance и Player для управления воспроизведением видео. Apple рекомендует использовать TVMLKit только для медиа-приложений с частым обновлением контента. Для игр и интерактивных приложений предпочтителен SwiftUI.
Публикация 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 для бизнес-клиентов.
Особые требования 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 |
Часто задаваемые вопросы
Основной язык — Swift с фреймворками SwiftUI и UIKit. Для медиаприложений используется TVMLKit с JavaScript и TVML-шаблонами, загружаемыми с сервера. Objective-C поддерживается для легаси-проектов. Apple рекомендует SwiftUI для всех новых проектов под tvOS.
tvOS использует Focus Engine вместо touch-событий, не имеет камеры и микрофона (кроме Siri Remote), ограничивает размер приложения 4 ГБ, не поддерживает постоянное локальное хранилище (purgeable) и требует использования Metal для рендеринга. Все приложения работают только на ARM64.
Focus Engine управляет перемещением фокуса между UI-элементами при помощи Siri Remote. Разработчик задаёт предпочтительный фокус через preferredFocusEnvironments. UIFocusHeading (up, down, left, right) определяет направление. UIFocusEffect автоматически добавляет параллакс и тень к активному элементу.
Публикация требует подписки Apple Developer Program ($99/год). Приложение загружается через Xcode Organizer или Transporter в App Store Connect. Модерация проверяет: совместимость с Focus Engine, стабильность, отсутствие UIWebView и ограничение размера 4 ГБ.
Да, UIKit полностью поддерживается в tvOS: UIView, UIViewController, UICollectionView, UITableView. Однако UIKit адаптирован под Focus Engine: UIButton и UIControl получают событие через нажатие пульта, а не touch. SwiftUI рекомендуется для новых проектов из-за автоматической адаптации под фокус.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также