tvOS — το λειτουργικό σύστημα της Apple για Apple TV, που κυκλοφόρησε για πρώτη φορά το 2015 μαζί με το Apple TV 4ης γενιάς. Η ανάπτυξη εφαρμογών για tvOS γίνεται σε Swift χρησιμοποιώντας SwiftUI και TVMLKit. Η βασική διαφορά από το iOS είναι ο έλεγχος εστίασης μέσω Siri Remote αντί για αφή. Σύμφωνα με την Apple, το tvOS είναι εγκατεστημένο σε περισσότερες από 100 εκατομμύρια ενεργές συσκευές παγκοσμίως.
Βασικά σημεία
tvOS — το λειτουργικό σύστημα της Apple για set-top boxes Apple TV, βασισμένο στον ίδιο πυρήνα Darwin XNU με το iOS. Κυκλοφόρησε για πρώτη φορά στις 30 Οκτωβρίου 2015 με το Apple TV 4ης γενιάς. Το tvOS αντικατέστησε το παλαιό Apple TV Software (βασισμένο σε iOS, χωρίς App Store και SDK). Το σύστημα είναι βελτιστοποιημένο για λειτουργία σε TV με ανάλυση έως 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, το οποίο αντικαθιστά τον έλεγχο αφής με πλοήγηση εστίασης. Ο χρήστης μετακινεί την επιλογή μεταξύ στοιχείων 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. Ωστόσο, υπάρχουν σημαντικές διαφορές που σχετίζονται με τις ιδιαιτερότητες της πλατφόρμας TV.
Το Apple TV 4K 3ης γενιάς χρησιμοποιεί A15 Bionic με 6 πυρήνες CPU (2 απόδοσης, 4 ενεργειακής απόδοσης) και GPU 5 πυρήνων. RAM — 4 GB (εσωτερική αποθήκευση SSD από 64 GB). Το σύστημα δεν έχει μόνιμη τοπική αποθήκευση με την κλασική έννοια: όλα τα δεδομένα εφαρμογών μπορεί να διαγραφούν από το tvOS όταν ο χώρος είναι περιορισμένος (purgeable). Ο προγραμματιστής πρέπει να χρησιμοποιεί iCloud Key-Value Storage ή CloudKit για τη διατήρηση της κατάστασης.
TVMLKit — ένα μοναδικό framework για tvOS που επιτρέπει τη δημιουργία διεπαφών σε JavaScript και TVML (γλώσσα που μοιάζει με XML, ειδική για Apple). Το TVMLKit φορτώνει JSON/XML από τον διακομιστή και αποδίδει εγγενή στοιχεία UI. Αυτή είναι η κύρια τεχνολογία για υπηρεσίες ροής: Netflix, Hulu, Amazon Prime Video χρησιμοποιούν TVMLKit. TVJS — ένα περιβάλλον JavaScript που εκτελείται σε απομονωμένο περιβάλλον.
Το tvOS διαχειρίζεται αυτόματα τον χώρο στον δίσκο: όταν ο χώρος είναι περιορισμένος, το σύστημα μπορεί να διαγράψει την προσωρινή μνήμη, τους ληφθέντες πόρους και ακόμη και την ίδια την εφαρμογή (διατηρώντας το εικονίδιο). Κατά το άνοιγμα, η εφαρμογή πρέπει να επαναφέρει την κατάστασή της. Το iCloud NSUbiquitousKeyValueStore είναι η μόνη εγγυημένη μόνιμη αποθήκευση για ρυθμίσεις (έως 1 MB ανά εφαρμογή).
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 που αντικαθιστά τα συμβάντα αφής με πλοήγηση εστίασης. Ο χρήστης μετακινεί την επιλογή μεταξύ στοιχείων 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 widgets με προσαρμοσμένο φόντο και διαδραστικά στοιχεία. Ο προγραμματιστής υλοποιεί το TVTopShelfProvider για την παροχή περιεχομένου.
Τρία στυλ Top Shelf είναι διαθέσιμα: Sectioned — κατηγοριοποιημένη λίστα (σειρές ανά είδος), Inset — κεντρικό στοιχείο με λεπτομερή περιγραφή (προτεινόμενη ταινία), Photo — πλέγμα εικόνων (άλμπουμ φωτογραφιών). Το σύστημα ενημερώνει το Top Shelf στο παρασκήνιο μέσω BGTaskScheduler, παρόμοια με το watchOS. Ο πάροχος πρέπει να επιστρέφει γρήγορα το περιεχόμενο — το tvOS αποθηκεύει προσωρινά δεδομένα για 24 ώρες.
Η αρχική οθόνη tvOS αποτελείται από μια σειρά Top Shelf και ένα πλέγμα εφαρμογών. Οι χρήστες μπορούν να αναδιατάξουν εικονίδια και να δημιουργήσουν φακέλους. Το tvOS εκφορτώνει αυτόματα εφαρμογές από τη μνήμη όταν οι πόροι είναι χαμηλοί, επομένως ο προγραμματιστής πρέπει να χειρίζεται σωστά το UISceneDidDisconnectNotification και να επαναφέρει την κατάσταση κατά την επανεκκίνηση.
| Στυλ Top Shelf | Μορφή | Πότε να χρησιμοποιείται |
|---|---|---|
| Sectioned | Ενότητες με κεφαλίδες και στοιχεία | Σειρές, podcast, λίστες αναπαραγωγής |
| 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 | Δεν υποστηρίζεται | Ανοίξτε URL mailto: |
Apple HIG για tvOS: ελάχιστο μέγεθος περιοχής αφής 60×60 σημεία, κείμενο αναγνώσιμο από 3 μέτρα (μέγεθος γραμματοσειράς όχι μικρότερο από 22pt για σώμα), αντίθεση κειμένου 4.5:1, σκούρο φόντο (ανοιχτό φόντο δημιουργεί αντανάκλαση σε OLED TV), όλα τα στοιχεία προσβάσιμα χωρίς σύνθετες χειρονομίες. Ανάλυση: Apple TV 4K παράγει 3840×2160 (4K) ή 1920×1080 (HD) στα 60 FPS. Όλες οι εικόνες πρέπει να είναι @2x (για 1080p) και @4x (για 4K).
TVMLKit — ένα framework για τη δημιουργία εφαρμογών πολυμέσων στο tvOS με χρήση τεχνολογιών ιστού: JavaScript (TVJS) και TVML (XML ειδικό για Apple). Οι εφαρμογές 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>Interstellar</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 GB.
Το Xcode δημιουργεί έναν στόχο tvOS με επέκταση .app (πακέτο .ipa). Αρχιτεκτονική — arm64 (το Apple TV χρησιμοποιεί τσιπ ARM Apple Silicon). Το tvOS δεν υποστηρίζει frameworks με i386 ή x86_64. Η εφαρμογή υπογράφεται με πιστοποιητικό Apple Development (δοκιμή) ή Apple Distribution (δημοσίευση). Η διανομή μέσω Volume Purchase Program για επιχειρηματικούς πελάτες είναι δυνατή.
Ειδικές απαιτήσεις tvOS: όλα τα στοιχεία διεπαφής πρέπει να είναι προσβάσιμα μέσω Focus Engine χωρίς χρήση οθόνης αφής ή πληκτρολογίου. Οι εφαρμογές που απαιτούν εξουσιοδότηση πρέπει να υποστηρίζουν Ενιαία Σύνδεση (SSO) μέσω iTunes Store. Το διαφημιστικό περιεχόμενο δεν μπορεί να διακόπτει την αναπαραγωγή χωρίς τη συγκατάθεση του χρήστη. Το μέγεθος του μεταφορτωμένου δυαδικού αρχείου δεν πρέπει να υπερβαίνει τα 4 GB.
| Απαίτηση | Περιγραφή |
|---|---|
| Μέγεθος εφαρμογής | Όχι περισσότερο από 4 GB, συνιστάται 500 MB |
| Ανάλυση γραφικών | @2x (1920×1080) και @4x (3840×2160) για 4K |
| Πλοήγηση εστίασης | Όλα τα στοιχεία προσβάσιμα μέσω Siri Remote |
| Μορφή βίντεο | H.264, HEVC, Dolby Vision (Profile 5) |
| Ήχος | Dolby Atmos (E-AC-3 JOC) και στερεοφωνικό AAC |
Συχνές ερωτήσεις
Η κύρια γλώσσα είναι η Swift με τα frameworks SwiftUI και UIKit. Για εφαρμογές πολυμέσων, χρησιμοποιείται TVMLKit με JavaScript και πρότυπα TVML που φορτώνονται από τον διακομιστή. Η Objective-C υποστηρίζεται για παλαιότερα έργα. Η Apple συνιστά SwiftUI για όλα τα νέα έργα tvOS.
tvOS χρησιμοποιεί Focus Engine αντί για συμβάντα αφής, δεν έχει κάμερα ή μικρόφωνο (εκτός Siri Remote), περιορίζει το μέγεθος εφαρμογής στα 4 GB, δεν υποστηρίζει μόνιμη τοπική αποθήκευση (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 GB.
Ναι, το UIKit υποστηρίζεται πλήρως στο tvOS: UIView, UIViewController, UICollectionView, UITableView. Ωστόσο, το UIKit είναι προσαρμοσμένο για Focus Engine: τα UIButton και UIControl λαμβάνουν συμβάντα μέσω πατήματος του τηλεχειριστηρίου, όχι αφής. Το SwiftUI συνιστάται για νέα έργα λόγω αυτόματης προσαρμογής εστίασης.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης