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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.