tvOS: تطوير Apple TV باستخدام Focus Engine

المؤلف: IT Sectr نُشر: 2026-02-07 وقت القراءة: 11 دق

tvOS — نظام تشغيل Apple لأجهزة Apple TV، تم إطلاقه لأول مرة في 2015 مع الجيل الرابع من Apple TV. يتم تطوير التطبيقات لـ tvOS بلغة Swift باستخدام SwiftUI وTVMLKit. الفرق الرئيسي عن iOS هو التحكم في التركيز عبر Siri Remote بدلاً من اللمس. وفقاً لـ Apple، tvOS مثبت على أكثر من 100 مليون جهاز نشط حول العالم.

النقاط الرئيسية

  • tvOS — نظام تشغيل Apple لأجهزة فك التلفزيون على نواة XNU مع Focus Engine بدلاً من اللمس
  • Focus Engine — نظام إدارة التركيز بين العناصر عبر Siri Remote
  • SwiftUI وTVMLKit — نهجان للتطوير: أصلي وقوالب JavaScript
  • Top Shelf — محتوى ديناميكي على الشاشة الرئيسية لـ Apple TV
  • حجم التطبيق محدود بدقة بـ 4 جيجابايت، ويوصى بألا يتجاوز 500 ميجابايت

ما هو tvOS؟

tvOS — نظام تشغيل Apple لأجهزة Apple TV، المبني على نفس نواة Darwin XNU مثل iOS. تم إطلاقه لأول مرة في 30 أكتوبر 2015 مع Apple TV من الجيل الرابع. حل 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 (4K الجيل الأول)، A12 Bionic (4K الجيل الثاني) وA15 Bionic (4K الجيل الثالث). جميع الموديلات تدعم tvOS 17. لا يحتوي tvOS على كاميرا، ميكروفون (باستثناء جهاز التحكم)، شاشة لمس أو GPS.

الميزة الرئيسية لـ tvOS هي Focus Engine، الذي يستبدل التحكم باللمس بالتنقل بالتركيز. يقوم المستخدم بتحريك التحديد بين عناصر واجهة المستخدم باستخدام Siri Remote. يقوم المطورون بإنشاء تطبيقات بلغة Swift/SwiftUI (أصلية) أو JavaScript/TVML (تطبيقات الوسائط مثل Netflix، Hulu).

تاريخ إصدارات tvOS

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 92015App Store، SDK، Siri Remote
tvOS 102016تسجيل الدخول الموحد (SSO)، Live Tune-In
tvOS 112017Amazon Prime، الوضع التلقائي
tvOS 122018Dolby Atmos، كلمة المرور عبر iPhone
tvOS 132019متعدد المستخدمين، مركز التحكم على التلفزيون
tvOS 172023FaceTime، VPN، العثور على Siri Remote

هندسة tvOS والاختلافات عن iOS

هندسة tvOS مبنية على نفس مجموعة التقنيات مثل iOS: نواة XNU، خدمات النظام Core Services، طبقة الوسائط Media وطبقة المستخدم Cocoa Touch. ومع ذلك، هناك اختلافات كبيرة تتعلق بخصائص منصة التلفزيون.

قيود الأجهزة

يستخدم Apple TV 4K من الجيل الثالث معالج A15 Bionic مع 6 أنوية CPU (2 أداء، 4 كفاءة) وGPU بخمسة أنوية. RAM — 4 جيجابايت (تخزين SSD داخلي من 64 جيجابايت). لا يحتوي النظام على تخزين محلي دائم بالمعنى التقليدي: يمكن لـ tvOS حذف جميع بيانات التطبيقات عند ضيق المساحة (purgeable). يجب على المطور استخدام iCloud Key-Value Storage أو CloudKit للحفاظ على الحالة.

TVMLKit وTVJS

