道の駅ぽんまる開発手順書 ・ 第4回
#4 提出前チェックと、リジェクト1回目
前回で実機に表示できました。残った未知は「審査を通せるか」だけです。この回で、それを確かめに行きます。
目的
App Storeの審査に提出し、通過させること。ここで初めてApple Developer Program(ADP)を払います。
実額は12,980円(消費税込み)でした。「約15,000円」と見積もっていたので、少し安く済んでいます。年額の継続課金なので、続けないなら翌年の更新日前に自動更新をオフにする必要があります。
この支払いは、売上の見込みに払ったのではなく「審査を通せるかという検証」に払ったものです。v1.0は無料・課金なし・広告なしなので、この12,980円はv1.0では1円も回収されません。それを承知で払っています。
手順
1. 払う前に、払わなくてもできる作業を終わらせる
まず eas.json(EAS Buildの設定ファイル)を、ADPの支払い判断より先に作りました。この作業にADPは要りません。払うかどうかに関係なく無駄にならない作業です。
逆に、払ってから作ると、待ち時間のあとにさらに設定の手戻りが乗ります。
入れなかったものもあります。appleId / ascAppId / appleTeamId は、ADP登録まで値が存在しません。空欄にしておけば eas submit が対話で聞いてくれます。
2. 技術側で潰せるものを全部潰す
支払い前に、チェックを全部緑にしました。
| 項目 | 結果 |
|---|---|
npx expo-doctor | 18/18 パス。指摘ゼロ |
npx tsc --noEmit | exit 0 |
| ユニットテスト(統計計算) | 32/32 |
| ユニットテスト(ユーザーデータ) | 44/44 |
| アプリアイコン | 1024×1024・アルファチャンネルなし(Apple要件) |
| スクリーンショット | 1290×2796・アルファなし |
アイコンのアルファチャンネルは見落としやすいポイントです。透過が残っていると弾かれます。
ここまでやって、こう書き残しました。
残っている未知は「審査を通るか」だけになった。技術側で潰せるものは、支払い前に潰し切っている。
3. 支払い、そして同日提出
ADPに登録し、支払いから同日中に提出まで到達しました。ビルド2を提出。ステータスは「審査待ち」です。
提出時に確定した申告はこうです。
| 項目 | 値 |
|---|---|
| 価格 | 無料 |
| 配信地域 | 日本のみ |
| リリース方式 | 手動(審査通過後も自動公開されない) |
| App のプライバシー | データの収集なし |
| 年齢制限 | 4+ |
| コンテンツ配信権 | 必要な権利を保有(国交省データの収録について審査メモで説明) |
リリース方式を手動にしたのは、通過=公開にしないためです。公開のタイミングを自分で選べます。
4. ストア文言は設定ファイルから流し込む
タイトル・サブタイトル・説明文・キーワード14語・プロモ文・URL・カテゴリ・年齢制限・審査メモは、store.config.json に書いて eas metadata:push で投入しました。手打ちゼロです。
ただし、自動化できないものもありました。次回以降も手作業になります。
| 作業 | 理由 |
|---|---|
| アプリの新規作成 | Appleの公開APIに作成機能がない。Apple ID+2FAが必要 |
| 証明書・プロファイルの初回作成 | --non-interactive では新規作成ができない |
| スクリーンショットの投入 | eas metadata は画像に非対応 |
| 価格・配信地域・著作権 | App Store Connectの画面のみ |
なお ascAppId を eas.json に記録しておくと、2回目以降の提出ではアプリ作成の手順が消えます。
5. 提出直前に潰した事故3件
- スクリーンショットの枠違い。 App Store Connectで既定で開くのは6.5インチ用(1242×2688等)ですが、手元の画像は**1290×2796(6.9インチ用)**でした。そのまま入れれば弾かれています。6.9インチ枠に入れれば、それ以下のサイズはAppleが自動で流用します
- 配信地域の誤選択。 一覧の再描画で香港にチェックが入っていました。日本のみに修正
- 輸出コンプライアンス。
ITSAppUsesNonExemptEncryption: falseをapp.jsonに埋め込み、ビルドごとの手作業申告を不要にしました
つまずいた点
リジェクト1回目:権限の説明文が不十分
提出翌日、Appleから自動メッセージが届きました。**「purpose string が placeholder または不十分」**として、審査が進行不能に。
重要なのは、これは自動解析による判定で、審査担当がアプリを触る前の段階で止まっていることです。人間の審査にすら入っていません。
原因の特定手順
expo config --type introspect を実行して、実際にビルドへ入る Info.plist の中身を確認しました。
説明文は3つ入っていて、ライブラリが注入した既定文言はなく、すべて自分で書いたものでした。
| 説明文 | 判定 |
|---|---|
| 写真ライブラリへの「追加」権限 | 最有力の原因。 曖昧なうえ、アプリはフォトライブラリに書き込んでいない(アプリのドキュメント領域に複製するだけ)=使っていない権限の説明文 |
| 写真ライブラリへのアクセス権限 | 用途は書いていたが具体例がない |
| カメラ権限 | 同上 |
対応
- 使っていない権限の説明文を削除する。 Appleのメールが示した2択のうち「必要のない保護リソースは説明文ごと削除せよ」に該当します
- 残る2つを「用途 → 具体例 → 保存先 → 外部送信しないこと」まで書いた文面に差し替える
たとえばカメラ権限は、こう書き直しました。
道の駅で手に入れた記念きっぷや国道ステッカーをその場で撮影し、あなたの訪問記録に添えるために使用します。たとえば「道の駅 三笠」を訪れた記録に、受け取った国道ステッカーを撮影して残せます。撮影した写真はアプリ内にのみ保存し、外部へ送信することはありません。
この失敗から得た一般則
権限の説明文は「なぜ要るか」だけでは足りない。「具体例」と「そのデータがどこへ行くか」まで書く。 そして、使っていない権限の説明文を残さない。 削除は減点ではなく、Appleが明示的に勧める選択肢です。
expo config --type introspectで、ビルドに入る Info.plist を提出前に必ず確認する。app.jsonを読むだけでは、プラグインが注入する文言を見落とします。
復帰コストは、思ったより小さかった
修正から再アップロードまで約15分(ビルド3分+アップロード数分)。リジェクトから再提出まで約1時間で、大半が待ち時間でした。
再ビルド・再アップロードは完全に非対話で通っています。証明書はEAS保存分が再利用され、ascAppId を記録済みだったため、Apple IDのパスワード認証が一度も発生しませんでした。
ひとつだけ未解決の問題も出ました。再提出時に eas metadata:push が Apple の 401(認証情報が無効)で失敗しています。前日は同じキーで成功していたので、権限不足か一時的な失効か特定できていません。審査メモはApp Store Connectの画面から直接入力して回避しました。eas submit と eas build は影響を受けていません。
成果物
- 提出前チェックの型が確定(expo-doctor / tsc / テスト / アイコンのアルファ / スクショの枠)
- リジェクトは致命傷ではないと実測で確認(復帰コスト約1時間)
- 権限まわりの一般則を獲得。これは2本目以降でそのまま効きます
そして何より、リジェクトされても審査の本体(人間による審査)はまだ始まっていないという状態の読み方が分かりました。自動解析で止まっているのか、人が見て落としたのかで、意味がまったく違います。
次回は最終回。審査通過から、公開ボタンを押すまでの話です。ここでもうひとつ確認すべきことが残っていました。
→ #5 審査通過からリリースまで — 契約の確認と、11日で出した記録
この手順書の「実物」版
ここまでの記録は物語として書いています。実際に使ったファイルそのものは、有料記事にまとめました。
- 審査に通った設定ファイルの全文(
package.json/app.json/eas.json/ ストア文言) - 審査メモの全文と、却下への返信文の型
- リジェクト4回の全記録(何が届いて、本当の原因は何で、どう直したか)
- つまずき67件の逆引き表(症状 → 原因 → 対処)
- 提出前チェックリスト
稼ぎ方は書いていません。 2026年9月8日時点のダウンロードは、道の駅ぽんまるが公開26日で36件、とじまるが6日で7件です。売れる方法は、まだ分かっていません。
→ Windows1台・コード0行でiOSアプリを2本App Storeに出した全記録|審査4回リジェクトの原文と、通った設定ファイル(3,980円・Brain)
同じ記事を note でも同じ価格で出しています。安い経路はありません。