tvOS:Focus EngineによるApple TV開発の概要

著者: IT Sectr 公開日: 2026-02-07 読了時間: 11 分

tvOS — Apple TV向けのAppleのオペレーティングシステム。2015年に第4世代Apple TVとともに初めてリリースされました。tvOS向けアプリ開発は、SwiftUIとTVMLKitを使用してSwiftで行われます。iOSとの主な違いは、タッチの代わりにSiri Remoteを介したフォーカス制御です。Appleによると、tvOSは世界中で1億台以上のアクティブデバイスにインストールされています。

重要ポイント

  • tvOS — XNUカーネル上でタッチの代わりにFocus Engineを備えたTVセットトップボックス向けAppleのOS
  • Focus Engine — Siri Remoteを介した要素間のフォーカス管理システム
  • SwiftUIとTVMLKit — 2つの開発アプローチ:ネイティブとJavaScriptテンプレート
  • Top Shelf — Apple TVホーム画面の動的コンテンツ
  • アプリサイズは厳密に4GBに制限、推奨は500MB以下

tvOSとは?

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バージョン履歴

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 92015App Store、SDK、Siri Remote
tvOS 102016シングルサインオン(SSO)、Live Tune-In
tvOS 112017Amazon Prime、自動モード
tvOS 122018Dolby Atmos、iPhoneによるパスワード
tvOS 132019マルチユーザー、TVのコントロールセンター
tvOS 172023FaceTime、VPN、Siri Remoteを探す

tvOSのアーキテクチャとiOSとの違い

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とTVJS

TVMLKit — tvOS固有のフレームワークで、JavaScriptとTVML(Apple固有のXML類似言語)でインターフェースを作成できます。TVMLKitはサーバーからJSON/XMLをロードし、ネイティブUIコンポーネントをレンダリングします。これはストリーミングサービスの主要技術です:Netflix、Hulu、Amazon Prime VideoはTVMLKitを使用しています。TVJS — 分離されたコンテキストで実行されるJavaScript環境です。

永続ストレージの欠如

tvOSはディスク容量を自動的に管理します:空き容量が不足すると、システムはキャッシュ、ダウンロードしたリソース、さらにはアプリ自体を削除する可能性があります(アイコンは保持)。再開時にアプリは状態を復元する必要があります。iCloud NSUbiquitousKeyValueStoreは設定用の唯一の保証された永続ストレージです(アプリあたり最大1MB)。

swift
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:ナビゲーションとフォーカス

Focus Engine — タッチイベントをフォーカスナビゲーションに置き換えるtvOSの主要メカニズム。ユーザーはSiri Remote(タッチサーフェスまたはボタン)を使用してUI要素間で選択を移動します。システムは距離と移動方向に基づいて次のフォーカス要素を自動的に計算します。

UIFocusEnvironmentとフォーカス階層

フォーカスを受け取ることができる各UI要素はUIFocusEnvironmentプロトコルを実装します。UIKitは要素のジオメトリに基づいてナビゲーション順序を自動的に決定します。開発者はpreferredFocusEnvironmentsを介して優先フォーカスをオーバーライドし、子focusEnvironmentの配列を指定し、UIFocusHeading(up、down、left、right)を介して移動を制御できます。UIFocusGuideは非自明なレイアウトのカスタムルートを設定できます。

UIFocusEffectとパララックス

tvOSはフォーカスされた要素に自動的にUIFocusEffectを追加します:影、ハイライト、パララックス効果(リモコンを傾けたときのオフセット)。開発者はfocusedValueを介してエフェクトを無効にしたり、UIFocusEffect.transformを介してカスタマイズしたりできます。SwiftUIでは、パララックスは.hoverEffect(.highlight)修飾子で追加されます。

swift
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は循環ナビゲーションのためにグリッドをグループ化します。

Siri Remote:ジェスチャーとボタン

第2世代Siri Remote(2021)にはタッチサーフェス、5つのボタン、マイクがあります。tvOSはジェスチャーをサポートしています:スワイプ(ナビゲーション)、タップ(選択)、ダブルタップ(中央配置)、ピンチズーム(画像)、長押し(コンテキストメニュー)。UIPressのタイプ.select、.playPause、.menu、.upArrow、.downArrow、.leftArrow、.rightArrow — 定義済みの押下タイプ。リモコンのマイクはSiriと音声検索に使用されます。

Top Shelfとアプリ画面

Top ShelfはApple TVホーム画面の領域で、アプリが最上行にあるときに動的コンテンツを表示します。tvOS 17では、Top Shelfはカスタム背景とインタラクティブ要素を持つ最大8つのウィジェットをサポートしています。開発者はコンテンツを提供するためにTVTopShelfProviderを実装します。

Top Shelfのスタイル

3つのTop Shelfスタイルが利用可能です:Sectioned — カテゴリ別リスト(ジャンル別シリーズ)、Inset — 詳細説明付きの中央要素(おすすめ映画)、Photo — 画像グリッド(フォトアルバム)。システムはBGTaskSchedulerを介してバックグラウンドでTop Shelfを更新します(watchOSと同様)。プロバイダーは迅速にコンテンツを返す必要があります — tvOSはデータを24時間キャッシュします。

アプリ画面

tvOSのホーム画面はTop Shelf行とアプリグリッドで構成されています。ユーザーはアイコンを再配置し、フォルダを作成できます。リソースが不足するとtvOSは自動的にメモリからアプリをアンロードするため、開発者はUISceneDidDisconnectNotificationを適切に処理し、再起動時に状態を復元する必要があります。

