RORK LABEN
MAX — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、React NativeではなくネイティブSwiftアプリを直接生成しますAPPLE — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでAppleエコシステム全体を対象にしますWORKFLOW — 実運用ではAIに足場を作らせ、状態管理とデータ層は自分で書き直す分担に落ち着いてきたという声が目立ちますSEED — 4月にLeft Lane Capital主導で$15Mのシードを調達しました(Peak XV・True Ventures・a16z Speedrunが参加)PAPERLINE — アプリビルダーPaperlineを買収。エンジニア人材の獲得へ今後も買収を続ける方針ですREVIEW — 3ヶ月使ったユーザーの再訪レビューが増え、得意・不得意と向く用途の見極めが進んでいますMAX — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、React NativeではなくネイティブSwiftアプリを直接生成しますAPPLE — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでAppleエコシステム全体を対象にしますWORKFLOW — 実運用ではAIに足場を作らせ、状態管理とデータ層は自分で書き直す分担に落ち着いてきたという声が目立ちますSEED — 4月にLeft Lane Capital主導で$15Mのシードを調達しました(Peak XV・True Ventures・a16z Speedrunが参加)PAPERLINE — アプリビルダーPaperlineを買収。エンジニア人材の獲得へ今後も買収を続ける方針ですREVIEW — 3ヶ月使ったユーザーの再訪レビューが増え、得意・不得意と向く用途の見極めが進んでいます
記事一覧/アプリ開発
アプリ開発/2026-06-18上級

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

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

Rork Max223tvOSApple TVSwift45AVPlayer

プレミアム記事

居間のテレビに、自分の壁紙アプリの絵がそのまま流れていたら——そう思ったのは、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-07-05
Rork Max(Swift)と通常版(React Native)、どちらで作るか — 個人開発者のための意思決定フレーム
Rork Max のネイティブ Swift と通常版の React Native、どちらでアプリを作るかを迷ったときの判断軸を、コスト・機能境界・移行のしやすさから整理します。個人開発の視点で書いた意思決定フレームです。
アプリ開発2026-07-03
Rork Max アプリで通信の切断と復帰に強くする — NWPathMonitor によるオフライン検知と再送設計
Rork Max のネイティブ Swift アプリで、電波が切れても壊れない通信設計を NWPathMonitor で組み立てます。オフラインの検知、Low Data Mode やモバイル回線の判定、復帰時の自動再送キューまで、動く Swift コードで示します。
アプリ開発2026-07-03
Rork Max アプリでダウンロードをアプリ終了後も続ける — バックグラウンド URLSession の設計と再起動復帰
Rork Max のネイティブ Swift アプリで、アプリがサスペンド・終了されてもダウンロードを OS 側で継続させるバックグラウンド URLSession の設計を解説します。再起動復帰・resumeData・isDiscretionary の実測挙動まで動くコードで示します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →