tvOS — hệ điều hành của Apple cho Apple TV, được phát hành lần đầu vào năm 2015 cùng với Apple TV thế hệ thứ 4. Việc phát triển ứng dụng cho tvOS được thực hiện bằng Swift sử dụng SwiftUI và TVMLKit. Sự khác biệt chính so với iOS là điều khiển tiêu điểm qua Siri Remote thay vì chạm. Theo Apple, tvOS được cài đặt trên hơn 100 triệu thiết bị đang hoạt động trên toàn thế giới.
Những điểm chính
tvOS — hệ điều hành của Apple cho hộp giải mã Apple TV, dựa trên cùng nhân Darwin XNU như iOS. Được phát hành lần đầu vào ngày 30 tháng 10 năm 2015 với Apple TV thế hệ thứ 4. tvOS đã thay thế Apple TV Software cũ (dựa trên iOS, không có App Store và SDK). Hệ thống được tối ưu hóa cho hoạt động trên TV với độ phân giải lên đến 4K HDR (Dolby Vision) và âm thanh Dolby Atmos.
Theo Apple (WWDC 2025), tvOS được cài đặt trên Apple TV HD (2015), Apple TV 4K (2017, 2021, 2022) và được tích hợp vào một số mẫu Smart TV qua AirPlay. Apple TV sử dụng chip A8 (HD), A10X Fusion (4K thế hệ 1), A12 Bionic (4K thế hệ 2) và A15 Bionic (4K thế hệ 3). Tất cả các mẫu đều hỗ trợ tvOS 17. tvOS không có camera, micrô (trừ điều khiển từ xa), màn hình cảm ứng hay GPS.
Tính năng chính của tvOS là Focus Engine, thay thế điều khiển bằng chạm bằng điều hướng tiêu điểm. Người dùng di chuyển lựa chọn giữa các phần tử UI bằng Siri Remote. Các nhà phát triển tạo ứng dụng bằng Swift/SwiftUI (native) hoặc JavaScript/TVML (ứng dụng đa phương tiện như Netflix, Hulu).
tvOS 9 (2015) — phiên bản đầu tiên có SDK và App Store. tvOS 10 (2016) — đăng nhập một lần (SSO) cho thuê bao cáp. tvOS 11 (2017) — hỗ trợ Amazon Prime Video và chế độ tự động. tvOS 12 (2018) — Dolby Atmos. tvOS 13 (2019) — chế độ nhiều người dùng. tvOS 17 (2023) — FaceTime, VPN, hồ sơ âm thanh qua HDMI.
| Phiên bản tvOS | Năm | Cải tiến chính |
|---|---|---|
| tvOS 9 | 2015 | App Store, SDK, Siri Remote |
| tvOS 10 | 2016 | Đăng nhập một lần (SSO), Live Tune-In |
| tvOS 11 | 2017 | Amazon Prime, chế độ tự động |
| tvOS 12 | 2018 | Dolby Atmos, mật khẩu qua iPhone |
| tvOS 13 | 2019 | Nhiều người dùng, Trung tâm điều khiển trên TV |
| tvOS 17 | 2023 | FaceTime, VPN, Tìm Siri Remote |
Kiến trúc tvOS dựa trên cùng một nền tảng như iOS: nhân XNU, dịch vụ hệ thống Core Services, lớp Media và lớp người dùng Cocoa Touch. Tuy nhiên, có những khác biệt đáng kể liên quan đến đặc thù của nền tảng TV.
Apple TV 4K thế hệ thứ 3 sử dụng A15 Bionic với 6 lõi CPU (2 hiệu năng, 4 tiết kiệm) và GPU 5 lõi. RAM — 4 GB (bộ nhớ SSD trong từ 64 GB). Hệ thống không có bộ nhớ cục bộ vĩnh viễn theo nghĩa cổ điển: tất cả dữ liệu ứng dụng có thể bị tvOS xóa khi thiếu dung lượng (purgeable). Nhà phát triển phải sử dụng iCloud Key-Value Storage hoặc CloudKit để lưu trữ trạng thái.
TVMLKit — một framework độc đáo của tvOS cho phép tạo giao diện bằng JavaScript và TVML (ngôn ngữ giống XML đặc thù của Apple). TVMLKit tải JSON/XML từ máy chủ và hiển thị các thành phần UI native. Đây là công nghệ chính cho các dịch vụ phát trực tuyến: Netflix, Hulu, Amazon Prime Video sử dụng TVMLKit. TVJS — môi trường JavaScript chạy trong ngữ cảnh biệt lập.
tvOS tự động quản lý dung lượng đĩa: khi thiếu dung lượng, hệ thống có thể xóa bộ nhớ đệm, tài nguyên đã tải và thậm chí cả ứng dụng (giữ lại biểu tượng). Khi mở lại, ứng dụng phải khôi phục trạng thái. iCloud NSUbiquitousKeyValueStore là bộ nhớ vĩnh viễn duy nhất được đảm bảo cho cài đặt (tối đa 1 MB mỗi ứng dụng).
import Foundation
// // Lưu trữ và khôi phục trạng thái trong tvOS
final class StateManager {
private let store = NSUbiquitousKeyValueStore.default
private let coder = JSONEncoder()
private let decoder = JSONDecoder()
// Đang lưu tiến trình xem
func saveProgress<T: Codable>(_ value: T, for key: String) {
if let data = try? coder.encode(value) {
store.set(data, for: key)
store.synchronize()
}
}
// Đang khôi phục trạng thái sau khi xóa bộ nhớ đệm
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)
}
// Xử lý thông báo thay đổi trên thiết bị khác
init() {
NotificationCenter.default.addObserver(
self,
selector: #selector(ubiquitousKeyValueStoreDidChange),
name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
object: store
)
}
@objc
private func ubiquitousKeyValueStoreDidChange(_ notification: Notification) {
print("Dữ liệu đã thay đổi trên thiết bị khác")
}
}StateManager sử dụng NSUbiquitousKeyValueStore để lưu trạng thái ứng dụng trên tvOS. Vì bộ nhớ cục bộ có thể bị hệ thống xóa, chỉ iCloud đảm bảo tính bền vững của dữ liệu. store.synchronize() ngay lập tức gửi dữ liệu đến máy chủ, trong khi didChangeExternallyNotification thông báo cho ứng dụng về các thay đổi từ thiết bị khác của người dùng.
Focus Engine — cơ chế chính của tvOS thay thế sự kiện chạm bằng điều hướng tiêu điểm. Người dùng di chuyển lựa chọn giữa các phần tử UI bằng Siri Remote (bề mặt cảm ứng hoặc nút bấm). Hệ thống tự động tính toán phần tử tiêu điểm tiếp theo dựa trên khoảng cách và hướng di chuyển.
Mỗi phần tử UI có khả năng nhận tiêu điểm đều triển khai giao thức UIFocusEnvironment. UIKit tự động xác định thứ tự điều hướng dựa trên hình dạng của các phần tử. Nhà phát triển có thể ghi đè tiêu điểm ưu tiên qua preferredFocusEnvironments, chỉ định mảng focusEnvironment con và điều khiển di chuyển qua UIFocusHeading (up, down, left, right). UIFocusGuide cho phép đặt đường dẫn tùy chỉnh cho các bố cục phức tạp.
tvOS tự động thêm UIFocusEffect vào phần tử được tiêu điểm: bóng đổ, làm nổi bật và hiệu ứng thị sai (dịch chuyển khi nghiêng điều khiển). Nhà phát triển có thể tắt hiệu ứng qua focusedValue hoặc tùy chỉnh qua UIFocusEffect.transform. Trong SwiftUI, hiệu ứng thị sai được thêm bằng bổ từ .hoverEffect(.highlight).
import SwiftUI
// // Thành phần tvOS với tiêu điểm tùy chỉnh
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 {
// Xử lý nút Play/Pause trên điều khiển
startPlayback()
}
.focusable()
.focusEffect { phase in
// Hiệu ứng tiêu điểm tùy chỉnh
phase == .active ?
AnyView(self.scaleEffect(1.08)) :
AnyView(self.scaleEffect(1.0))
}
}
private func startPlayback() {
print("Đang phát: \(movie.title)")
}
}
// // Màn hình chính với lưới phim
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() // Nhóm để điều hướng
}
}MovieCardView minh họa Focus Engine trong SwiftUI: bổ từ .focusable() làm cho phần tử có thể tiêu điểm, .onHover theo dõi thay đổi trạng thái, .focusEffect cho phép hoạt ảnh tiêu điểm tùy chỉnh. .onPlayPauseCommand xử lý nhấn nút Play/Pause trên Siri Remote. focusSection nhóm lưới để điều hướng vòng tuần hoàn.
Siri Remote thế hệ thứ hai (2021) có bề mặt cảm ứng, 5 nút và micrô. tvOS hỗ trợ các cử chỉ: vuốt (điều hướng), chạm (chọn), chạm đúp (căn giữa), chụm-zoom (hình ảnh), nhấn giữ (menu ngữ cảnh). UIPress với các loại .select, .playPause, .menu, .upArrow, .downArrow, .leftArrow, .rightArrow — các loại nhấn được xác định trước. Micrô của điều khiển được sử dụng cho Siri và tìm kiếm bằng giọng nói.
Top Shelf là khu vực trên màn hình chính Apple TV hiển thị nội dung động của ứng dụng khi nó ở hàng trên cùng. Trong tvOS 17, Top Shelf hỗ trợ tối đa 8 widget với nền tùy chỉnh và các phần tử tương tác. Nhà phát triển triển khai TVTopShelfProvider để cung cấp nội dung.
Có ba kiểu Top Shelf: Sectioned — danh sách phân loại (series theo thể loại), Inset — phần tử trung tâm với mô tả chi tiết (phim đề xuất), Photo — lưới hình ảnh (album ảnh). Hệ thống cập nhật Top Shelf trong nền qua BGTaskScheduler, tương tự watchOS. Nhà cung cấp phải trả lại nội dung nhanh chóng — tvOS lưu trữ dữ liệu trong 24 giờ.
Màn hình chính tvOS bao gồm một hàng Top Shelf và một lưới ứng dụng. Người dùng có thể sắp xếp lại biểu tượng và tạo thư mục. tvOS tự động dỡ ứng dụng khỏi bộ nhớ khi tài nguyên thấp, do đó nhà phát triển phải xử lý đúng UISceneDidDisconnectNotification và khôi phục trạng thái khi khởi động lại.
| Kiểu Top Shelf | Định dạng | Khi nào sử dụng |
|---|---|---|
| Sectioned | Các phần có tiêu đề và mục | Series, podcast, danh sách phát |
| Inset | Một mục lớn có mô tả | Phim trong ngày, độc quyền |
| Photo | Lưới ảnh không có chú thích | Album ảnh, thư viện |
| Tab | Tab có chuyển đổi | Thể thao theo loại, tin tức theo chủ đề |
SwiftUI được hỗ trợ đầy đủ trong tvOS từ tvOS 13. Apple khuyến nghị SwiftUI cho tất cả các dự án mới. Cùng một mã SwiftUI hoạt động trên iOS, iPadOS, macOS và tvOS với những điều chỉnh tối thiểu cho Focus Engine. SwiftUI cho tvOS cung cấp các bổ từ .focusable(), .focusSection(), .onPlayPauseCommand và .onExitCommand.
Khi chuyển ứng dụng iOS sang tvOS, cần: thay TabView bằng NavigationView với điều hướng tiêu điểm, tăng kích thước phông chữ (tối thiểu 30pt cho tiêu đề, 22pt cho văn bản), thêm lề (tối thiểu 40pt từ các cạnh — vùng an toàn trên TV). tvOS không hỗ trợ UIAlertController có trường văn bản, UIWebView và MFMailComposeViewController.
| Thành phần iOS | Tương đương tvOS | Ghi chú |
|---|---|---|
| UISlider | UIProgressView + nút bấm | Slider không được hỗ trợ |
| UIPickerView | Bảng có tiêu điểm | Picker được thay bằng danh sách |
| UITextField | UIAlertController (chỉ đọc) | Nhập văn bản qua Siri |
| UIActionSheet | UIAlertController | Được hỗ trợ |
| UIWebView | Không được hỗ trợ | Sử dụng WKWebView |
| MFMailCompose | Không được hỗ trợ | Mở URL mailto: |
Apple HIG cho tvOS: kích thước vùng chạm tối thiểu 60×60 điểm, văn bản đọc được từ khoảng cách 3 mét (cỡ phông không dưới 22pt cho nội dung), độ tương phản văn bản 4.5:1, nền tối (nền sáng gây chói trên TV OLED), tất cả các phần tử có thể truy cập không cần cử chỉ phức tạp. Độ phân giải: Apple TV 4K xuất ra 3840×2160 (4K) hoặc 1920×1080 (HD) ở 60 FPS. Tất cả hình ảnh phải ở @2x (cho 1080p) và @4x (cho 4K).
TVMLKit — một framework để tạo ứng dụng đa phương tiện trên tvOS bằng công nghệ web: JavaScript (TVJS) và TVML (XML đặc thù của Apple). Ứng dụng TVMLKit không cần biên dịch — giao diện được tải từ máy chủ, cho phép cập nhật nội dung mà không cần qua App Review. Nó được các dịch vụ phát trực tuyến lớn sử dụng cho băng chuyền nội dung.
TVML cung cấp các mẫu có sẵn: CatalogTemplate (danh mục có phần), ProductTemplate (trang chi tiết nội dung), FormTemplate (biểu mẫu đăng nhập), LoadingTemplate (chỉ báo tải). Các mẫu được mô tả trong XML và được tạo kiểu qua các thuộc tính giống CSS. Mã TVJS xử lý các lần nhấn và gọi API native.
<!-- CatalogTemplate — danh mục phim trên TVML -->
<document>
<catalogTemplate>
<banner>
<title>Phim mới</title>
<description>Buổi ra mắt mới và phim độc quyền</description>
</banner>
<section>
<header>
<title>Phổ biến</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>Inception</title>
</lockup>
</items>
</section>
</catalogTemplate>
</document>Mẫu TVML CatalogTemplate chứa biểu ngữ có tiêu đề và các phần có phần tử lockup. Mỗi lockup là một thẻ phim có hình ảnh và tiêu đề. Focus Engine tự động quản lý điều hướng giữa các phần tử lockup. Khi nhấn, trình xử lý TVJS nhận sự kiện select và có thể hiển thị trang chi tiết qua ProductTemplate.
TVJS là môi trường JavaScript biệt lập khỏi ứng dụng chính. Mã TVJS được gọi khi tải mẫu TVML và xử lý sự kiện. TVJS có quyền truy cập vào API native qua Appliance và Player để điều khiển phát lại video. Apple khuyến nghị chỉ sử dụng TVMLKit cho ứng dụng đa phương tiện có cập nhật nội dung thường xuyên. Đối với trò chơi và ứng dụng tương tác, SwiftUI được ưu tiên.
Xuất bản ứng dụng tvOS yêu cầu đăng ký Apple Developer Program ($99/năm). Ứng dụng được tải lên qua App Store Connect dưới dạng sản phẩm riêng hoặc một phần của tệp nhị phân phổ quát (iOS + tvOS). App Review kiểm tra tính ổn định, tuân thủ HIG và giới hạn kích thước 4 GB.
Xcode tạo mục tiêu tvOS với phần mở rộng .app (gói .ipa). Kiến trúc — arm64 (Apple TV sử dụng chip ARM Apple Silicon). tvOS không hỗ trợ framework với i386 hoặc x86_64. Ứng dụng được ký bằng chứng chỉ Apple Development (thử nghiệm) hoặc Apple Distribution (xuất bản). Có thể phân phối qua Volume Purchase Program cho khách hàng doanh nghiệp.
Yêu cầu đặc biệt của tvOS: tất cả các phần tử giao diện phải có thể truy cập qua Focus Engine mà không cần màn hình cảm ứng hay bàn phím. Ứng dụng yêu cầu ủy quyền phải hỗ trợ đăng nhập một lần (SSO) qua iTunes Store. Nội dung quảng cáo không được làm gián đoạn phát lại mà không có sự đồng ý của người dùng. Kích thước tệp nhị phân tải lên không được vượt quá 4 GB.
| Yêu cầu | Mô tả |
|---|---|
| Kích thước ứng dụng | Không quá 4 GB, khuyến nghị 500 MB |
| Độ phân giải đồ họa | @2x (1920×1080) và @4x (3840×2160) cho 4K |
| Điều hướng tiêu điểm | Tất cả phần tử có thể truy cập qua Siri Remote |
| Định dạng video | H.264, HEVC, Dolby Vision (Profile 5) |
| Âm thanh | Dolby Atmos (E-AC-3 JOC) và âm thanh nổi AAC |
Câu hỏi thường gặp
Ngôn ngữ chính là Swift với các framework SwiftUI và UIKit. Đối với ứng dụng đa phương tiện, TVMLKit với JavaScript và các mẫu TVML tải từ máy chủ được sử dụng. Objective-C được hỗ trợ cho các dự án cũ. Apple khuyến nghị SwiftUI cho tất cả các dự án tvOS mới.
tvOS sử dụng Focus Engine thay vì sự kiện chạm, không có camera hay micrô (trừ Siri Remote), giới hạn kích thước ứng dụng 4 GB, không hỗ trợ bộ nhớ cục bộ vĩnh viễn (purgeable) và yêu cầu sử dụng Metal để kết xuất. Tất cả ứng dụng chỉ chạy trên ARM64.
Focus Engine quản lý việc di chuyển tiêu điểm giữa các phần tử UI bằng Siri Remote. Nhà phát triển đặt tiêu điểm ưu tiên qua preferredFocusEnvironments. UIFocusHeading (up, down, left, right) xác định hướng. UIFocusEffect tự động thêm hiệu ứng thị sai và bóng đổ vào phần tử đang hoạt động.
Việc xuất bản yêu cầu đăng ký Apple Developer Program ($99/năm). Ứng dụng được tải lên qua Xcode Organizer hoặc Transporter lên App Store Connect. Quy trình kiểm duyệt kiểm tra: khả năng tương thích Focus Engine, tính ổn định, không có UIWebView và giới hạn kích thước 4 GB.
Có, UIKit được hỗ trợ đầy đủ trong tvOS: UIView, UIViewController, UICollectionView, UITableView. Tuy nhiên, UIKit được điều chỉnh cho Focus Engine: UIButton và UIControl nhận sự kiện qua nhấn điều khiển từ xa, không phải chạm. SwiftUI được khuyến nghị cho các dự án mới do khả năng tự động thích ứng với tiêu điểm.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm