RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-05-29上級

ProMotion 120Hz を壁紙アプリに行き渡らせる — CADisableMinimumFrameDurationOnPhone と Reanimated v3 の実装メモ

Rork で生成した壁紙アプリの 120Hz 化に取り組んだ実装メモ。Info.plist の CADisableMinimumFrameDurationOnPhone から Reanimated v3 worklets、FlashList スクロールまで、6壁紙アプリで観測した AdMob eCPM 改善幅と落とし穴を整理しています。

ProMotion120HzReanimated10FlashList5iOS108Wallpaper3

プレミアム記事

壁紙アプリを iPhone 15 Pro で触っていて、最初に気づいたのは「スクロールがどうも 60fps っぽい」という感覚的な違和感でした。同じ iPhone でも Safari は 120Hz でぬるりと動くのに、自分のアプリだけが半テンポ遅い。手元に 6 本の壁紙アプリがある状況で、せっかく購入された ProMotion ディスプレイを活かしきれていないことが気持ち悪く、2 週間ほど腰を据えて取り組みました。

両家の祖父が宮大工で、組み上げが丁寧かどうかは「触ったときの違和感」で先に分かるという感覚を幼少から見てきました。スクロールの引っかかりもそれと近くて、数値で説明できる前に体が気づく類の話です。Rork で生成した React Native アプリに後から 120Hz 駆動を行き渡らせるまでの実装メモを、6 壁紙アプリ並行運用の現場目線で残しておきます。

ProMotion が効かない壁紙アプリで感じた違和感の正体

廣川政樹です。2014 年から個人で iOS / Android アプリを開発しており、壁紙ジャンルだけで累計 5,000 万ダウンロードを超えるストックを抱えています。新規インストールの約 4 割は iPhone 15 Pro 以上の ProMotion 対応モデルからきており、AdMob ダッシュボードを覗くと、この端末層は eCPM が他より 1.3〜1.5 倍ほど高く、平均セッション時間も長めに出ます。

つまり 120Hz 対応の手抜きは、最も支払い能力の高い端末層に対して粗い体験を出していることに等しいわけです。指で 5,000 枚を超える壁紙サムネイルをすべる動作は、このアプリで最も頻度の高い操作で、ここが 60fps と 120fps では「気持ちよさ」に決定的な差が出ます。

最初に Xcode Instruments の Display 計測を回したとき、ピーク描画は 120Hz に届いているものの、UIScrollView 側が頑なに 60Hz でクランプされていることが分かりました。これは Apple が 2022 年以降の iOS で導入した「アプリ側が明示的にオプトインしない限り、CADisplayLink の最小フレーム持続時間を 60Hz に縛る」挙動です。本番運用しているアプリの 6 本すべてがこの罠にハマっていたのは、Rork で生成した Expo の prebuild が Info.plist のキーまでは面倒を見てくれないからです。

まず Info.plist の CADisableMinimumFrameDurationOnPhone を確認する

ProMotion を有効化する第一歩は、iOS アプリの Info.plist に以下のキーを追加することです。Apple のドキュメントでも「ProMotion を使うアプリは明示的に opt-in せよ」と明記されています。

<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>

Rork で生成したプロジェクトはネイティブコードをそのまま編集できますが、私の場合は EAS Build で CI に乗せている都合上、Expo の config plugin で注入する方を推奨します。手書きで Info.plist を編集すると、Rork が次回 sync したときに上書きされ、6 本のアプリで個別に直す手間が積み上がるからです。

// plugins/withProMotion.ts
import {
  ConfigPlugin,
  withInfoPlist,
} from "@expo/config-plugins";
 
const withProMotion: ConfigPlugin = (config) => {
  return withInfoPlist(config, (cfg) => {
    cfg.modResults.CADisableMinimumFrameDurationOnPhone = true;
    return cfg;
  });
};
 
export default withProMotion;

app.json"plugins": ["./plugins/withProMotion"] を読み込ませれば、expo prebuild --clean のたびに Info.plist に再注入されます。私の場合、6 壁紙アプリの monorepo で共通プラグインに昇格させて、配布忘れを防いでいます。

注意点として、シミュレータでは 120Hz 駆動を確認できません。M シリーズの Mac であっても CADisplayLink の preferredFrameRateRange.preferred は 60 を返してきます。検証は必ず ProMotion 対応の実機で行ってください。私は iPhone 15 Pro と iPhone 16 Pro Max を 1 台ずつ手元に置いて切り分けています。

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

この記事の続きを読む

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

この記事で得られること
CADisableMinimumFrameDurationOnPhone を Info.plist と Expo config plugin の両面から正しく入れる手順と、Rork 生成の prebuild を上書きしない設計
Reanimated v3 worklets の useFrameCallback と useSharedValue で 60fps を 120fps に引き上げた壁紙プレビュー画面の具体的なリファクタコード
6壁紙アプリで観測した eCPM・セッション継続率・リテンションの改善幅と、ProMotion 化が AdMob 収益にもたらした実数値
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-07-13
HealthKitの差分同期でデータを取りこぼす — HKAnchoredObjectQueryのアンカーを設計する
HealthKitの差分同期で歩数や睡眠が二重に数えられたり欠けたりする原因は、HKQueryAnchorの永続化設計にあります。newAnchorとdeletedObjectsを正しく扱い、再インストールやバックグラウンド更新をまたいでも整合するローカル取り込みの実装を、動くSwiftコードでまとめました。
開発ツール2026-07-11
Rork Max で App Clip を実装する — QR を読んだ瞬間にアプリの核だけを届ける設計メモ
Rork Max が出力するネイティブ Swift を土台に、App Clip の15MB制約・起動URLの受け取り・親アプリへの状態引き継ぎまでを実装ベースで整理します。
開発ツール2026-07-10
クラッシュとして記録されない強制終了 — Rork アプリの JetsamEvent を読む
Crashlytics には何も出ていないのにレビューで「勝手に閉じる」と書かれる。その多くはメモリ超過による OS からの強制終了です。JetsamEvent レポートの読み方と、画像中心アプリのメモリ上限を実測から設計する手順をまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →