tvOS — Apple TV向けのAppleのオペレーティングシステム。2015年に第4世代Apple TVとともに初めてリリースされました。tvOS向けアプリ開発は、SwiftUIとTVMLKitを使用してSwiftで行われます。iOSとの主な違いは、タッチの代わりにSiri Remoteを介したフォーカス制御です。Appleによると、tvOSは世界中で1億台以上のアクティブデバイスにインストールされています。
重要ポイント
tvOS — Apple TVセットトップボックス向けのAppleのオペレーティングシステム。iOSと同じDarwin XNUカーネルをベースとしています。2015年10月30日に第4世代Apple TVとともに初めてリリースされました。tvOSは旧来のApple TV Software(iOSベース、App StoreとSDKなし)を置き換えました。このシステムは、4K HDR(Dolby Vision)までの解像度とDolby Atmosサウンドに対応したTV動作に最適化されています。
Apple(WWDC 2025)によると、tvOSはApple TV HD(2015)、Apple TV 4K(2017、2021、2022)にインストールされ、AirPlayを介していくつかのSmart TVモデルに組み込まれています。Apple TVはA8(HD)、A10X Fusion(第1世代4K)、A12 Bionic(第2世代4K)、A15 Bionic(第3世代4K)チップを使用しています。すべてのモデルがtvOS 17をサポートしています。tvOSにはカメラ、マイク(リモコンを除く)、タッチスクリーン、GPSはありません。
tvOSの主要機能はFocus Engineで、タッチ操作をフォーカスナビゲーションに置き換えます。ユーザーはSiri Remoteを使用してUI要素間で選択を移動します。開発者はSwift/SwiftUI(ネイティブ)またはJavaScript/TVML(Netflix、Huluなどのメディアアプリ)でアプリを作成します。
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 9 | 2015 | App Store、SDK、Siri Remote |
| tvOS 10 | 2016 | シングルサインオン(SSO)、Live Tune-In |
| tvOS 11 | 2017 | Amazon Prime、自動モード |
| tvOS 12 | 2018 | Dolby Atmos、iPhoneによるパスワード |
| tvOS 13 | 2019 | マルチユーザー、TVのコントロールセンター |
| tvOS 17 | 2023 | FaceTime、VPN、Siri Remoteを探す |
tvOSのアーキテクチャはiOSと同じスタックをベースとしています:XNUカーネル、Core Servicesシステムサービス、Mediaレイヤー、Cocoa Touchユーザーレイヤー。ただし、TVプラットフォームの特性に関連する重要な違いがあります。
第3世代Apple TV 4Kは、6つのCPUコア(2パフォーマンス、4効率)と5コアGPUを備えたA15 Bionicを使用しています。RAM — 4GB(64GBからの内部SSDストレージ)。このシステムには、従来の意味での永続的なローカルストレージはありません:空き容量が不足すると、tvOSはすべてのアプリデータを削除する可能性があります(purgeable)。開発者は状態を保持するためにiCloud Key-Value StorageまたはCloudKitを使用する必要があります。
TVMLKit — tvOS固有のフレームワークで、JavaScriptとTVML(Apple固有のXML類似言語)でインターフェースを作成できます。TVMLKitはサーバーからJSON/XMLをロードし、ネイティブUIコンポーネントをレンダリングします。これはストリーミングサービスの主要技術です:Netflix、Hulu、Amazon Prime VideoはTVMLKitを使用しています。TVJS — 分離されたコンテキストで実行されるJavaScript環境です。
tvOSはディスク容量を自動的に管理します:空き容量が不足すると、システムはキャッシュ、ダウンロードしたリソース、さらにはアプリ自体を削除する可能性があります(アイコンは保持)。再開時にアプリは状態を復元する必要があります。iCloud NSUbiquitousKeyValueStoreは設定用の唯一の保証された永続ストレージです(アプリあたり最大1MB)。
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は、tvOS上のアプリ状態を保存するためにNSUbiquitousKeyValueStoreを使用します。ローカルストレージはシステムによってクリアされる可能性があるため、iCloudのみがデータの永続性を保証します。store.synchronize()は即座にサーバーにデータを送信し、didChangeExternallyNotificationはユーザーの他のデバイスからの変更をアプリに通知します。
Focus Engine — タッチイベントをフォーカスナビゲーションに置き換えるtvOSの主要メカニズム。ユーザーはSiri Remote(タッチサーフェスまたはボタン)を使用してUI要素間で選択を移動します。システムは距離と移動方向に基づいて次のフォーカス要素を自動的に計算します。
フォーカスを受け取ることができる各UI要素はUIFocusEnvironmentプロトコルを実装します。UIKitは要素のジオメトリに基づいてナビゲーション順序を自動的に決定します。開発者はpreferredFocusEnvironmentsを介して優先フォーカスをオーバーライドし、子focusEnvironmentの配列を指定し、UIFocusHeading(up、down、left、right)を介して移動を制御できます。UIFocusGuideは非自明なレイアウトのカスタムルートを設定できます。
tvOSはフォーカスされた要素に自動的にUIFocusEffectを追加します:影、ハイライト、パララックス効果(リモコンを傾けたときのオフセット)。開発者はfocusedValueを介してエフェクトを無効にしたり、UIFocusEffect.transformを介してカスタマイズしたりできます。SwiftUIでは、パララックスは.hoverEffect(.highlight)修飾子で追加されます。
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はSwiftUIでのFocus Engineを示しています:.focusable()修飾子は要素をフォーカス可能にし、.onHoverは状態変化を追跡し、.focusEffectはカスタムフォーカスアニメーションを可能にします。.onPlayPauseCommandはSiri RemoteのPlay/Pauseボタンの押下を処理します。focusSectionは循環ナビゲーションのためにグリッドをグループ化します。
第2世代Siri Remote(2021)にはタッチサーフェス、5つのボタン、マイクがあります。tvOSはジェスチャーをサポートしています:スワイプ(ナビゲーション)、タップ(選択)、ダブルタップ(中央配置)、ピンチズーム(画像)、長押し(コンテキストメニュー)。UIPressのタイプ.select、.playPause、.menu、.upArrow、.downArrow、.leftArrow、.rightArrow — 定義済みの押下タイプ。リモコンのマイクはSiriと音声検索に使用されます。
Top ShelfはApple TVホーム画面の領域で、アプリが最上行にあるときに動的コンテンツを表示します。tvOS 17では、Top Shelfはカスタム背景とインタラクティブ要素を持つ最大8つのウィジェットをサポートしています。開発者はコンテンツを提供するためにTVTopShelfProviderを実装します。
3つのTop Shelfスタイルが利用可能です:Sectioned — カテゴリ別リスト(ジャンル別シリーズ)、Inset — 詳細説明付きの中央要素(おすすめ映画)、Photo — 画像グリッド(フォトアルバム)。システムはBGTaskSchedulerを介してバックグラウンドでTop Shelfを更新します(watchOSと同様)。プロバイダーは迅速にコンテンツを返す必要があります — tvOSはデータを24時間キャッシュします。
tvOSのホーム画面はTop Shelf行とアプリグリッドで構成されています。ユーザーはアイコンを再配置し、フォルダを作成できます。リソースが不足するとtvOSは自動的にメモリからアプリをアンロードするため、開発者はUISceneDidDisconnectNotificationを適切に処理し、再起動時に状態を復元する必要があります。
| Top Shelfスタイル | 形式 | 使用時 |
|---|---|---|
| Sectioned | ヘッダーとアイテムのあるセクション | シリーズ、ポッドキャスト、プレイリスト |
| Inset | 説明付きの1つの大きなアイテム | 本日の映画、限定 |
| Photo | キャプションなしの画像グリッド | フォトアルバム、ギャラリー |
| Tab | 切り替え可能なタブ | 種類別スポーツ、トピック別ニュース |
SwiftUIはtvOS 13以降、tvOSで完全にサポートされています。Appleはすべての新規プロジェクトにSwiftUIを推奨しています。同じSwiftUIコードが、Focus Engineへの最小限の適応でiOS、iPadOS、macOS、tvOSで動作します。tvOS向けSwiftUIは、.focusable()、.focusSection()、.onPlayPauseCommand、.onExitCommand修飾子を提供します。
iOSアプリをtvOSに移植する場合:TabViewをフォーカスナビゲーション付きのNavigationViewに置き換え、フォントサイズを大きくし(見出しは最低30pt、本文は22pt)、マージンを追加し(端から最低40pt — TVのセーフエリア)ます。tvOSはテキストフィールド付きのUIAlertController、UIWebView、MFMailComposeViewControllerをサポートしていません。
| iOSコンポーネント | tvOS相当 | 注 |
|---|---|---|
| UISlider | UIProgressView + ボタン | Sliderは非対応 |
| UIPickerView | フォーカス付きテーブル | Pickerはリストに置き換え |
| UITextField | UIAlertController(読み取り専用) | Siri経由のテキスト入力 |
| UIActionSheet | UIAlertController | 対応 |
| UIWebView | 非対応 | WKWebViewを使用 |
| MFMailCompose | 非対応 | mailto: URLを開く |
tvOS向けApple HIG:最小タッチ領域サイズ60×60ポイント、テキストは3メートルから読み取り可能(本文のフォントサイズは22pt以上)、テキストコントラスト4.5:1、暗い背景(明るい背景はOLED TVでぎらつく)、すべての要素は複雑なジェスチャーなしでアクセス可能。解像度:Apple TV 4Kは60 FPSで3840×2160(4K)または1920×1080(HD)を出力。すべての画像は@2x(1080p用)および@4x(4K用)である必要があります。
TVMLKit — Web技術を使用してtvOSでメディアアプリを作成するためのフレームワーク:JavaScript(TVJS)とTVML(Apple固有のXML)。TVMLKitアプリはコンパイルを必要としません — インターフェースはサーバーからロードされるため、App Reviewを経由せずにコンテンツを更新できます。主要なストリーミングサービスがコンテンツカルーセルに使用しています。
TVMLは既成のテンプレートを提供します:CatalogTemplate(セクション付きカタログ)、ProductTemplate(コンテンツ詳細ページ)、FormTemplate(ログインフォーム)、LoadingTemplate(ローディングインジケーター)。テンプレートはXMLで記述され、CSS類似の属性でスタイル設定されます。TVJSコードは押下を処理し、ネイティブAPIを呼び出します。
<!-- 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はメインアプリから分離されたJavaScript環境です。TVJSコードはTVMLテンプレートのロード時とイベント処理時に呼び出されます。TVJSはApplianceとPlayerを介してネイティブAPIにアクセスし、ビデオ再生を制御できます。Appleは頻繁にコンテンツが更新されるメディアアプリにのみTVMLKitの使用を推奨しています。ゲームやインタラクティブアプリにはSwiftUIが推奨されます。
tvOSアプリの公開にはApple Developer Programサブスクリプション($99/年)が必要です。アプリはApp Store Connectに個別の製品またはユニバーサルバイナリ(iOS + tvOS)の一部としてアップロードされます。App Reviewは安定性、HIG準拠、4GBのサイズ制限をチェックします。
Xcodeは.app拡張子(.ipaパッケージ)のtvOSターゲットを作成します。アーキテクチャ — arm64(Apple TVはApple Silicon ARMチップを使用)。tvOSはi386またはx86_64のフレームワークをサポートしていません。アプリはApple Development証明書(テスト)またはApple Distribution証明書(公開)で署名されます。法人向けのVolume Purchase Programによる配布が可能です。
tvOSの特別な要件:すべてのインターフェース要素はタッチスクリーンやキーボードを使用せずにFocus Engineを介してアクセス可能でなければなりません。認証が必要なアプリはiTunes Storeを介したシングルサインオン(SSO)をサポートする必要があります。広告コンテンツはユーザーの同意なしに再生を中断できません。アップロードされるバイナリサイズは4GBを超えてはいけません。
| 要件 | 説明 |
|---|---|
| アプリサイズ | 4GB以下、推奨500MB |
| グラフィック解像度 | @2x(1920×1080)および@4x(3840×2160)4K用 |
| フォーカスナビゲーション | すべての要素がSiri Remoteからアクセス可能 |
| ビデオ形式 | H.264、HEVC、Dolby Vision(Profile 5) |
| オーディオ | Dolby Atmos(E-AC-3 JOC)およびステレオAAC |
よくある質問
主要言語はSwiftで、SwiftUIとUIKitフレームワークを使用します。メディアアプリには、サーバーからロードされるJavaScriptとTVMLテンプレートを使用したTVMLKitが使用されます。Objective-Cはレガシープロジェクト向けにサポートされています。Appleはすべての新しいtvOSプロジェクトにSwiftUIを推奨しています。
tvOSはタッチイベントの代わりにFocus Engineを使用し、カメラやマイク(Siri Remoteを除く)がなく、アプリサイズを4GBに制限し、永続的なローカルストレージ(purgeable)をサポートせず、レンダリングにMetalを必要とします。すべてのアプリはARM64でのみ動作します。
Focus EngineはSiri Remoteを使用してUI要素間のフォーカス移動を管理します。開発者はpreferredFocusEnvironmentsを介して優先フォーカスを設定します。UIFocusHeading(up、down、left、right)が方向を決定します。UIFocusEffectはアクティブな要素に自動的にパララックスと影を追加します。
公開にはApple Developer Programサブスクリプション($99/年)が必要です。アプリはXcode OrganizerまたはTransporterを介してApp Store Connectにアップロードされます。審査ではFocus Engine互換性、安定性、UIWebViewの有無、4GBのサイズ制限がチェックされます。
はい、UIKitはtvOSで完全にサポートされています:UIView、UIViewController、UICollectionView、UITableView。ただし、UIKitはFocus Engineに適応されています:UIButtonとUIControlはタッチではなくリモコンの押下でイベントを受け取ります。自動フォーカス適応のため、新規プロジェクトにはSwiftUIが推奨されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。