初めてのApp Store審査で詰まったこと全部書く|個人開発者が陥る罠6つ

※当ブログのリンクには広告リンク(アフィリエイト広告)が含まれています。

この記事を読んでほしい人
・個人で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販売に必要な手続き一覧

コード以外で必要な手続きをまとめました。これを知らずに進めると、課金が動かない・審査に通らないという事態になります。

App Store Connectのビジネス契約・納税フォーム画面
App Store Connect「ビジネス」画面。契約・銀行口座・納税フォームがすべてここに集まっています
手続き場所注意点
無料アプリ契約App Store Connect > ビジネス自動で有効になる場合が多い
有料アプリ契約App Store Connect > ビジネス署名が必要。忘れると課金が動かない
銀行口座登録App Store Connect > ビジネス > 銀行口座日本の口座でOK
U.S. Form W-8BENApp Store Connect > ビジネス > 納税フォーム簡単に言うと「私はアメリカ人ではありません」という証明書。日本在住者は全員必要
Certificate of Foreign Status同上W-8BENとセットで提出する
DSAコンプライアンスApp Store Connect > ビジネス簡単に言うとEU向けの販売者情報登録。トレーダー(事業者)か非トレーダーかを選択する
郵便番号のハイフン法人情報の入力欄2560811 ではなく 256-0811 の形式が必要。ハイフンなしだとエラーになる

プライバシーポリシーはGitHub Pagesで無料公開できる

App Storeの審査には、プライバシーポリシーのURLが必須です。有料サービスは不要で、GitHubのPages機能(簡単に言うと:GitHubが無料でWebページを公開してくれる仕組み)を使えば0円で対応できます。

  1. GitHubでリポジトリを新規作成する
  2. index.html でプライバシーポリシーを書く
  3. Settings > Pages から公開設定をするとURLが発行される

一つ落とし穴があります。「ユーザーデータを一切収集しないアプリだからポリシーは不要では?」と思いがちですが、収集しない場合でも「収集しません」と明記したページが必要です。

スクリーンショットのサイズ

App Store Connectが要求するスクリーンショットのサイズは以下の通りです(2026年時点)。

ディスプレイサイズ(px)必須?
6.9インチ1320 × 2868必須
6.5インチ1242 × 2688任意
6.3インチ1320 × 2868任意
6.1インチ1125 × 2436任意

iPhone実機で撮ったスクリーンショットはサイズが機種ごとに異なります。Macに標準搭載されている sips コマンドでリサイズできます。

sips 元ファイル.PNG --resampleHeightWidth 2868 1320 --out 変換後.PNG

ビルドを変えるたびに必要な提出フロー

コードを修正してもTestFlightに反映されるわけではありません。修正のたびに以下の手順が必要です。これを知らずに「変えたのに反映されていない」と混乱したことがありました。

XcodeのProductメニューを開くところ
まずXcodeの上部メニューから「Product」をクリックします
XcodeのProduct→Archiveメニュー
Product → Archiveを選択してビルドをアーカイブする
  1. Xcode → Product → Archive(アーカイブを作成する)
  2. Archivesウィンドウ → Distribute App をクリック
  3. App Store Connect を選択してアップロード
  4. App Store Connect → TestFlight でビルドの処理が完了するまで待つ(数分〜数十分かかります)
  5. 配信タブ → ビルドを選択 → 審査用に追加 → 提出
XcodeのArchives画面とDistribute Appボタン
ArchivesウィンドウでビルドをDistribute Appでアップロードする
App Store ConnectのTestFlightビルド一覧
App Store ConnectのTestFlight画面。アップロード済みビルドが「終了」ステータスで並ぶ

落とし穴:コードを変更しただけでは反映されません。必ずArchive→アップロードの手順を踏む必要があります。TestFlightに新しいビルドが届いていない場合は、この手順が抜けている可能性が高いです。

まとめ

  • CloudKitはコードだけでなく、App Store Connect側の設定も必要
  • fatalError() は開発中に限定し、本番コードから外す
  • 有料アプリ・課金機能を使うなら「有料アプリ契約」への署名が必須(忘れると課金が動かない)
  • W-8BEN・銀行口座・DSAコンプライアンスなど、コード以外の手続きが複数ある
  • プライバシーポリシーはGitHub Pagesで無料公開できる。データ収集なしでも「収集しない」と明記が必要
  • コードを修正したらArchive→アップロードをやり直す必要がある

アプリを作り始めた最初の話はこちらです。
副業vol.5|コードを書かずにiOSアプリを作り始めた話

👉 当ブログでは個人情報の取り扱いについて プライバシーポリシー に記載しています。ご確認の上、ご利用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

神奈川県在住、39歳のクレーンオペレーター。ガジェット・AI活用術・デスク環境・副業挑戦記録を発信中。副業をゼロから立ち上げていくリアルな記録もここに書いています。実際に試したものを正直に書くスタイル。「試して、選んで、変えていく。」

コメント

コメントする

CAPTCHA


目次