swiftship/internal/skills/data/always-tvos/tvos-patterns/SKILL.md
tvOS platform patterns: Siri Remote input handling, Top Shelf extensions, media playback, focus engine, parallax effects. Use when building tvOS-specific features, handling remote input, or implementing TV app patterns. Triggers: tvOS, Siri Remote, Top Shelf, AVPlayer, onMoveCommand, onPlayPauseCommand, focus engine.
npx skillsauth add abdullah4ai/apple-dev-docs tvos-patternsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
tvOS uses the Siri Remote — all interaction is through focus and button presses:
// Handle directional movement
.onMoveCommand { direction in
switch direction {
case .up: moveUp()
case .down: moveDown()
case .left: moveLeft()
case .right: moveRight()
@unknown default: break
}
}
// Handle Play/Pause button
.onPlayPauseCommand {
togglePlayback()
}
// Handle Menu/Back button
.onExitCommand {
dismiss()
}
// Long press on select button
.onLongPressGesture {
showOptions()
}
import AVKit
struct PlayerView: View {
let url: URL
@State private var player: AVPlayer?
var body: some View {
VideoPlayer(player: player)
.onAppear {
player = AVPlayer(url: url)
player?.play()
}
.onDisappear {
player?.pause()
}
.ignoresSafeArea()
}
}
The only supported extension type on tvOS — shows content on the home screen:
// In Targets/TopShelf/ContentProvider.swift
import TVServices
struct TopShelfProvider: TVTopShelfProvider {
var topShelfStyle: TVTopShelfContentStyle { .sectioned }
var topShelfItems: [TVTopShelfSectionedItem] {
let section = TVTopShelfItemCollection(items: [
makeItem(id: "1", title: "Featured Movie", imageURL: url1),
makeItem(id: "2", title: "New Release", imageURL: url2),
])
section.title = "Featured"
return [section]
}
func makeItem(id: String, title: String, imageURL: URL) -> TVTopShelfSectionedItem {
let item = TVTopShelfSectionedItem(identifier: id)
item.title = title
item.setImageURL(imageURL, for: .screenScale1x)
item.displayAction = TVTopShelfAction(url: URL(string: "myapp://item/\(id)")!)
return item
}
}
tvOS automatically applies parallax effects to images in focused buttons:
// Images inside .buttonStyle(.card) get parallax automatically
Button { } label: {
Image("poster")
.resizable()
.aspectRatio(2/3, contentMode: .fill)
.frame(width: 200, height: 300)
}
.buttonStyle(.card)
struct SearchView: View {
@State private var query = ""
@State private var results: [Item] = []
var body: some View {
NavigationStack {
VStack {
// tvOS shows system keyboard for text input
TextField("Search", text: $query)
.onChange(of: query) { _, newQuery in
search(newQuery)
}
if results.isEmpty {
ContentUnavailableView.search(text: query)
} else {
ScrollView {
LazyVGrid(columns: [
GridItem(.adaptive(minimum: 200), spacing: 40)
], spacing: 40) {
ForEach(results) { item in
NavigationLink(value: item) {
ItemCard(item: item)
}
.buttonStyle(.card)
}
}
.padding(.horizontal, 80)
}
}
}
.navigationTitle("Search")
}
}
}
NavigationStack {
List {
Section("Account") {
NavigationLink("Profile") { ProfileView() }
NavigationLink("Subscriptions") { SubscriptionView() }
}
Section("Playback") {
Toggle("Auto-Play Next", isOn: $autoPlay)
Picker("Quality", selection: $quality) {
Text("Auto").tag(Quality.auto)
Text("High").tag(Quality.high)
Text("Low").tag(Quality.low)
}
}
Section("About") {
LabeledContent("Version", value: "1.0")
}
}
.navigationTitle("Settings")
}
onMoveCommand, onPlayPauseCommand, onExitCommand for remote controlAVKit for video playback — tvOS has deep system integrationtesting
Use for 3D games: racing, 3D sports, board games, marble maze, tower defense, bowling. SceneKit + SceneView architecture, 3D scene hierarchy, physics, game loop, primitives, materials, cameras, particles, audio.
documentation
Game UI patterns: SwiftUI HUD overlays on SpriteKit, menus (main/pause/game-over), virtual joystick/d-pad, score displays, health bars, tutorial onboarding.
tools
Download free game sprites/textures/3D models and generate procedural assets. Covers nw_download_asset tool, texture factories, sprite atlas organization, 3D model loading, and programmatic asset creation.
testing
Use for 2D games: arcade, puzzle, sports, ping pong, platformer, shooter, 2D racing. SpriteKit + SpriteView architecture, scene hierarchy, physics, game loop, audio, particles, game feel.