tvOS: Phát triển ứng dụng cho Apple TV với Focus Engine

Tác giả: IT Sectr Đã đăng: 2026-02-07 Thời gian đọc: 11 phút

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ã TV trên nhân XNU với Focus Engine thay vì chạm
  • Focus Engine — Hệ thống quản lý tiêu điểm giữa các phần tử qua Siri Remote
  • SwiftUI và TVMLKit — Hai cách tiếp cận phát triển: native và mẫu JavaScript
  • Top Shelf — Nội dung động trên màn hình chính Apple TV
  • Kích thước ứng dụng bị giới hạn nghiêm ngặt ở mức 4 GB, khuyến nghị không quá 500 MB

tvOS là gì?

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).

Lịch sử phiên bản tvOS

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 tvOSNămCải tiến chính
tvOS 92015App Store, SDK, Siri Remote
tvOS 102016Đăng nhập một lần (SSO), Live Tune-In
tvOS 112017Amazon Prime, chế độ tự động
tvOS 122018Dolby Atmos, mật khẩu qua iPhone
tvOS 132019Nhiều người dùng, Trung tâm điều khiển trên TV
tvOS 172023FaceTime, VPN, Tìm Siri Remote

Kiến trúc tvOS và sự khác biệt so với iOS

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.

Giới hạn phần cứng

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 và TVJS

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.

Thiếu bộ nhớ vĩnh viễn

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).

swift
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: điều hướng và tiêu điểm

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.

UIFocusEnvironment và hệ thống phân cấp tiêu điểm

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.

UIFocusEffect và hiệu ứng thị sai

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).

swift
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: cử chỉ và nút bấm

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 và màn hình ứng dụng

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.

Kiểu Top Shelf

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 ứng dụng

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ạngKhi nào sử dụng
SectionedCác phần có tiêu đề và mụcSeries, podcast, danh sách phát
InsetMột mục lớn có mô tảPhim trong ngày, độc quyền
PhotoLưới ảnh không có chú thíchAlbum ảnh, thư viện
TabTab có chuyển đổiThể thao theo loại, tin tức theo chủ đề

SwiftUI cho Apple TV

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.

Thích ứng với tvOS

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 iOSTương đương tvOSGhi chú
UISliderUIProgressView + nút bấmSlider không được hỗ trợ
UIPickerViewBảng có tiêu điểmPicker được thay bằng danh sách
UITextFieldUIAlertController (chỉ đọc)Nhập văn bản qua Siri
UIActionSheetUIAlertControllerĐược hỗ trợ
UIWebViewKhông được hỗ trợSử dụng WKWebView
MFMailComposeKhông được hỗ trợMở URL mailto:

Khuyến nghị thiết kế

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 và ứng dụng đa phương tiện

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: cấu trúc mẫu

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.

xml
<!-- 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: xử lý sự kiện

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 AppliancePlayer để đ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

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.

Xây dựng và phân phối

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ủa App Review

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ầuMô tả
Kích thước ứng dụngKhô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ểmTất cả phần tử có thể truy cập qua Siri Remote
Định dạng videoH.264, HEVC, Dolby Vision (Profile 5)
Âm thanhDolby Atmos (E-AC-3 JOC) và âm thanh nổi AAC

Câu hỏi thường gặp

Những ngôn ngữ nào được sử dụng để phát triển tvOS?

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 khác iOS như thế nào?

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 hoạt động như thế nào trong tvOS?

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.

Làm thế nào để xuất bản ứng dụng cho Apple TV?

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ó thể sử dụng UIKit trong tvOS không?

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

  • tvOS — Hệ điều hành của Apple cho hộp giải mã TV trên nhân XNU với điều khiển Focus Engine
  • Focus Engine thay thế điều khiển chạm bằng di chuyển tiêu điểm qua Siri Remote với hiệu ứng thị sai
  • TVMLKit — một framework độc đáo cho ứng dụng đa phương tiện bằng JavaScript với mẫu TVML từ máy chủ
  • Top Shelf cung cấp nội dung động trên màn hình chính qua TVTopShelfProvider
  • SwiftUI được hỗ trợ đầy đủ từ tvOS 13 với các bổ từ focusable, focusSection và onPlayPauseCommand
  • Giới hạn tvOS: kích thước 4 GB, bộ nhớ purgeable, không có camera, UIWebView hoặc MFMailCompose
  • Xuất bản yêu cầu Apple Developer Program, đồ họa @2x/@4x, định dạng HEVC và Dolby Atmos

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.

Thảo luận dự án

Đọc thêm