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-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-dev2

プレミアム記事

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-07-16
壁紙の段組みギャラリーにネイティブ広告を差し込む — 広告セルの寿命をプールで設計する
段組みギャラリーにネイティブ広告を1枚入れたところ、20分のスクロールでメモリが伸び続けました。リスト再利用と広告の寿命が噛み合わない理由から、プール方式の実装、差し込み間隔の決め方まで実測とともに残します。
アプリ開発2026-07-14
壁紙を長押しして、プレビューと保存メニューを出す — Rork の Expo アプリで context menu を組む
壁紙ギャラリーのカードを長押ししても何も起きない。iOS利用者はプレビュー付きのメニューを期待します。Pressableだけでは届かない理由から、zeegoでのネイティブcontext menu実装、スクロールとの競合解消、保存・共有アクション、Android向けの自前フォールバックまで、動くコードでまとめます。
アプリ開発2026-07-09
App Store のスクショは6.9インチだけ撮れば足りる — 多言語アプリの本数を減らす撮影パイプライン
App Store Connect が必須とするのは6.9インチiPhoneと13インチiPadの2枚だけです。Appleが小さい機種へ自動縮小する仕組みを前提に、fastlane snapshotとframeitで多言語スクショの撮影本数を減らす実務をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →