※当ブログのリンクには広告リンク(アフィリエイト広告)が含まれています。
この記事を読んでほしい人
・個人でiOSアプリを作って、App Storeに出してみたい人
・TestFlightでうまく動かず詰まっている人
・審査リジェクトをもらって、何が悪いかわからない人
画面が、真っ白でした。
TestFlightでインストールして、アプリを開いた瞬間、何も表示されずに落ちました。「どこかのコードが間違っているはずだ」と思って調べ始めたのですが、原因は自分が想像していた場所にはありませんでした。
App Storeへの申請は、コードを書くだけでは終わりません。知らないと詰まる手続き、設定、落とし穴がいくつもあります。実際に体験したことを、そのまま書きます。
TestFlightを開いたら、真っ白だった
最初の2ビルドは、TestFlightで開いた瞬間に落ちました。原因は3つ重なっていました。
① CloudKitの設定漏れ
CloudKit(簡単に言うと:iCloudを使ってデータを同期する仕組み)をコードに書いていましたが、App Store Connect側のCloudKit Dashboardで事前設定をしていませんでした。コードと実際の設定が噛み合っていない状態で起動しようとして、落ちていました。
→ 対処:CloudKitをいったん完全に削除し、ローカル保存のみに変更しました。
② fatalError()を書いていた
fatalError()(簡単に言うと:「ここに来たら強制終了」という命令)を開発中のままコードに残していました。起動直後にその行が実行されて、アプリが落ちていました。
→ 対処:fatalError()を適切なエラー処理に書き替えました。
③ aps-environmentがdevelopmentのまま
aps-environment(簡単に言うと:プッシュ通知などの動作環境を「開発用」か「本番用」かで切り替える設定)が開発用のままでした。TestFlightや本番環境ではproductionに変更が必要です。
→ 対処:productionに変更。Build 3で初めて起動に成功しました。
教訓:CloudKitはコードを書くだけでは動きません。App Store ConnectのCloudKit Dashboardで事前にコンテナを設定する必要があります。設定なしでコードだけ書いても、本番環境では動かないと思ってください。
審査リジェクト——「ボタンが反応しない」
Build 3で起動は成功しましたが、審査からリジェクト(却下)が返ってきました。
Appleからのメッセージ(要約):
「iPad Air(5世代)/ iPadOS 26.5のサンドボックス環境でアップグレードボタンをタップしたが、反応しなかった。」
リジェクト理由コード:Guideline 2.1(b) — Performance — App Completeness
(簡単に言うと:「アプリとして完成していない」という判定です)
原因は2つありました。
根本原因①:Paid Apps Agreement(有料アプリ契約)に署名していなかった
App Store Connectの「ビジネス」メニューに「契約・税務・銀行口座」という項目があります。無料アプリ契約は自動で有効になることが多いのですが、有料アプリ契約は自分で署名が必要です。署名前は「新規」という表示になっています。この状態では、サンドボックス環境(審査員が使うテスト環境)でも課金の動作が一切機能しません。
根本原因②:コード側のnilバグ
課金処理のコードに guard let product = proProduct else { return } という記述がありました。proProduct(購入できる商品の情報)の取得が遅れたり失敗したりすると、nilのまま画面にボタンが表示されます。タップしても無音でreturnするため、審査員には「壊れているボタン」に見えてしまいます。
→ 対処:proProductがnilのときはグレーのdisabledボタン+「再読み込み」ボタンを表示するよう修正しました。
App Store販売に必要な手続き一覧
コード以外で必要な手続きをまとめました。これを知らずに進めると、課金が動かない・審査に通らないという事態になります。

プライバシーポリシーはGitHub Pagesで無料公開できる
App Storeの審査には、プライバシーポリシーのURLが必須です。有料サービスは不要で、GitHubのPages機能(簡単に言うと:GitHubが無料でWebページを公開してくれる仕組み)を使えば0円で対応できます。
- GitHubでリポジトリを新規作成する
index.htmlでプライバシーポリシーを書く- Settings > Pages から公開設定をするとURLが発行される
一つ落とし穴があります。「ユーザーデータを一切収集しないアプリだからポリシーは不要では?」と思いがちですが、収集しない場合でも「収集しません」と明記したページが必要です。
スクリーンショットのサイズ
App Store Connectが要求するスクリーンショットのサイズは以下の通りです(2026年時点)。
iPhone実機で撮ったスクリーンショットはサイズが機種ごとに異なります。Macに標準搭載されている sips コマンドでリサイズできます。
sips 元ファイル.PNG --resampleHeightWidth 2868 1320 --out 変換後.PNGビルドを変えるたびに必要な提出フロー
コードを修正してもTestFlightに反映されるわけではありません。修正のたびに以下の手順が必要です。これを知らずに「変えたのに反映されていない」と混乱したことがありました。


- Xcode → Product → Archive(アーカイブを作成する)
- Archivesウィンドウ → Distribute App をクリック
- App Store Connect を選択してアップロード
- App Store Connect → TestFlight でビルドの処理が完了するまで待つ(数分〜数十分かかります)
- 配信タブ → ビルドを選択 → 審査用に追加 → 提出


落とし穴:コードを変更しただけでは反映されません。必ずArchive→アップロードの手順を踏む必要があります。TestFlightに新しいビルドが届いていない場合は、この手順が抜けている可能性が高いです。
まとめ
- CloudKitはコードだけでなく、App Store Connect側の設定も必要
fatalError()は開発中に限定し、本番コードから外す- 有料アプリ・課金機能を使うなら「有料アプリ契約」への署名が必須(忘れると課金が動かない)
- W-8BEN・銀行口座・DSAコンプライアンスなど、コード以外の手続きが複数ある
- プライバシーポリシーはGitHub Pagesで無料公開できる。データ収集なしでも「収集しない」と明記が必要
- コードを修正したらArchive→アップロードをやり直す必要がある
アプリを作り始めた最初の話はこちらです。
→ 副業vol.5|コードを書かずにiOSアプリを作り始めた話
👉 当ブログでは個人情報の取り扱いについて プライバシーポリシー に記載しています。ご確認の上、ご利用ください。








コメント