TVMLKit — إطار عمل فريد لـ tvOS يتيح إنشاء واجهات بلغة JavaScript وTVML (لغة شبيهة بـ XML خاصة بـ Apple). يقوم TVMLKit بتحميل JSON/XML من الخادم ويعرض مكونات واجهة أصلية. هذه هي التقنية الرئيسية لخدمات البث: Netflix، Hulu، Amazon Prime Video تستخدم TVMLKit. TVJS — بيئة JavaScript تعمل في سياق معزول.

غياب التخزين الدائم

يدير tvOS مساحة القرص تلقائياً: عند ضيق المساحة، قد يحذف النظام ذاكرة التخزين المؤقت والموارد التي تم تنزيلها وحتى التطبيق نفسه (مع الاحتفاظ بالأيقونة). عند إعادة الفتح، يجب على التطبيق استعادة حالته. iCloud NSUbiquitousKeyValueStore هو التخزين الدائم الوحيد المضمون للإعدادات (حتى 1 ميجابايت لكل تطبيق).

swift
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: التنقل والتركيز

Focus Engine — الآلية الرئيسية لـ tvOS التي تستبدل أحداث اللمس بالتنقل بالتركيز. يقوم المستخدم بتحريك التحديد بين عناصر واجهة المستخدم باستخدام Siri Remote (سطح اللمس أو الأزرار). يحسب النظام تلقائياً عنصر التركيز التالي بناءً على المسافة واتجاه الحركة.

UIFocusEnvironment والتسلسل الهرمي للتركيز

كل عنصر واجهة قادر على استقبال التركيز يطبق بروتوكول UIFocusEnvironment. يحدد UIKit تلقائياً ترتيب التنقل بناءً على هندسة العناصر. يمكن للمطور تجاوز التركيز المفضل عبر preferredFocusEnvironments، وتحديد مصفوفة من focusEnvironment الفرعية والتحكم في الحركة عبر UIFocusHeading (up, down, left, right). يسمح UIFocusGuide بتعيين مسارات مخصصة للتخطيطات غير التقليدية.

UIFocusEffect والتزيح المنظوري

يضيف tvOS تلقائياً UIFocusEffect إلى العنصر المركّز: ظل، إضاءة وتأثير تزيح منظور (إزاحة عند إمالة جهاز التحكم). يمكن للمطور تعطيل التأثير عبر focusedValue أو تخصيصه من خلال UIFocusEffect.transform. في SwiftUI، يضاف التزيح المنظوري باستخدام المعدل .hoverEffect(.highlight).

swift
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. focusEffect يقوم بتجميع شبكة للتنقل الدائري.

Siri Remote: الإيماءات والأزرار

Siri Remote من الجيل الثاني (2021) يحتوي على سطح لمس، 5 أزرار وميكروفون. يدعم tvOS الإيماءات: التمرير (تنقل)، النقر (تحديد)، النقر المزدوج (تمركز)، الضغط للتكبير/التصغير (صور)، الضغط الطويل (قائمة سياقية). UIPress بأنواع .select، .playPause، .menu، .upArrow، .downArrow، .leftArrow، .rightArrow — أنواع ضغط محددة مسبقاً. يستخدم ميكروفون جهاز التحكم لـ Siri والبحث الصوتي.

Top Shelf وشاشة التطبيقات

Top Shelf هي منطقة على الشاشة الرئيسية لـ Apple TV تعرض محتوى ديناميكياً للتطبيق عندما يكون في الصف العلوي. في tvOS 17، يدعم Top Shelf حتى 8 ويدجت بخلفيات مخصصة وعناصر تفاعلية. يقوم المطور بتطبيق TVTopShelfProvider لتوفير المحتوى.

أنماط Top Shelf

يتوفر ثلاثة أنماط لـ Top Shelf: Sectioned — قائمة مصنفة (مسلسلات حسب النوع)، Inset — عنصر مركزي مع وصف تفصيلي (فيلم موصى به)، Photo — شبكة صور (ألبومات صور). يقوم النظام بتحديث Top Shelf في الخلفية عبر BGTaskScheduler، على غرار watchOS. يجب على المزود إرجاع المحتوى بسرعة — يخزن tvOS البيانات مؤقتاً لمدة 24 ساعة.

شاشة التطبيقات

تتكون الشاشة الرئيسية لـ tvOS من صف Top Shelf وشبكة تطبيقات. يمكن للمستخدمين إعادة ترتيب الأيقونات وإنشاء مجلدات. يقوم tvOS تلقائياً بتفريغ التطبيقات من الذاكرة عند نقص الموارد، لذلك يجب على المطور معالجة UISceneDidDisconnectNotification بشكل صحيح واستعادة الحالة عند إعادة التشغيل.

نمط Top Shelfالتنسيقمتى تستخدم
Sectionedأقسام بعناوين وعناصرمسلسلات، بودكاست، قوائم تشغيل
Insetعنصر كبير واحد مع وصففيلم اليوم، حصري
Photoشبكة صور بدون تعليقاتألبومات صور، معارض
Tabعلامات تبويب مع تبديلرياضة حسب النوع، أخبار حسب الموضوع

SwiftUI لـ Apple TV

SwiftUI مدعوم بالكامل في tvOS بدءاً من tvOS 13. توصي Apple باستخدام SwiftUI لجميع المشاريع الجديدة. يعمل نفس كود SwiftUI على iOS، iPadOS، macOS وtvOS مع تعديلات طفيفة لـ Focus Engine. يوفر SwiftUI لـ tvOS المعدلات .focusable()، .focusSection()، .onPlayPauseCommand و .onExitCommand.

التكيف مع tvOS

عند نقل تطبيق iOS إلى tvOS، يجب: استبدال TabView بـ NavigationView مع التنقل بالتركيز، زيادة حجم الخطوط (30 نقطة على الأقل للعناوين، 22 نقطة للنص)، إضافة هوامش (40 نقطة على الأقل من الحواف — المنطقة الآمنة على أجهزة التلفزيون). tvOS لا يدعم UIAlertController مع حقل نص، UIWebView أو MFMailComposeViewController.

مكون iOSالنظير في tvOSملاحظة
UISliderUIProgressView + أزرارSlider غير مدعوم
UIPickerViewجدول مع تركيزPicker مستبدل بقائمة
UITextFieldUIAlertController (للقراءة فقط)إدخال النص عبر Siri
UIActionSheetUIAlertControllerمدعوم
UIWebViewغير مدعوماستخدم WKWebView
MFMailComposeغير مدعومافتح رابط mailto:

توصيات التصميم

HIG من Apple لـ tvOS: الحد الأدنى لحجم منطقة اللمس 60×60 نقطة، النص مقروء من مسافة 3 أمتار (حجم خط لا يقل عن 22pt للنص)، تباين النص 4.5:1، خلفية داكنة (الخلفية الفاتحة تسبب وهجاً على شاشات OLED)، جميع العناصر متاحة بدون إيماءات معقدة. الدقة: Apple TV 4K يخرج 3840×2160 (4K) أو 1920×1080 (HD) بمعدل 60 إطاراً في الثانية. يجب أن تكون جميع الصور بدقة @2x (لـ 1080p) و@4x (لـ 4K).

TVMLKit وتطبيقات الوسائط

TVMLKit — إطار عمل لإنشاء تطبيقات الوسائط على tvOS باستخدام تقنيات الويب: JavaScript (TVJS) وTVML (XML خاص بـ Apple). تطبيقات TVMLKit لا تتطلب تجميعاً — الواجهة تُحمّل من الخادم، مما يسمح بتحديث المحتوى دون المرور عبر App Review. تستخدمه خدمات البث الرئيسية لعربات المحتوى.

TVML: هيكل القوالب

يوفر TVML قوالب جاهزة: CatalogTemplate (كتالوج بأقسام)، ProductTemplate (صفحة تفاصيل المحتوى)، FormTemplate (نماذج تسجيل الدخول)، LoadingTemplate (مؤشر التحميل). تُوصف القوالب في XML وتُنسق عبر سمات شبيهة بـ CSS. كود TVJS يعالج الضغطات ويستدعي واجهات برمجة التطبيقات الأصلية.