Top Shelfスタイル形式使用時
Sectionedヘッダーとアイテムのあるセクションシリーズ、ポッドキャスト、プレイリスト
Inset説明付きの1つの大きなアイテム本日の映画、限定
Photoキャプションなしの画像グリッドフォトアルバム、ギャラリー
Tab切り替え可能なタブ種類別スポーツ、トピック別ニュース

Apple TV向けSwiftUI

SwiftUIはtvOS 13以降、tvOSで完全にサポートされています。Appleはすべての新規プロジェクトにSwiftUIを推奨しています。同じSwiftUIコードが、Focus Engineへの最小限の適応でiOS、iPadOS、macOS、tvOSで動作します。tvOS向けSwiftUIは、.focusable()、.focusSection()、.onPlayPauseCommand、.onExitCommand修飾子を提供します。

tvOSへの適応

iOSアプリをtvOSに移植する場合:TabViewをフォーカスナビゲーション付きのNavigationViewに置き換え、フォントサイズを大きくし(見出しは最低30pt、本文は22pt)、マージンを追加し(端から最低40pt — TVのセーフエリア)ます。tvOSはテキストフィールド付きのUIAlertController、UIWebView、MFMailComposeViewControllerをサポートしていません。

iOSコンポーネントtvOS相当
UISliderUIProgressView + ボタンSliderは非対応
UIPickerViewフォーカス付きテーブルPickerはリストに置き換え
UITextFieldUIAlertController(読み取り専用)Siri経由のテキスト入力
UIActionSheetUIAlertController対応
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とメディアアプリケーション

TVMLKit — Web技術を使用してtvOSでメディアアプリを作成するためのフレームワーク:JavaScript(TVJS)とTVML(Apple固有のXML)。TVMLKitアプリはコンパイルを必要としません — インターフェースはサーバーからロードされるため、App Reviewを経由せずにコンテンツを更新できます。主要なストリーミングサービスがコンテンツカルーセルに使用しています。

TVML:テンプレート構造

TVMLは既成のテンプレートを提供します:CatalogTemplate(セクション付きカタログ)、ProductTemplate(コンテンツ詳細ページ)、FormTemplate(ログインフォーム)、LoadingTemplate(ローディングインジケーター)。テンプレートはXMLで記述され、CSS類似の属性でスタイル設定されます。TVJSコードは押下を処理し、ネイティブAPIを呼び出します。

xml
<!-- 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:イベント処理

TVJSはメインアプリから分離されたJavaScript環境です。TVJSコードはTVMLテンプレートのロード時とイベント処理時に呼び出されます。TVJSはAppliancePlayerを介してネイティブAPIにアクセスし、ビデオ再生を制御できます。Appleは頻繁にコンテンツが更新されるメディアアプリにのみTVMLKitの使用を推奨しています。ゲームやインタラクティブアプリにはSwiftUIが推奨されます。

tvOSアプリの公開

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による配布が可能です。

App Review要件

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

よくある質問

tvOS開発にはどの言語が使用されますか?

主要言語はSwiftで、SwiftUIとUIKitフレームワークを使用します。メディアアプリには、サーバーからロードされるJavaScriptとTVMLテンプレートを使用したTVMLKitが使用されます。Objective-Cはレガシープロジェクト向けにサポートされています。Appleはすべての新しいtvOSプロジェクトにSwiftUIを推奨しています。

tvOSはiOSとどう違いますか?

tvOSはタッチイベントの代わりにFocus Engineを使用し、カメラやマイク(Siri Remoteを除く)がなく、アプリサイズを4GBに制限し、永続的なローカルストレージ(purgeable)をサポートせず、レンダリングにMetalを必要とします。すべてのアプリはARM64でのみ動作します。

tvOSでFocus Engineはどのように機能しますか?

Focus EngineはSiri Remoteを使用してUI要素間のフォーカス移動を管理します。開発者はpreferredFocusEnvironmentsを介して優先フォーカスを設定します。UIFocusHeading(up、down、left、right)が方向を決定します。UIFocusEffectはアクティブな要素に自動的にパララックスと影を追加します。

Apple TV向けアプリを公開するには?

公開にはApple Developer Programサブスクリプション($99/年)が必要です。アプリはXcode OrganizerまたはTransporterを介してApp Store Connectにアップロードされます。審査ではFocus Engine互換性、安定性、UIWebViewの有無、4GBのサイズ制限がチェックされます。

tvOSでUIKitを使用できますか?

はい、UIKitはtvOSで完全にサポートされています:UIView、UIViewController、UICollectionView、UITableView。ただし、UIKitはFocus Engineに適応されています:UIButtonとUIControlはタッチではなくリモコンの押下でイベントを受け取ります。自動フォーカス適応のため、新規プロジェクトにはSwiftUIが推奨されます。

まとめ

  • tvOS — XNUカーネル上でFocus Engine制御を備えたTVセットトップボックス向けAppleのOS
  • Focus Engineはパララックス効果でSiri Remoteを介したフォーカス移動にタッチ操作を置き換える
  • TVMLKit — サーバーサイドTVMLテンプレートを使用したJavaScriptによるメディアアプリ向け独自フレームワーク
  • Top ShelfはTVTopShelfProviderを介してホーム画面に動的コンテンツを提供
  • SwiftUIはtvOS 13以降、focusable、focusSection、onPlayPauseCommand修飾子で完全サポート
  • tvOSの制限:4GBサイズ、purgeableストレージ、カメラ・UIWebView・MFMailComposeなし
  • 公開にはApple Developer Program、@2x/@4xグラフィック、HEVC形式、Dolby Atmosが必要

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください