Ответ
TVMLKit — это фреймворк Apple для создания гибридных приложений под tvOS (Apple TV), который позволяет описывать пользовательский интерфейс с помощью декларативного языка разметки TVML (Apple TV Markup Language), а бизнес-логику — на JavaScript (TVJS).
Архитектура TVMLKit-приложения
┌─────────────────────────────────────────┐
│ Нативный код (Swift/ObjC) │
│ (TVApplicationController) │
├─────────────────────────────────────────┤
│ JavaScript-логика (TVJS) │
├─────────────────────────────────────────┤
│ UI-разметка и шаблоны (TVML, XML) │
└─────────────────────────────────────────┘
Основные компоненты
-
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> -
TVJS: JavaScript-код, который обрабатывает события, загружает данные и управляет навигацией между TVML-шаблонами.
-
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.