Google Playにアプリを3本公開しました。そのあいだに詰まった箇所を、公開作業の順番どおりに全部並べます。

一般論は書きません。全部、自分が実際に踏んで、実際に止まったものです。各項目には詳細を書いた記事へのリンクを付けてあります。

0. 前提: 公開までの日数は短縮できない

最初に、いちばん大きい制約です。

新規のデベロッパーアカウントで個人開発をする場合、クローズドテストを「12人以上のテスターで、14日間連続」実施しないと製品版に出せません。

逆算するとこうなります。

テスター12人を集める      数日〜(ここがいちばん読めない)
オプトイン完了 = D0
14日間の連続テスト        D0 + 14
本番アクセス申請の審査     数日
────────────────────────────────
最短でも 29日程度

「来月リリース」は、この日から数えて成立するかを確認してください。 実装が終わっているかどうかとは無関係に、日数が要ります。(詳細

1. ビルド

releaseビルドでだけ落ちる

flutter run で動き、flutter analyze が通り、それでもreleaseビルドでだけクラッシュする、が3回ありました。原因はR8による難読化・圧縮まわりが中心です。debugで全部動くことは、releaseの動作を1ミリも保証しません。詳細

署名鍵を失うと、そのアプリは二度と更新できない

アップロード鍵を紛失すると復旧の申請は可能ですが、アプリ署名鍵のほうを自前管理していて失うと、そのパッケージ名でのアップデートは終わりです。 バックアップの置き場所を、開発マシンとは別に用意してください。自分は外部にバックアップを取っています。

AdMobの本番IDは、製品版の申請直前まで入れない

テストIDのままで開発します。本番IDを入れた状態で開発中に自分で広告をクリックすると、AdMobのアカウント停止事由になります。

これはテスト期間の話とは別問題として扱ってください。自分はクローズドテスト中は都度ビルドを更新しますが、AdMobのIDだけは製品版申請の直前に差し替えるという例外にしています。切り戻せるよう、旧テストIDはコード中にコメントで残しています。

2. ストア掲載物

スクリーンショットは「長辺 ≦ 短辺 × 2」

これは実機で撮った画像がそのままでは通らない、という意味です。

画像比率判定
moto g24 の実機スクショ 720×16122.239不可
iPhone 15 Pro 相当 1179×25562.168不可
1080×19201.778

要件は、JPEGまたは24bit PNG(アルファなし)、各辺320〜3840px、長辺は短辺の2倍を超えないこと

近年の縦長端末で撮ったスクショは、素で規定違反です。 自分は、ナビゲーションバーを切り落として1080×1920に収め、左右をアプリの背景色で埋めるスクリプトで処理しています。(詳細

なお、社内の指示書に「1179×2556」と書いてあったのは、App Storeの要件と取り違えたものでした。手元の資料ではなく公式ヘルプを見てください。

掲載動画は用意したほうがいい

30秒程度の動画を1本置けます。編集ソフトが無くても、実機の画面録画とffmpegだけで作れます。(作り方

要件は「一般公開または限定公開のYouTube動画/広告オフ/年齢制限なし」です。非公開だとPlay Console側で弾かれます。

3. アプリのコンテンツ(ここが本番)

データセーフティは「3点一致」で見られる

申告フォーム・プライバシーポリシー・実際の実装。この3つが食い違うと落ちます。

たとえば広告を入れるなら、「広告を含む」の申告、広告IDの申告、プライバシーポリシーへの記載の3点セットが要ります。1つ欠けても不整合です。

規約類のURLは、切れた瞬間に審査が止まる

自分はこれで2本のアプリの提出がブロックされました。

GitHubのアカウント名を変えたら、GitHub Pagesで公開していた規約ページのURLが全部変わり、Play Consoleに登録済みの「データ削除用URL」が404になっていました。 送信ボタンを押した瞬間に、こう出ます。

データの削除ページで「ページが見つかりません」エラーが発生しました

ファイルを直したことと、外部サービスの設定欄まで直したことは、まったく別です。 アカウント名やリポジトリ名を変えたら、全アプリのPlay Consoleを横断で確認してください。詳細

配信国は、初期値のままだと日本1か国のことがある

海外の人に触ってほしいなら、「国 / 地域」タブを必ず見てください。 日本のみの設定だと、海外からストアURLを開いても「お住まいの国では利用できません」でインストールできません。(詳細

4. 課金まわり

無料トライアルは基本プランの中に無い

Play Consoleで探し回ります。「特典(Offers)」タブです。

定期購入の商品を開く → 基本プランの行の「特典を追加」
  → 特典ID → 無料試用期間の日数 → 有効化

基本プランの編集画面をいくら見ても出てきません。

商品一覧の「特典」欄が になっていたら、その商品にトライアルは存在しません。 「設定したつもり」を判定できる場所として、ここは覚えておく価値があります。

プロモコードは種別を間違えると引き換えられない

これは知らないと確実に事故ります。

種別引き換え場所数量
1回限りのコードPlayストアから引き換え可能サブスクは商品あたり四半期10,000
カスタムコード自社アプリ内の引き換えUIからのみ

アプリ内にコード引き換えのUIを実装していないなら、カスタムコードは誰にも引き換えられません。 コンテストの審査員などに配るなら、1回限りのコードを選んでください。

自分は最初にカスタムコードを主に据えていて、直前に気づきました。

有効期限は、渡す相手が使う期間と重なっているか

発行済みのコードの終了日が9/30で、相手が触る期間が10/1〜10/13でした。重なる日が1日もありません。 発行してあること自体に安心して、日付を見ていませんでした。

購入のキャンセルが「失敗」と表示されていないか

自分のアプリでは、ユーザーが購入をキャンセルしただけで「購入に失敗しました」と表示されるバグが残っていました。SDKが投げる例外の型が想定と違い、catch が素通りしていたためです。

キャンセルは正常系です。 ここを異常として表示すると、初めて触った人には「壊れているアプリ」に見えます。(課金で11日間気づかなかった話

5. 提出・公開

保存しただけでは、審査に入らない

Play Consoleは2段階です。

① 各画面で変更を保存する
② 「公開の概要」から、保存した変更をまとめて審査に送信する

②を忘れると、画面上は正しく見えているのに本番へ一生反映されません。 自分は配信国の変更で一度これを踏み、数日後に気づきました。

Play Consoleで何かを変えたら、最後に必ず「公開の概要」を開く。 これを手順に固定してください。

クローズドテスト中は、ビルドを1本にまとめない

準備できるたびに都度アップロードします。テストが継続的に行われていることを示す材料になるためです。同一トラックへの複数回アップロードで、14日のカウントが途切れた実績はありません。

目安として、テスト期間中に2〜3回はバージョンを上げて再アップロードしています。

審査に出す前に、シークレットウィンドウでストアURLを開く

自分の端末では、自分のアカウントでログインしていて、テスターにも登録されていて、当然すべて動きます。壊れているのは常に自分の環境の外です。

  • インストールボタンが出るか(配信国・公開状態)
  • 規約・プライバシーポリシーのリンクが404でないか
  • 動画が再生できるか(非公開になっていないか)

3分で終わります。 自分はこれをやらずに、上のいくつかを本番で踏みました。

チェックリスト

コピーして使ってください。

[ ] クローズドテスト12人×14日の日数を逆算した
[ ] releaseビルドを実機で起動して主要導線を通した
[ ] 署名鍵を別の場所にバックアップした
[ ] AdMobはテストIDのまま(本番IDは製品版申請の直前)
[ ] スクショは長辺≦短辺×2(1080×1920推奨)
[ ] 掲載動画は一般公開/限定公開・広告オフ・年齢制限なし
[ ] データセーフティ = 申告 / ポリシー / 実装 の3点一致
[ ] 規約・削除ページのURLが生きている(Console側の登録欄も)
[ ] 配信国を確認した
[ ] 無料トライアルは「特典」タブで有効化済み
[ ] プロモコードは「1回限りのコード」/有効期限が使用期間と重なる
[ ] 購入キャンセルが「失敗」表示になっていない
[ ] 「公開の概要」から審査に送信した
[ ] シークレットウィンドウでストアURLを開いて確認した

このリストは今後も踏むたびに追記します。個別の詳細は各記事にあります。開発体制そのものの話はこちら、実際にかかった費用はこちらです。