◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●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 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/アプリ開発
◇ アプリ開発/2026-05-27中級

iPhone Air と 17 Pro Max の新解像度を 6 アプリ並行で対応した実装ノート

iPhone Air 420×912 / 17 Pro 402×874 / 17 Pro Max 440×956 を 6 アプリの DefineManager.h に並行投入した実装ノート。三項演算子 29 箇所の追加と段階公開で 0 件の解像度起因クラッシュに着地した過程です。

ios12iphone-airiphone-17screen-resolutionapp-dev

✦ プレミアム記事

iPhone Air が 420×912、17 Pro が 402×874、17 Pro Max が 440×956 — Apple が秋に新解像度を 3 つ同時に出したのは、長く個人で iOS をやってきた私にとっても、なかなか珍しい年でした。Beautiful HD Wallpapers / Ukiyo-e Wallpapers / Relaxing Healing / Law of Attraction を含む 6 アプリを、限られた個人開発の時間でどう並行対応するかは、今期最大の運用課題でした。

旧来の DefineManager.h に積み上げた三項演算子マクロは、解像度が増えるたびに「正しい順序で読むしかない」プレーンな分岐の連続でした。今回の 3 解像度追加で、29 箇所の三項演算子を 6 アプリすべてに同期する必要があり、ここを Claude on Xcode と手作業で 2 日かけて整え直しました。崩した瞬間にレイアウトが歪むファイルなので、その経緯を残しておきます。

始まりは「セーフエリア境界の 1 ピクセル」

新解像度対応の最初の兆候は、Xcode 17 の新シミュレータでビルドした瞬間でした。Beautiful HD Wallpapers のメイン画面下部、AdMob のバナー上のセーフエリアが 1 ピクセル分だけ広く、その隙間に微妙な背景色が漏れていました。

iPhone Air は 6.6 インチで Dynamic Island 搭載、ノッチではなくダイナミックなセーフエリア管理が要求される機種です。UIScreen.main.bounds.size を直接見るのではなく、safeAreaInsets を介してレイアウトを組み直す必要がありました。

// 旧来の判定(iPhone 16 Pro Max までしか想定していなかった)
#define IS_IPHONE_PRO_MAX \
  ([UIScreen mainScreen].bounds.size.height == 932.0f)
 
// 17 Pro Max は 956pt 縦になったため、true / false の判定が反転していた

最初に出した v3.0.0 ビルドでは、17 Pro Max のユーザーが下部広告領域の上に 8pt の謎の余白を見続ける状態になっていました。実機を持っていない解像度のレイアウトを、シミュレータと TestFlight だけで詰め切るのは、毎年のように難しい仕事です。

DefineManager.h に三項演算子を 29 箇所足す現実

旧来のマクロは次のような形でした。

#define IS_IPHONE_AIR \
  ([UIScreen mainScreen].bounds.size.width == 420.0f && \
   [UIScreen mainScreen].bounds.size.height == 912.0f)
 
#define IS_IPHONE_17_PRO \
  ([UIScreen mainScreen].bounds.size.width == 402.0f && \
   [UIScreen mainScreen].bounds.size.height == 874.0f)
 
#define IS_IPHONE_17_PRO_MAX \
  ([UIScreen mainScreen].bounds.size.width == 440.0f && \
   [UIScreen mainScreen].bounds.size.height == 956.0f)

問題は、レイアウト値を返す側のマクロです。たとえばナビゲーションバーの高さオフセットは以下のように三項演算子で連鎖していました。

#define NAV_BAR_OFFSET \
  (IS_IPHONE_AIR ? 18.0f : \
   IS_IPHONE_17_PRO_MAX ? 22.0f : \
   IS_IPHONE_17_PRO ? 18.0f : \
   IS_IPHONE_16_PRO_MAX ? 20.0f : \
   IS_IPHONE_16_PRO ? 18.0f : 16.0f)

ここに 29 箇所の三項演算子を 1 つずつ追加するわけですが、評価順を間違えると別端末のレイアウトが壊れます。Air と 17 Pro が両方 18pt なら共有してよさそうに見えますが、私はあえて分けて書きました。理由は、来年のリビジョンで Air と 17 Pro の挙動が分岐したときに、どこを直せばよいかを今のうちに固定しておきたかったからです。

12 年間個人でアプリを書いてきて学んだのは、「目先の DRY」と「将来の差分修正のしやすさ」は同義ではないという感覚です。アート活動と並行して個人開発を続けていると、半年後の自分は今の自分とほぼ別人で、コードに書かれていないことは確実に忘れます。三項演算子の冗長性は、未来の自分への手紙のようなものだと考えています。

✦

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

この記事の続きを読む

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

この記事で得られること
✦iPhone Air・17 Pro・17 Pro Max の 3 解像度(420×912 / 402×874 / 440×956)を、6 アプリ並行で同時にリリースする際のチェックリストと、29 箇所の三項演算子分岐の正しい配置順を再現できます
✦DefineManager.h を介した端末判定マクロが、新解像度の追加で破綻しないように維持するためのテーブル駆動リファクタリングの初期パッチを移植できます
✦5,000 万 DL を超えるアプリポートフォリオで、新解像度起因のクラッシュを 14 日間 0 件に抑えるための App Store Connect 段階公開 + Crashlytics 監視フィルタを構築できます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◇ アプリ開発2026-10-15
購読が切れても広告が戻りませんでした。「いま ad-free でなければ false」と書いていた、判定の向きを直した記録
購読が失効しても広告非表示のままになる不具合の原因は、判定の向きの逆転でした。二系統の購入確認を待って合成し、失敗した回は前回を保つ部品を、手元で動かして確かめた記録です。
◇ アプリ開発2026-10-15
adjustsFontSizeToFit で特定の1行だけ極小になるとき、疑うのは文字列ではなく枠の高さです
一覧の10行目だけ文字が4ptまで縮む。データも文字列も正常なのに起きる iOS の症状を、Yoga の丸めと縮小判定のソースで確かめ、Node で再現率を数えた記録です。
◇ アプリ開発2026-10-15
EAS Build だけ「No matching variant」で落ちるとき、まず疑う手元の android/build
手元の Gradle は通るのに、EAS Build の Android だけが「No matching variant of project」で止まる。GitHub の報告を読み比べ、Windows で生成した autolinking のキャッシュが Linux のビルド機へ渡っていた経路と、ビルドを投げる前に確かめる診断スクリプトをまとめました。