xml
<!-- 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: معالجة الأحداث

TVJS هي بيئة JavaScript معزولة عن التطبيق الرئيسي. يتم استدعاء كود TVJS عند تحميل قالب TVML ومعالجة الأحداث. TVJS لديه وصول إلى واجهات برمجة التطبيقات الأصلية عبر Appliance وPlayer للتحكم في تشغيل الفيديو. توصي Apple باستخدام TVMLKit فقط لتطبيقات الوسائط ذات التحديثات المتكررة للمحتوى. للألعاب والتطبيقات التفاعلية، يفضل SwiftUI.

نشر تطبيقات tvOS

نشر تطبيق 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 للعملاء التجاريين متاح.

متطلبات App Review

متطلبات خاصة لـ 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

الأسئلة الشائعة

ما اللغات المستخدمة لتطوير tvOS؟

اللغة الرئيسية هي Swift مع أطر SwiftUI وUIKit. لتطبيقات الوسائط، يُستخدم TVMLKit مع JavaScript وقوالب TVML المحملة من الخادم. Objective-C مدعوم للمشاريع القديمة. توصي Apple باستخدام SwiftUI لجميع مشاريع tvOS الجديدة.

كيف يختلف tvOS عن iOS؟

tvOS يستخدم Focus Engine بدلاً من أحداث اللمس، لا يحتوي على كاميرا أو ميكروفون (باستثناء Siri Remote)، يحد حجم التطبيق بـ 4 جيجابايت، لا يدعم التخزين المحلي الدائم (purgeable) ويتطلب استخدام Metal للعرض. جميع التطبيقات تعمل فقط على ARM64.

كيف يعمل Focus Engine في tvOS؟

Focus Engine يدير حركة التركيز بين عناصر واجهة المستخدم باستخدام Siri Remote. يحدد المطور التركيز المفضل عبر preferredFocusEnvironments. UIFocusHeading (up, down, left, right) يحدد الاتجاه. UIFocusEffect يضيف تلقائياً التزيح المنظوري والظل إلى العنصر النشط.

كيف تنشر تطبيقات Apple TV؟

النشر يتطلب اشتراكاً في Apple Developer Program (99 دولاراً / سنة). يتم تحميل التطبيق عبر Xcode Organizer أو Transporter إلى App Store Connect. تتحقق المراجعة من: التوافق مع Focus Engine، الاستقرار، عدم وجود UIWebView وحد الحجم 4 جيجابايت.

هل يمكن استخدام UIKit في tvOS؟

نعم، UIKit مدعوم بالكامل في tvOS: UIView، UIViewController، UICollectionView، UITableView. ومع ذلك، تم تكييف UIKit مع Focus Engine: UIButton وUIControl يتلقيان الأحداث عبر ضغط جهاز التحكم، وليس اللمس. يُوصى باستخدام SwiftUI للمشاريع الجديدة بسبب التكيف التلقائي مع التركيز.

الملخص

  • tvOS — نظام تشغيل Apple لأجهزة فك التلفزيون على نواة XNU مع تحكم Focus Engine
  • Focus Engine يستبدل التحكم باللمس بحركة التركيز عبر Siri Remote مع تأثيرات تزيح منظور
  • TVMLKit — إطار عمل فريد لتطبيقات الوسائط بلغة JavaScript مع قوالب TVML من الخادم
  • Top Shelf يوفر محتوى ديناميكياً على الشاشة الرئيسية عبر TVTopShelfProvider
  • SwiftUI مدعوم بالكامل منذ tvOS 13 مع معدلات focusable، focusSection و onPlayPauseCommand
  • قيود tvOS: حجم 4 جيجابايت، تخزين purgeable، بدون كاميرا، UIWebView أو MFMailCompose
  • النشر يتطلب Apple Developer Program، رسومات @2x/@4x، تنسيق HEVC و Dolby Atmos

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا