RORK LABEN
MAX — Rork Maxはネイティブ Swiftアプリを生成。iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR・Metalによる3D・ウィジェット・Dynamic Island・Live Activities・Siri Intents・HealthKitなど、ネイティブ機能を引き出せますRN — 標準のRorkはReact Native(Expo)でクロスプラットフォーム。素早く形にするならこちらが向いていますCHOICE — 手早さならReact Native版、Appleのハード/OS統合を活かすならRork Maxという棲み分けが現実的ですPRICE — Rorkは無料で開始でき有料は月$25から、Rork Maxは月$200ですFLOW — 作りたいアプリを平易な言葉で説明すると、ストアに配信できる動くコードが生成されますMAX — Rork Maxはネイティブ Swiftアプリを生成。iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR・Metalによる3D・ウィジェット・Dynamic Island・Live Activities・Siri Intents・HealthKitなど、ネイティブ機能を引き出せますRN — 標準のRorkはReact Native(Expo)でクロスプラットフォーム。素早く形にするならこちらが向いていますCHOICE — 手早さならReact Native版、Appleのハード/OS統合を活かすならRork Maxという棲み分けが現実的ですPRICE — Rorkは無料で開始でき有料は月$25から、Rork Maxは月$200ですFLOW — 作りたいアプリを平易な言葉で説明すると、ストアに配信できる動くコードが生成されます
記事一覧/アプリ開発
アプリ開発/2026-06-18上級

Rork Max で Apple TV のアンビエント表示アプリを組み立てる

Rork Max が生成するネイティブ Swift を土台に、Apple TV で静かに流し続けるアンビエント表示アプリを設計します。Top Shelf・フォーカスエンジン・途切れない映像ループの実装を、運用で気づいた勘どころとともにまとめました。

Rork Max172tvOSApple TVSwift28AVPlayer

プレミアム記事

居間のテレビに、自分の壁紙アプリの絵がそのまま流れていたら——そう思ったのは、iPhone 向けの壁紙アプリを個人開発で何年か運用してきて、ふと大きな画面で見たくなったときでした。Apple TV は普段ノーコードやクロスプラットフォームの話題から外れがちですが、Rork Max がネイティブ Swift を生成するようになって、ようやく現実的な選択肢になりました。

tvOS は iPhone とは作法がかなり違います。タッチがなく、指で触れない代わりにフォーカスという概念で操作します。常時点けっぱなしにされる前提もあり、消費電力や焼き付きへの配慮も要ります。ここでは、静かな映像をただ流し続ける「アンビエント表示アプリ」を題材に、Rork Max の生成コードへ手を入れていく流れを追います。

なぜ Apple TV を Rork Max で作るのか

標準の Rork は React Native(Expo)でクロスプラットフォームに作りますが、tvOS の本領であるフォーカスエンジンや Top Shelf、AVPlayer の低レベル制御は、ネイティブ Swift でないと素直に届きません。Rork Max は iPhone・iPad・Apple Watch・Apple TV・Vision Pro 向けにネイティブ Swift を生成するため、Apple TV を狙うならこちらが土台になります。

私自身の使い分けは単純です。素早く iOS と Android を同時に出したいときは React Native 版、Apple のハードウェアや OS 統合に踏み込みたいときは Rork Max。Apple TV は後者の典型で、クロスプラットフォームのうまみがそもそも存在しません。なお Rork Max は月 $200、標準の Rork は無料で始められ有料は月 $25 からと、価格差は小さくありません。2クリックで App Store に出せる手軽さを含め、Rork Max でしか届かない領域でこそ、この $200 を活かしたいところです。

観点React Native 版 RorkRork Max(ネイティブ Swift)
tvOS 対応実質的に非対応正式対応
フォーカスエンジン抽象化が薄く扱いにくいSwiftUI が標準対応
Top Shelf 拡張困難App Extension として実装可能
映像の低レベル制御限定的AVFoundation を直接利用

Rork Max に「Apple TV 向けに、フルスクリーンで映像をループ再生し続けるアンビエントアプリを作って」と頼むと、SwiftUI ベースの雛形が返ってきます。ただしそのままでは「再生はするが継ぎ目で一瞬黒くなる」「フォーカスが想定外に動く」といった粗が残ります。ここから先が手作業の領域です。

継ぎ目のない映像ループを組む

最初に直面するのが、ループの継ぎ目です。AVPlayer に同じ動画を seek(to: .zero) で巻き戻す素朴な実装だと、巻き戻しのたびにわずかな黒フレームが挟まります。テレビの大画面では、この一瞬がはっきり気になります。

解決策は AVQueuePlayerAVPlayerLooper の組み合わせです。これは内部で次の再生アイテムを先読みしておき、切れ目なく繋いでくれます。

import AVFoundation
import SwiftUI
 
final class AmbientPlayerModel: ObservableObject {
    let player: AVQueuePlayer
    private var looper: AVPlayerLooper?
 
    init(resourceName: String) {
        guard let url = Bundle.main.url(forResource: resourceName, withExtension: "mp4") else {
            self.player = AVQueuePlayer()
            return
        }
        let item = AVPlayerItem(url: url)
        let queue = AVQueuePlayer()
        // AVPlayerLooper が継ぎ目のループを担う
        self.looper = AVPlayerLooper(player: queue, templateItem: item)
        self.player = queue
        queue.isMuted = true
        queue.actionAtItemEnd = .advance
    }
 
    func start() { player.play() }
    func stop() { player.pause() }
}

ポイントは AVPlayerLooper をプロパティとして保持し続けることです。ローカル変数にすると解放されてループが止まります。Rork Max の初期生成ではここがローカル変数になっていることが多く、私は毎回プロパティへ昇格させています。ループが突然止まるときは、まずここを疑うのが近道です。見落としやすい注意点だと感じています。

SwiftUI 側は VideoPlayer を使わず、AVPlayerLayer を薄くラップした方が制御しやすいです。VideoPlayer は再生コントロールの UI を抱えてしまい、アンビエント用途では邪魔になります。

struct PlayerLayerView: UIViewRepresentable {
    let player: AVQueuePlayer
 
    func makeUIView(context: Context) -> PlayerUIView {
        let view = PlayerUIView()
        view.playerLayer.player = player
        view.playerLayer.videoGravity = .resizeAspectFill
        return view
    }
    func updateUIView(_ uiView: PlayerUIView, context: Context) {}
}
 
final class PlayerUIView: UIView {
    override class var layerClass: AnyClass { AVPlayerLayer.self }
    var playerLayer: AVPlayerLayer { layer as! AVPlayerLayer }
}

videoGravity.resizeAspectFill にしておくと、テレビの比率に合わせて余白なく敷き詰められます。私の壁紙素材は縦横比がまちまちなので、ここを .resizeAspect にすると左右に黒帯が出てしまい、アンビエントの没入感が削がれました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
AVQueuePlayer と AVPlayerLooper で継ぎ目のない映像ループを組む具体的なコード
Top Shelf 拡張でホーム最上段に作品を出し、起動前から体験を始める設計
連続再生の上限を4時間に置くなど、省電力と常時表示を両立させる判断基準
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-06-16
Rork Max のアプリに Apple Wallet のスタンプカードを足す — 署名と更新の実装メモ
店舗のスタンプカードを Apple Wallet に入れたい——Rork Max が生成した Swift アプリから PassKit のパスを発行する際、難所はデザインではなく『署名』と『リモート更新』でした。実装の勘所を整理します。
アプリ開発2026-06-16
初回起動の前に壁紙パックを落としておく — Rork Max と Background Assets の使いどころ
コンテンツの多いアプリは、初回起動時に空のグリッドを見せてしまいがちです。アプリ本体とは別枠でコンテンツを先回りして落とす Background Assets を、Rork(Expo)では届かない領域として Rork Max のネイティブ Swift でどう実装するか、運用判断まで含めてまとめます。
アプリ開発2026-06-16
Rork Max で iMessage 拡張を作り、アプリの世界観をメッセージに持ち込む — 配布導線としての実装メモ
Rork Max が生成するネイティブ Swift プロジェクトに iMessage 拡張を追加し、アプリの素材をメッセージ上で共有する実装を整理しました。コンパクト/拡張表示の切り替え、メッセージ送信、ドロワーに出てこないときの切り分けまで、個人開発の配布目線で押さえます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →