tvOS — операционната система на Apple за Apple TV, пусната за първи път през 2015 г. заедно с Apple TV от 4-то поколение. Разработката на приложения за tvOS се извършва на Swift с използване на SwiftUI и TVMLKit. Ключовата разлика от iOS е управлението на фокуса чрез Siri Remote вместо докосване. Според Apple, tvOS е инсталиран на над 100 милиона активни устройства по света.
Основни точки
tvOS — операционната система на Apple за телевизионни приемници Apple TV, базирана на същото ядро Darwin XNU като 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 (1-во поколение 4K), A12 Bionic (2-ро поколение 4K) и A15 Bionic (3-то поколение 4K). Всички модели поддържат 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 | Множество потребители, Контролен център на TV |
| tvOS 17 | 2023 | FaceTime, VPN, Намиране на Siri Remote |
Архитектурата на tvOS се базира на същия стек като iOS: ядро XNU, системни услуги Core Services, медиен слой Media и потребителски слой Cocoa Touch. Съществуват обаче значителни разлики, свързани със спецификата на телевизионната платформа.
Apple TV 4K от 3-то поколение използва A15 Bionic с 6 ядра CPU (2 производителни, 4 енергийно ефективни) и 5-ядрен GPU. RAM — 4 ГБ (вътрешна SSD памет от 64 ГБ). Системата няма постоянна локална памет в класически смисъл: всички данни на приложенията могат да бъдат изтрити от tvOS при липса на място (purgeable). Разработчикът трябва да използва iCloud Key-Value Storage или CloudKit за запазване на състоянието.
TVMLKit — уникална рамка за tvOS, която позволява създаване на интерфейси на JavaScript и TVML (подобен на XML език, специфичен за Apple). 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 поддържа жестове: плъзгане (навигация), докосване (избор), двойно докосване (центриране), прищипване-зуум (изображения), продължително натискане (контекстно меню). 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 с фокусна навигация, да увеличите размерите на шрифтовете (минимум 30pt за заглавия, 22pt за текст), да добавите полета (минимум 40pt от ръбовете — безопасна зона на телевизори). tvOS не поддържа UIAlertController с текстово поле, UIWebView и MFMailComposeViewController.
| iOS компонент | Еквивалент в tvOS | Забележка |
|---|---|---|
| UISlider | UIProgressView + бутони | Slider не се поддържа |
| UIPickerView | Таблица с фокус | Picker заменен със списък |
| UITextField | UIAlertController (само за четене) | Въвеждане на текст чрез Siri |
| UIActionSheet | UIAlertController | Поддържа се |
| UIWebView | Не се поддържа | Използвайте WKWebView |
| MFMailCompose | Не се поддържа | Отворете mailto: URL |
Apple HIG за tvOS: минимален размер на сензорната зона 60×60 точки, текст четим от 3 метра (размер на шрифта не по-малък от 22pt за тяло), контраст на текста 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 съдържа банер със заглавие и секции с 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 |
| Фокусна навигация | Всички елементи достъпни чрез 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 получават събития чрез натискане на дистанционното, а не чрез докосване. SwiftUI се препоръчва за нови проекти поради автоматичното адаптиране към фокуса.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също