Что такое TVMLKit для tvOS?

«Что такое TVMLKit для tvOS?» — вопрос из категории Other, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TVMLKit — это фреймворк Apple для создания гибридных приложений под tvOS (Apple TV), который позволяет описывать пользовательский интерфейс с помощью декларативного языка разметки TVML (Apple TV Markup Language), а бизнес-логику — на JavaScript (TVJS).

Архитектура TVMLKit-приложения

┌─────────────────────────────────────────┐
│         Нативный код (Swift/ObjC)       │
│           (TVApplicationController)      │
├─────────────────────────────────────────┤
│         JavaScript-логика (TVJS)        │
├─────────────────────────────────────────┤
│   UI-разметка и шаблоны (TVML, XML)     │
└─────────────────────────────────────────┘

Основные компоненты

  1. TVML (Markup Language): XML-подобный язык для описания экранов и элементов интерфейса (списки, карусели, информационные карточки).

    <!-- Пример TVML-шаблона -->
    <document>
      <stackTemplate>
        <banner>
          <title>Главный экран</title>
        </banner>
        <collectionList>
          <shelf>
            <section>
              <lockup>
                <img src="{{IMAGE_URL}}" />
                <title>{{TITLE}}</title>
              </lockup>
            </section>
          </shelf>
        </collectionList>
      </stackTemplate>
    </document>
  2. TVJS: JavaScript-код, который обрабатывает события, загружает данные и управляет навигацией между TVML-шаблонами.

  3. TVApplicationController (нативная часть): Мост между нативным кодом на Swift/Objective-C и JavaScript-контекстом. Позволяет обмениваться данными и вызывать методы.

Пример инициализации на Swift

import TVMLKit

class AppDelegate: UIResponder, UIApplicationDelegate, TVApplicationControllerDelegate {
    var appController: TVApplicationController?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions... ) -> Bool {
        let window = UIWindow(frame: UIScreen.main.bounds)

        // Конфигурация контекста
        let appControllerContext = TVApplicationControllerContext()

        // Указание путей к JS и TVML файлам
        if let jsURL = Bundle.main.url(forResource: "main", withExtension: "js") {
            appControllerContext.javaScriptApplicationURL = jsURL
        }
        appControllerContext.launchOptions["BASEURL"] = "https://api.example.com/"

        // Создание контроллера
        appController = TVApplicationController(context: appControllerContext,
                                                window: window,
                                                delegate: self)
        return true
    }
}

Преимущества

  • Быстрая разработка UI: использование готовых, оптимизированных под TV шаблонов (Catalog, Stack, Compilation).
  • Гибкость обновлений: TVML и JS-часть можно обновлять с сервера без перевыпуска приложения в App Store.
  • Разделение ответственности: дизайнеры могут работать над TVML-шаблонами, а разработчики — над нативной логикой.

Недостатки и текущий статус

  • Ограниченная кастомизация UI: сложно выйти за рамки стандартных шаблонов.
  • Производительность: JavaScript-движок может быть менее производительным, чем нативный код, для сложных операций.
  • Устаревание: Apple смещает фокус на SwiftUI для разработки под tvOS. TVMLKit подходит для поддержки legacy-проектов или специфических сценариев (например, TV-приложений с часто обновляемым контентом).

Рекомендация: Для новых tvOS-проектов предпочтительнее использовать SwiftUI.