tvOS — Apple TV için Apple'ın işletim sistemi, ilk olarak 2015'te 4. nesil Apple TV ile birlikte yayınlandı. tvOS için uygulama geliştirme, SwiftUI ve TVMLKit kullanılarak Swift dilinde yapılır. iOS'tan temel farkı, dokunma yerine Siri Remote ile odak kontrolüdür. Apple'a göre tvOS, dünya çapında 100 milyondan fazla aktif cihazda kuruludur.
Önemli Noktalar
tvOS — Apple TV set üstü kutuları için Apple'ın işletim sistemi, iOS ile aynı Darwin XNU çekirdeği üzerine kuruludur. İlk olarak 30 Ekim 2015'te 4. nesil Apple TV ile yayınlandı. tvOS, eski Apple TV Software'in (iOS tabanlı, App Store ve SDK'sız) yerini aldı. Sistem, 4K HDR (Dolby Vision) ve Dolby Atmos ses desteğine kadar çözünürlükle TV'de çalışmak üzere optimize edilmiştir.
Apple'a (WWDC 2025) göre tvOS, Apple TV HD (2015), Apple TV 4K (2017, 2021, 2022) üzerinde kuruludur ve AirPlay aracılığıyla bazı Smart TV modellerine entegre edilmiştir. Apple TV, A8 (HD), A10X Fusion (1. nesil 4K), A12 Bionic (2. nesil 4K) ve A15 Bionic (3. nesil 4K) yongalarını kullanır. Tüm modeller tvOS 17'yi destekler. tvOS'ta kamera, mikrofon (kumanda hariç), dokunmatik ekran veya GPS yoktur.
tvOS'un temel özelliği, dokunmatik kontrolü odak navigasyonuyla değiştiren Focus Engine'dir. Kullanıcı, Siri Remote'u kullanarak UI öğeleri arasında seçimi hareket ettirir. Geliştiriciler, Swift/SwiftUI (yerel) veya JavaScript/TVML (Netflix, Hulu gibi medya uygulamaları) ile uygulamalar oluşturur.
tvOS 9 (2015) — SDK ve App Store ile ilk sürüm. tvOS 10 (2016) — kablo abonelikleri için Tek Oturum Açma (SSO). tvOS 11 (2017) — Amazon Prime Video desteği ve otomatik mod. tvOS 12 (2018) — Dolby Atmos. tvOS 13 (2019) — çok kullanıcılı mod. tvOS 17 (2023) — FaceTime, VPN, HDMI üzerinden ses profilleri.
| tvOS Sürümü | Yıl | Temel Yenilik |
|---|---|---|
| tvOS 9 | 2015 | App Store, SDK, Siri Remote |
| tvOS 10 | 2016 | Tek Oturum Açma (SSO), Live Tune-In |
| tvOS 11 | 2017 | Amazon Prime, otomatik mod |
| tvOS 12 | 2018 | Dolby Atmos, iPhone ile şifre |
| tvOS 13 | 2019 | Çok kullanıcılı, TV'de Kontrol Merkezi |
| tvOS 17 | 2023 | FaceTime, VPN, Siri Remote'u Bul |
tvOS mimarisi iOS ile aynı yığın üzerine kuruludur: XNU çekirdeği, Core Services sistem hizmetleri, Media katmanı ve Cocoa Touch kullanıcı katmanı. Ancak, TV platformunun özellikleriyle ilgili önemli farklılıklar vardır.
3. nesil Apple TV 4K, 6 CPU çekirdeği (2 performans, 4 verimlilik) ve 5 çekirdekli GPU ile A15 Bionic kullanır. RAM — 4 GB (64 GB'tan itibaren dahili SSD depolama). Sistem, klasik anlamda kalıcı yerel depolamaya sahip değildir: alan azaldığında tvOS tüm uygulama verilerini silebilir (purgeable). Geliştirici, durumu korumak için iCloud Key-Value Storage veya CloudKit kullanmalıdır.
TVMLKit — tvOS'a özgü, JavaScript ve TVML (Apple'a özgü XML benzeri dil) ile arayüzler oluşturmayı sağlayan bir framework. TVMLKit, sunucudan JSON/XML yükler ve yerel UI bileşenlerini işler. Bu, akış hizmetleri için birincil teknolojidir: Netflix, Hulu, Amazon Prime Video TVMLKit kullanır. TVJS — izole bir bağlamda çalışan JavaScript ortamı.
tvOS disk alanını otomatik olarak yönetir: alan azaldığında sistem önbelleği, indirilen kaynakları ve hatta uygulamanın kendisini silebilir (simgeyi koruyarak). Yeniden açıldığında, uygulama durumunu geri yüklemelidir. iCloud NSUbiquitousKeyValueStore, ayarlar için garantili tek kalıcı depolamadır (uygulama başına 1 MB'a kadar).
import Foundation
// // tvOS'ta durum koruma ve geri yükleme
final class StateManager {
private let store = NSUbiquitousKeyValueStore.default
private let coder = JSONEncoder()
private let decoder = JSONDecoder()
// İzleme ilerlemesi kaydediliyor
func saveProgress<T: Codable>(_ value: T, for key: String) {
if let data = try? coder.encode(value) {
store.set(data, for: key)
store.synchronize()
}
}
// Önbellek silindikten sonra durum geri yükleniyor
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)
}
// Başka bir cihazda değişiklik bildirimi işleniyor
init() {
NotificationCenter.default.addObserver(
self,
selector: #selector(ubiquitousKeyValueStoreDidChange),
name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
object: store
)
}
@objc
private func ubiquitousKeyValueStoreDidChange(_ notification: Notification) {
print("Başka bir cihazda veriler değiştirildi")
}
}StateManager, tvOS'ta uygulama durumunu kaydetmek için NSUbiquitousKeyValueStore kullanır. Yerel depolama sistem tarafından temizlenebileceğinden, yalnızca iCloud veri kalıcılığını garanti eder. store.synchronize() verileri hemen sunucuya gönderirken, didChangeExternallyNotification kullanıcının diğer cihazlarındaki değişiklikler hakkında uygulamayı bilgilendirir.
Focus Engine — dokunma olaylarını odak navigasyonuyla değiştiren tvOS'un temel mekanizması. Kullanıcı, Siri Remote'u (dokunmatik yüzey veya düğmeler) kullanarak UI öğeleri arasında seçimi hareket ettirir. Sistem, mesafe ve hareket yönüne göre bir sonraki odak öğesini otomatik olarak hesaplar.
Odak alabilen her UI öğesi UIFocusEnvironment protokolünü uygular. UIKit, öğe geometrisine göre gezinme sırasını otomatik olarak belirler. Geliştirici, preferredFocusEnvironments aracılığıyla tercih edilen odağı geçersiz kılabilir, alt focusEnvironment dizisi belirleyebilir ve UIFocusHeading (up, down, left, right) aracılığıyla hareketi kontrol edebilir. UIFocusGuide, karmaşık düzenler için özel yollar belirlemeye olanak tanır.
tvOS, odaklanan öğeye otomatik olarak UIFocusEffect ekler: gölge, vurgulama ve paralaks efekti (kumanda eğildiğinde kayma). Geliştirici, focusedValue ile efekti devre dışı bırakabilir veya UIFocusEffect.transform ile özelleştirebilir. SwiftUI'de paralaks, .hoverEffect(.highlight) değiştiricisi ile eklenir.
import SwiftUI
// // Özel odaklı tvOS bileşeni
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 {
// Kumandada Play/Pause düğmesi işleniyor
startPlayback()
}
.focusable()
.focusEffect { phase in
// Özel odak efekti
phase == .active ?
AnyView(self.scaleEffect(1.08)) :
AnyView(self.scaleEffect(1.0))
}
}
private func startPlayback() {
print("Oynatılıyor: \(movie.title)")
}
}
// // Film ızgaralı ana ekran
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() // Gezinme için gruplama
}
}MovieCardView, SwiftUI'de Focus Engine'i gösterir: .focusable() değiştiricisi öğeyi odaklanabilir yapar, .onHover durum değişikliklerini izler, .focusEffect özel odak animasyonuna izin verir. .onPlayPauseCommand, Siri Remote üzerindeki Play/Pause düğmesine basılmasını işler. focusSection, döngüsel navigasyon için bir ızgarayı gruplar.
İkinci nesil Siri Remote (2021) bir dokunmatik yüzeye, 5 düğmeye ve bir mikrofona sahiptir. tvOS jestleri destekler: kaydırma (navigasyon), dokunma (seçim), çift dokunma (ortala), kıstırma-yakınlaştırma (görüntüler), uzun basma (bağlam menüsü). UIPress tipleri .select, .playPause, .menu, .upArrow, .downArrow, .leftArrow, .rightArrow — önceden tanımlanmış basma tipleri. Kumandanın mikrofonu Siri ve sesli arama için kullanılır.
Top Shelf, Apple TV ana ekranında, uygulama üst sıradayken dinamik içeriğini gösteren bir alandır. tvOS 17'de Top Shelf, özel arka planlar ve etkileşimli öğelerle 8 adede kadar widget'ı destekler. Geliştirici, içerik sağlamak için TVTopShelfProvider'ı uygular.
Üç Top Shelf stili mevcuttur: Sectioned — kategorize edilmiş liste (türe göre diziler), Inset — ayrıntılı açıklamalı merkezi öğe (önerilen film), Photo — resim ızgarası (fotoğraf albümleri). Sistem, watchOS'a benzer şekilde BGTaskScheduler aracılığıyla Top Shelf'i arka planda günceller. Sağlayıcı içeriği hızlı bir şekilde döndürmelidir — tvOS verileri 24 saat boyunca önbellekte tutar.
tvOS ana ekranı, bir Top Shelf satırı ve bir uygulama ızgarasından oluşur. Kullanıcılar simgeleri yeniden düzenleyebilir ve klasörler oluşturabilir. Kaynaklar azaldığında tvOS, uygulamaları otomatik olarak bellekten boşaltır, bu nedenle geliştiricinin UISceneDidDisconnectNotification'ı doğru şekilde işlemesi ve yeniden başlatmada durumu geri yüklemesi gerekir.
| Top Shelf Stili | Biçim | Ne Zaman Kullanılır |
|---|---|---|
| Sectioned | Başlıklar ve öğeler içeren bölümler | Diziler, podcast'ler, çalma listeleri |
| Inset | Açıklamalı tek büyük öğe | Günün filmi, özel |
| Photo | Altyazısız resim ızgarası | Fotoğraf albümleri, galeriler |
| Tab | Geçiş yapılabilen sekmeler | Türe göre spor, konuya göre haber |
SwiftUI, tvOS 13'ten itibaren tvOS'ta tam olarak desteklenmektedir. Apple, tüm yeni projeler için SwiftUI'yi önermektedir. Aynı SwiftUI kodu, Focus Engine için minimum uyarlamalarla iOS, iPadOS, macOS ve tvOS'ta çalışır. tvOS için SwiftUI, .focusable(), .focusSection(), .onPlayPauseCommand ve .onExitCommand değiştiricilerini sağlar.
Bir iOS uygulamasını tvOS'a taşırken: TabView'i odak navigasyonlu NavigationView ile değiştirin, yazı tipi boyutlarını artırın (başlıklar için minimum 30pt, gövde metni için 22pt), kenar boşlukları ekleyin (kenarlardan minimum 40pt — TV'lerde güvenli alan). tvOS, metin alanlı UIAlertController, UIWebView ve MFMailComposeViewController'ı desteklemez.
| iOS Bileşeni | tvOS Karşılığı | Not |
|---|---|---|
| UISlider | UIProgressView + düğmeler | Slider desteklenmiyor |
| UIPickerView | Odaklı tablo | Picker liste ile değiştirildi |
| UITextField | UIAlertController (salt okunur) | Siri ile metin girişi |
| UIActionSheet | UIAlertController | Destekleniyor |
| UIWebView | Desteklenmiyor | WKWebView kullanın |
| MFMailCompose | Desteklenmiyor | mailto: URL açın |
tvOS için Apple HIG: minimum dokunma alanı boyutu 60×60 punto, metin 3 metreden okunabilir (gövde için yazı tipi boyutu 22pt'den az olmamalı), metin kontrastı 4.5:1, koyu arka plan (açık arka plan OLED TV'lerde parlamaya neden olur), tüm öğeler karmaşık jestler olmadan erişilebilir. Çözünürlük: Apple TV 4K, 60 FPS'de 3840×2160 (4K) veya 1920×1080 (HD) çıktı verir. Tüm görüntüler @2x (1080p için) ve @4x (4K için) olmalıdır.
TVMLKit — web teknolojilerini kullanarak tvOS'ta medya uygulamaları oluşturmak için bir framework: JavaScript (TVJS) ve TVML (Apple'a özgü XML). TVMLKit uygulamaları derleme gerektirmez — arayüz sunucudan yüklenir ve App Review'dan geçmeden içerik güncellemelerine izin verir. Büyük akış hizmetleri tarafından içerik karuselleri için kullanılır.
TVML hazır şablonlar sağlar: CatalogTemplate (bölümlerle katalog), ProductTemplate (içerik detay sayfası), FormTemplate (giriş formları), LoadingTemplate (yükleme göstergesi). Şablonlar XML'de tanımlanır ve CSS benzeri niteliklerle stillendirilir. TVJS kodu, basmaları işler ve yerel API'leri çağırır.
<!-- CatalogTemplate — TVML'de film kataloğu -->
<document>
<catalogTemplate>
<banner>
<title>Yeni filmler</title>
<description>Yeni prömiyerler ve özel içerikler</description>
</banner>
<section>
<header>
<title>Popüler</title>
</header>
<items>
<lockup>
<img src="https://cdn.example.com/movie1.jpg" width=300 height=450/>
<title>Interstellar</title>
</lockup>
<lockup>
<img src="https://cdn.example.com/movie2.jpg" width=300 height=450/>
<title>Başlangıç</title>
</lockup>
</items>
</section>
</catalogTemplate>
</document>TVML CatalogTemplate, başlıklı bir banner ve lockup öğeleri içeren bölümler içerir. Her lockup, resim ve başlık içeren bir film kartıdır. Focus Engine, lockup öğeleri arasındaki navigasyonu otomatik olarak yönetir. Basıldığında, TVJS işleyicisi select olayını alır ve ProductTemplate aracılığıyla bir detay sayfası görüntüleyebilir.
TVJS, ana uygulamadan izole edilmiş bir JavaScript ortamıdır. TVJS kodu, bir TVML şablonu yüklenirken ve olaylar işlenirken çağrılır. TVJS, video oynatımını kontrol etmek için Appliance ve Player aracılığıyla yerel API'lere erişebilir. Apple, TVMLKit'in yalnızca sık içerik güncellemeleri olan medya uygulamaları için kullanılmasını önerir. Oyunlar ve etkileşimli uygulamalar için SwiftUI tercih edilir.
tvOS uygulaması yayınlamak için Apple Developer Program aboneliği ($99/yıl) gerekir. Uygulama, App Store Connect'e ayrı bir ürün veya evrensel ikili dosyanın (iOS + tvOS) parçası olarak yüklenir. App Review, kararlılığı, HIG uyumluluğunu ve 4 GB boyut sınırını kontrol eder.
Xcode, .app uzantılı (.ipa paketi) bir tvOS hedefi oluşturur. Mimari — arm64 (Apple TV, Apple Silicon ARM yongalarını kullanır). tvOS, i386 veya x86_64 içeren framework'leri desteklemez. Uygulama, Apple Development sertifikası (test) veya Apple Distribution sertifikası (yayın) ile imzalanır. Kurumsal müşteriler için Volume Purchase Program aracılığıyla dağıtım mümkündür.
tvOS özel gereksinimleri: tüm arayüz öğelerine dokunmatik ekran veya klavye kullanmadan Focus Engine aracılığıyla erişilebilmelidir. Yetkilendirme gerektiren uygulamalar, iTunes Store üzerinden Tek Oturum Açma'yı (SSO) desteklemelidir. Reklam içeriği, kullanıcının izni olmadan oynatmayı kesemez. Yüklenen ikili dosya boyutu 4 GB'ı geçmemelidir.
| Gereksinim | Açıklama |
|---|---|
| Uygulama boyutu | 4 GB'ı geçmemeli, önerilen 500 MB |
| Grafik çözünürlüğü | @2x (1920×1080) ve @4x (3840×2160) 4K için |
| Odak navigasyonu | Tüm öğeler Siri Remote ile erişilebilir |
| Video formatı | H.264, HEVC, Dolby Vision (Profile 5) |
| Ses | Dolby Atmos (E-AC-3 JOC) ve stereo AAC |
Sıkça Sorulan Sorular
Ana dil Swift'tir ve SwiftUI ile UIKit framework'leri kullanılır. Medya uygulamaları için, sunucudan yüklenen JavaScript ve TVML şablonlarıyla TVMLKit kullanılır. Objective-C, eski projeler için desteklenir. Apple, tüm yeni tvOS projeleri için SwiftUI'yi önerir.
tvOS, dokunma olayları yerine Focus Engine kullanır, kamerası ve mikrofonu yoktur (Siri Remote hariç), uygulama boyutunu 4 GB ile sınırlar, kalıcı yerel depolamayı (purgeable) desteklemez ve işleme için Metal gerektirir. Tüm uygulamalar yalnızca ARM64'te çalışır.
Focus Engine, Siri Remote'u kullanarak UI öğeleri arasındaki odak hareketini yönetir. Geliştirici, preferredFocusEnvironments aracılığıyla tercih edilen odağı ayarlar. UIFocusHeading (up, down, left, right) yönü belirler. UIFocusEffect, etkin öğeye otomatik olarak paralaks ve gölge ekler.
Yayınlama için Apple Developer Program aboneliği ($99/yıl) gerekir. Uygulama, Xcode Organizer veya Transporter aracılığıyla App Store Connect'e yüklenir. Denetim şunları kontrol eder: Focus Engine uyumluluğu, kararlılık, UIWebView olmaması ve 4 GB boyut sınırı.
Evet, UIKit tvOS'ta tamamen desteklenir: UIView, UIViewController, UICollectionView, UITableView. Ancak UIKit, Focus Engine için uyarlanmıştır: UIButton ve UIControl, dokunma yerine kumanda basmasıyla olay alır. Otomatik odak uyarlaması nedeniyle yeni projeler için SwiftUI önerilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun