TV App — eine Anwendung für Smart-TVs, die auf den Plattformen Apple TV (tvOS) und Android TV (Google TV) läuft. Im Gegensatz zu mobilen Apps wird TV App unter Berücksichtigung der Fernbedienungsnavigation, des Fokusmanagements (Focus Engine) und der spezifischen Anforderungen an die Benutzeroberfläche auf einem großen Bildschirm entwickelt. Die Entwicklung erfolgt in Swift/SwiftUI für Apple TV und in Kotlin mit der Leanback Library für Android TV. Laut Statista (2026) laufen weltweit über 250 Millionen Geräte auf diesen Plattformen, was TV App zu einer vielversprechenden Nische für Entwickler macht. Betrachten wir die Plattformarchitektur, das Fokusmanagement, Codebeispiele und den Veröffentlichungsprozess.
Wichtige Erkenntnisse
TV App — eine Anwendung, die für den Betrieb auf Smart-TV-Plattformen entwickelt wurde: Apple TV (tvOS) und Android TV (Google TV). Der Hauptunterschied zu einer mobilen App ist die Interaktionsmethode. Der Benutzer berührt nicht den Bildschirm, sondern steuert die Oberfläche mit einer Fernbedienung. Alle Elemente müssen durch direktionale Navigation (D-pad) zugänglich sein: nach oben, unten, links, rechts und die Auswahltaste.
Besonderheiten der TV App-Entwicklung: Die Bildschirmauflösung reicht von Full HD (1920x1080) bis 4K (3840x2160) mit xhdpi-Dichte (Android) oder @3x (Apple). Eine Sicherheitszone von 5% von den Rändern ist obligatorisch, um Over-Scan zu kompensieren (ein Teil des Bildes kann vom Fernseher abgeschnitten werden). Es gibt keinen Touchscreen — alle Interaktionen erfolgen über die Fernbedienung oder das Gamepad. Der Fokus hebt immer das aktive Element hervor. Der Stromverbrauch ist nicht durch den Akku begrenzt, aber die App muss den Übergang in den Schlafmodus korrekt behandeln. Laut Statista (2026) übersteigt der globale Smart-TV-Markt 80% der neuen Fernseher, wobei Apple TV und Android TV über 250 Millionen Geräte ausmachen.
Kategorien von TV-Anwendungen: Videodienste (Netflix, YouTube, Apple TV+), Musik (Spotify, Apple Music), Spiele (Apple Arcade, Google Play Games), Fitness (Apple Fitness+, Peloton), Bildung, Nachrichten, Wetter, Fotos. Die beliebteste Kategorie ist Video-Streaming, das 70% der gesamten Nutzungszeit von Smart-TVs ausmacht.
tvOS ist das Betriebssystem von Apple für die Apple TV-Set-Top-Box, basierend auf iOS. Die erste Veröffentlichung war 2015 zusammen mit der 4. Generation des Apple TV. tvOS teilt mit iOS den XNU-Kernel, die Foundation-Frameworks, UIKit (in einer angepassten Version) und den Sicherheitsmechanismus App Sandbox. Die Entwicklung erfolgt in Swift mit SwiftUI oder UIKit.
Wichtige Komponenten von tvOS:
Der Lebenszyklus einer tvOS-App ähnelt iOS: notRunning, foregroundActive, foregroundInactive, background. Besonderheit: Die App sollte keine Hintergrundberechtigungen ohne Notwendigkeit anfordern — das System kann einen Hintergrundprozess zwangsweise beenden. Die Navigationstopologie wird um UISplitViewController und UITabBarController mit den Tabs "Start", "Suche", "Bibliothek", "Einstellungen" aufgebaut.
Android TV ist eine für Fernseher und Set-Top-Boxen optimierte Version von Android, die erstmals 2014 vorgestellt wurde. Seit 2020 existiert Google TV — eine Überlagerung von Android TV mit einer neuen Oberfläche, aber die App-Entwicklung erfolgt mit dem Android TV SDK, das mit Google TV kompatibel ist. Die Hauptsprache ist Kotlin, die UI-Frameworks sind Leanback Library (klassisch) und Jetpack Compose for TV (experimentell).
Schlüsselkomponenten von Android TV:
Unterschiede zwischen Android TV und mobilem Android: Die App muss die Kategorie LEANBACK_LAUNCHER im Manifest deklarieren; die minimale Layoutbreite beträgt 1920dp; Touch-Interaktion wird durch D-pad-Navigation ersetzt; die Verwendung von Leanback-Fragmenten wird empfohlen; Hardwarebeschleunigung ist obligatorisch. Der Build enthält APK/AAB mit Unterstützung für ARM64- und x86-Architekturen. Für moderne Projekte ab 2025 wird Jetpack Compose for TV mit Komponenten wie TvLazyColumn, TvButton, TvCard empfohlen.
Focus Engine — eine Schlüsselkomponente jeder TV-Plattform, die dafür verantwortlich ist, welches Oberflächenelement aktiv ist. Auf tvOS ist die Focus Engine in UIKit integriert und arbeitet automatisch. Wenn eine D-pad-Taste gedrückt wird, analysiert das System die Position aller fokussierbaren Elemente, berechnet den nächsten Kandidaten in Druckrichtung und bewegt den Fokus sanft mit Animation (UIFocusAnimationCoordinator) darauf.
Regeln der Focus Engine: Das System berücksichtigt den Abstand zwischen Elementen entlang der Bewegungsachse, die Überschneidung der Elementprojektionen (ein Element gilt als Kandidat, wenn seine Projektion die Projektion des aktuellen Fokus schneidet), die Priorität von Elementen mit gleichem Abstand (das nächste in gerader Linie wird ausgewählt). Der Entwickler kann den Fokus mit UIFocusGuide beeinflussen — einem unsichtbaren Führungsrechteck, das den Fokus bei Druck in eine bestimmte Richtung auf ein bestimmtes Element umleitet.
Auf Android TV wird der Fokus durch das standardmäßige Android-Fokussystem mit den Attributen focusable und nextFocus* (nextFocusDown, nextFocusUp, nextFocusLeft, nextFocusRight) implementiert. Die Animation wird über StateListAnimator konfiguriert. Google empfiehlt, focusable auf allen interaktiven Elementen zu setzen und nextFocus für präzise Navigationssteuerung zu verwenden. Fokusanimation ist entscheidend für die Benutzererfahrung — beim Fokuswechsel sollte eine sanfte Skalierungsanimation (1.0 → 1.05–1.2) mit einer Dauer von 150–250 ms erfolgen.
Ein Beispiel einer einfachen TV-App in SwiftUI für Apple TV, die eine Liste von Filmen mit Focus Engine-Unterstützung anzeigt.
import SwiftUI
struct Movie: Identifiable {
let id = UUID()
let title: String
let subtitle: String
}
struct ContentView: View {
@FocusState private var focusedMovie: UUID?
let movies: [Movie] = [
Movie(title: "Inception", subtitle: "2010, Sci-Fi"),
Movie(title: "Interstellar", subtitle: "2014, Sci-Fi"),
Movie(title: "The Matrix", subtitle: "1999, Action"),
Movie(title: "Blade Runner 2049", subtitle: "2017, Sci-Fi"),
]
var body: some View {
VStack(alignment: .leading, spacing: 40) {
Text("Filme").font(.title).padding(.leading, 60)
ScrollView(.horizontal, showsIndicators: false) {
HStack(spacing: 40) {
ForEach(movies) { movie in
VStack {
Image(systemName: "film.fill")
.resizable()
.frame(width: 200, height: 300)
.cornerRadius(12)
.focusable()
.focused($focusedMovie, equals: movie.id)
Text(movie.title).font(.headline)
Text(movie.subtitle).font(.subheadline).foregroundColor(.secondary)
}
.scaleEffect(focusedMovie == movie.id ? 1.15 : 1.0)
.animation(.easeInOut(duration: 0.2), value: focusedMovie)
}
}
.padding(.horizontal, 60)
}
}
.onAppear { focusedMovie = movies.first?.id }
}
}
Wichtige Punkte: @FocusState — Verfolgung des aktuellen Fokus; .focusable() — macht ein Element fokussierbar; .scaleEffect() — eine Zoom-Animation bei Fokus, wichtig für visuelles Feedback auf dem Fernseher.
Ein ähnliches Beispiel für Android TV mit der Leanback Library in Kotlin:
// MainActivity.kt
class MainActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
class MainFragment : BrowseSupportFragment() {
private val moviePresenter = MoviePresenter()
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
title = getString(R.string.app_name)
headersState = HEADERS_ENABLED
setupAdapter()
}
private fun setupAdapter() {
val rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
val listRowAdapter = ArrayObjectAdapter(moviePresenter)
listRowAdapter.add(Movie("Inception", "2010", R.drawable.poster_1))
listRowAdapter.add(Movie("Interstellar", "2014", R.drawable.poster_2))
rowsAdapter.add(ListRow(HeaderItem(0, "Movies"), listRowAdapter))
adapter = rowsAdapter
}
}
data class Movie(val title: String, val subtitle: String, val imageResId: Int)
class MoviePresenter : Presenter() {
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
val cardView = ImageCardView(parent.context).apply {
isFocusable = true
setMainImageDimensions(200, 300)
}
return ViewHolder(cardView)
}
override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
val movie = item as Movie
(viewHolder.view as ImageCardView).apply {
titleText = movie.title
contentText = movie.subtitle
}
}
override fun onUnbindViewHolder(viewHolder: ViewHolder) {}
}
Wichtige Punkte: BrowseSupportFragment — das Haupt-Leanback-Fragment mit Überschriften; Presenter — eine Abstraktion zum Erstellen von ViewHolder, ähnlich wie RecyclerView.Adapter; ImageCardView — eine Standardkarte mit Bild, Titel und Untertitel; isFocusable = true — ein obligatorisches Attribut für TV-Elemente.
Häufig gestellte Fragen
Eine TV App wird mit einer Fernbedienung (D-pad) anstatt durch Berührung gesteuert, verwendet Focus Engine zur Navigation, ist für große Bildschirme (Full HD oder 4K) optimiert und hat keine Batterieeinschränkungen. Alle Elemente müssen durch direktionale Fokusbewegung zugänglich sein.
Die Focus Engine ist ein System auf tvOS, das automatisch das aktive Oberflächenelement bestimmt. Wenn eine D-pad-Taste gedrückt wird, analysiert das System die Position der fokussierbaren Elemente, berechnet den nächsten Kandidaten und bewegt den Fokus sanft mit Animation darauf.
Das Hauptframework ist Leanback Library (BrowseFragment, DetailsFragment, PlaybackOverlayFragment). Für moderne Projekte ist auch Jetpack Compose for TV mit experimenteller Unterstützung verfügbar.
Für die anfängliche Entwicklung reichen Simulatoren aus: Xcode enthält den tvOS-Simulator mit Siri Remote, Android Studio enthält den Android TV-Emulator. Für abschließende Tests wird ein physisches Gerät empfohlen.
Die Apple TV App wird über App Store Connect mit Xcode Organizer veröffentlicht. Die Android TV App wird über Google Play Console mit LEANBACK_LAUNCHER-Deklaration im Manifest und 1920x1080-Screenshots veröffentlicht.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch