◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Expo SDK 58 が 10/15 に正式リリースされました(Beta は 09/15 から)。上げる前に依存の対応状況を確認しましょう●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Expo SDK 58 が 10/15 に正式リリースされました(Beta は 09/15 から)。上げる前に依存の対応状況を確認しましょう●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-05-29上級

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

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

ProMotion120HzReanimated10FlashList5iOS115Wallpaper3

✦ プレミアム記事

壁紙アプリを 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-09-21
exit code 0 で止まるビルド — ログを黙らせていた設定と、空ファイルを通した存在チェック
eas build --local が exit code 0 but produced no further output で止まる件と、0 バイトのスタブが埋め込まれず dyld で落ちる件。どちらも原因は出力を減らす設定でした。自分のスクリプトを棚卸しする手順まで書き残します。
⬡ 開発ツール2026-09-10
画面を暗くする機能を足したら、アプリを閉じたあとも iPhone が暗いままでした
expo-brightness の setBrightnessAsync は、Android では現在のアクティビティにだけ効き、iOS では端末の明るさそのものを変えます。戻す責任が片側にしかない理由と、AppState で後始末をするフックの実装をまとめました。
⬡ 開発ツール2026-09-05
Widget Extension でも BGTaskScheduler.submit は成功します。走らないのは register が親アプリだけのものだからです
Widget Extension から BGTaskScheduler に依頼を出すとビルドも submit も通るのに、翌朝ウィジェットは変わりません。register がホストアプリ専用である事実から、更新の主語を親アプリへ戻す設計まで、壁紙アプリの運用で詰めた手順を残します。