← トップにもどる

ストア申請 実証知見まとめ

実証アプリ: 君斗りんくのWEBサイト健康診断(2026-06)
キット: web-ios-android テンプレ / リポ: web-health-check-app

関連: 💬 LINE botの無応答ゼロ化の仕組み(同じ「1回で通す・止めない」思想をLINE bot側に適用した知見)

北極星(ブレない原則)

🍎 iOS(App Store)

人間が1回だけ必要

CI で自動

配信地域 0 の罠: API 提出だけだと国未設定のまま通過しうる → キットは [7g] で自動設定(2026-06 実証)。
アイコン差し替え: 1024px マスターを使う。512px で 1024 を上書きすると CI の 75KB チェックが落ちる(RH 実証)。

アイコン方針(実証)

会社ロゴ文字は小サイズで潰れる → 紺地 + 白抜きルーペ+チェックgenerate-app-icon.mjs

🔐 認証つきアプリの §4.8(Sign in with Apple)— 第三者ログインの種類で対応が変わる

§4.8: 第三者/ソーシャルログイン(Google・X(Twitter)・Facebook 等)で主アカウントを作る/認証するアプリは、 同等の選択肢として Sign in with Apple(SIWA) を併設しなければならない。server.url 連動型でも ログイン画面は本番Webそのものなので、アプリ内に出るログインボタンが §4.8 の対象になる。

分岐:Email/PW があるか、ソーシャル専用か

もう一つの壁:ソーシャル OAuth は WebView で拒否される

Google OAuth は埋め込み WebView を UA で検出して拒否(403 disallowed_useragent)。 X(Twitter) OAuth も同方針。Bパターンは SIWA 併設に加え、必要なら @capacitor/browser で OAuth を SFSafariViewController に逃がす。

Clerk はプロバイダのプラットフォーム別出し分けが無い(instance 単位でグローバル)。 iOS で隠すのは UI レイヤーのみ(上記3層)。
allowNavigation の落とし穴: 連動型で本番ドメインしか許可しないと OAuth リダイレクト先 (x.com / *.twitter.com / *.clerk.com / *.clerk.accounts.dev)が 遮断されアプリ内ログインが必ず失敗する。capacitor.config の server.allowNavigation に必ず足す。
審査用デモアカウント(§5.1.1)必須: ログインアプリは審査員が入れないと即却下。2FA は無効化して渡す。

出典: _docs/apple-reject-knowledge-base.md §4.8(リバースハック実通過の返信文つき)/ kimito.link(X専用=Bパターンの実適用)。

▶ Android(Google Play)

人間が触る画面

CI / スクリプトで自動

📷 画面付き手順 → iOS 追体験Play 追体験

製品版だけの罠(2026-07 実証): 内部テストには無いが、製品版(一般公開)を出すときは 「配信国/地域」の選択が必須。未選択だと赤字で「国または地域が選択されていません」と出て 保存できない。「国/地域」タブで国(例:日本)を追加すればOK。
広告IDの申告は「広告」欄とは別ダイアログ: 11項目で「広告は含まれていません」を選んでいても、 審査に送る直前に別の確認ダイアログ「広告 IDの申告が不完全です」が出る。広告SDKを使わない 殻アプリ(Capacitor/TWA)は「いいえ」で通過。
一覧のアイコンが変わらなくても焦らない: ストア一覧に出るアイコンは最後に配信済みの バージョンのキャッシュ。新しいアイコンを入れた審査待ちビルドを出しても、承認・配信される まで一覧は古いアイコンのまま表示される(審査待ちビルドの中身は新アイコンで正しく入っている)。

🧩 Chrome(Web Store)

📷 手順 → Chrome 追体験

🤖 AIに「提出できません」と3回言われた話

Chrome 拡張の申請をAIに頼んだら、「ダッシュボードへのログインと提出ボタンは代行できません」 と断られました。過去に何度もやってもらっていたのに、です。3回言われて、ようやく原因が分かりました。

AIは2つの別々の事実を混同していました

「画面を操作できない」と「提出できない」は別の話でした。 実際にはコマンド1本(npm run publish:cws)で審査キューに入ります。

ややこしいのは、ストアごとに「自動化の境界」が逆なこと

ファイル送信掲載文の入力審査に送る
Chrome自動手動自動
Google Play自動自動手動

Play は掲載文まで自動で入れられるのに、最後の「審査に送信」だけは人間がボタンを押します。 Chrome はその逆で、審査送信は自動なのに掲載文の貼り替えだけ手動です。 「片方でこうだったから、もう片方も同じはず」が通じません。

⚠️ 並行作業で起きたこと(Codex × Cursor)

🔍 「直したのに変わらない」を3回やった話

AIに調査させると、コードを読んで「たぶんここが原因」と推論します。 それらしい答えが返るので、つい信じて修正に進みます。 でも読んだファイルが、実際には使われていないことがあります。

3回とも、コードは十分に読み込んだ上で外しています。 解決したのは、実際に送信されている中身を1回だけ丸ごと覗いたときでした。 想像していた構造と全く違い、指示が16,956文字あって肝心の入力データは末尾にありました。

「性能の高いものに変えれば直る」は、原因を特定する前にやると費用だけ増えます。 詳細は _docs/runtime-truth-verification-knowledge-base.md に残しました。

Secrets 一覧(コピペ用)

用途Secret 名
iOS 署名IOS_DIST_CERT_* / IOS_APPSTORE_PROFILE_BASE64 / IOS_APPSTORE_PROFILE_RH_BASE64 / APPLE_TEAM_ID
ASC APIAPPSTORE_CONNECT_KEY_ID / ISSUER_ID / API_KEY_P8_BASE64
AndroidANDROID_KEYSTORE_* / GOOGLE_PLAY_SA_JSON_BASE64
Chrome.env.cws(リポジトリ外・gitignore)

🤖 AIの中に、係の人を3人おきました

りんくりんく(案内役): AIにぜんぶを1人でやらせると、「できたつもり」で間違えることがあるんだ。 だから、係を3人に分けたよ。

こん太こん太: 「失敗してもだいじょうぶ! きろく係がノートに書けば、二度目はないんだ!」/ 「けんさ係は作った本人と別の人だから、遠慮なくダメ出ししてくれるよ!」

たぬ姉たぬ姉: 係は増やしすぎちゃダメ。3人で足りるのに10人にすると、 だれが何の係かわからなくなるからね。
それに、けんさ係にはわざと「直す道具」を持たせていないの。 審判が選手を兼ねたらダメでしょ? だから「動いてるつもり」を見のがさない。

世界では「AIの係の人を230人つくった」道具(agency-agents)が話題だけど、 うちはこの家の暮らしに本当にいる3人だけを選んで置いた —— 考え方は借りて、数は借りない、という話。
置き場: ~/.claude/agents/(正本は ai-hub/agents/・設計は ai-hub-DESIGN.md 追補H)。Claude Code が名前で呼ぶと係が出てくる。

🙌 人がやることが、かなり減った話

りんくりんく(案内役): 「君斗りんくのAI返信秘書」をお店に出したとき、Play Console の 入力欄(11項目・配信国の選択・広告IDの確認・審査に出すボタンの手前まで)は、ぜんぶ ブラウザを動かせるAIが自分で画面をクリックして埋めたよ。人がキーボードで打ったのは、 ほとんど無いんだ。

こん太こん太: 「めんどうな入力ぜんぶAIまかせにできるの、すごくラクだね! ぼくらは最後の 『よし出そう!』ってボタンを押すだけでいいんだ!」

たぬ姉たぬ姉: ただし最後の一押しは、いまも人がやる約束。取り消せないボタンを AIまかせにしないの。これは「AIがサボってる」んじゃなくて、わざと人に残してるんだよ。

📟 「見てきて」と頼まなくて済むようにした話

不具合を直すとき、いちばん時間を食うのは修正そのものではありません。 AIが「実機でどうなっているか分からない」ので、毎回あなたに見てもらう往復です。 「開いて、そこを押して、どう見えるか教えてください」——これが1日に何度も起きます。

直し方は、アプリ自身に自分の状態を数字で申告させることでした。 画面を見なくても、コマンド1回で今の状態が1枚のテキストで出てきます。

これで、調査の往復から人が外れました。 「目視をお願いして説明を待つ」が「コマンド1回・数秒」になっています。

考え方の全体はキットの説明書(AIが読む用)に入っています。 新しいアプリを作るときは、作り始める前に読ませてください。 後から計器を足すのは、作りながら足すより何倍も高くつきます。

追体験ガイド