RORK LABEN
PLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっていますPLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっています
記事一覧/開発ツール
開発ツール/2026-05-29上級

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

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

ProMotion120HzReanimated10FlashList5iOS109Wallpaper3

プレミアム記事

壁紙アプリを 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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-07-27
最低サポート iOS をいつ上げるか — 利用率ではなく、コードに残った分岐の数で決める
最低サポート OS の引き上げを利用率で判断すると、毎年同じ結論になって先送りが続きます。OS 分岐に注記を付けて棚卸しし、引き上げ先ごとに消せる分岐を数えるスクリプトと、引き上げ後に見る指標をまとめました。
開発ツール2026-07-13
HealthKitの差分同期でデータを取りこぼす — HKAnchoredObjectQueryのアンカーを設計する
HealthKitの差分同期で歩数や睡眠が二重に数えられたり欠けたりする原因は、HKQueryAnchorの永続化設計にあります。newAnchorとdeletedObjectsを正しく扱い、再インストールやバックグラウンド更新をまたいでも整合するローカル取り込みの実装を、動くSwiftコードでまとめました。
開発ツール2026-07-11
Rork Max で App Clip を実装する — QR を読んだ瞬間にアプリの核だけを届ける設計メモ
Rork Maxが出力するネイティブSwiftを土台に、App Clipを実装する設計メモです。15MB制約を守るターゲット分割、NSUserActivityでの起動URL受け取り、apple-app-site-associationの設定、親アプリへの状態引き継ぎまでを実装ベースで整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →