new-app-info は何をしますか?
Appleの「追加情報が必要です」というリクエストを1つのファイルに変換します。ユーザーはこれをApp Store Connectで返信し、さらにApp Review InformationのNotesフィールドにも貼り付けて、将来の提出時に情報が引き継がれるようにします。録画はユーザー自身が行う唯一の部分です。
Appleが要求する6つの項目
すべてのパックは、Appleからのメッセージが欠落していたり異なる表現であっても、以下の6つすべてに番号1〜6の順で回答します。Appleのメッセージが項目を追加または変更している場合は、Appleのバージョンに従い、差異をメモします。
| # | Appleの質問 | 回答元 |
|---|---|---|
| 1 | 最新OSを搭載した実機でキャプチャした画面収録。アプリの起動から始まり、典型的なユーザーフローを示すこと。アカウント登録、ログイン、アカウント削除(該当する場合)、ユーザー生成コンテンツとその報告・ブロック機能、有料コンテンツや機能へのアクセスを含むこと | パート1(ショットリスト)+ 返信§1 |
| 2 | アプリの目的とターゲットオーディエンス:解決する問題と提供する価値 | 返信§2 |
| 3 | 主要機能のセットアップとアクセス方法、必要なログイン認証情報やサンプルファイルを含む | 返信§3 |
| 4 | コア機能に使用される外部サービス、ツール、プラットフォーム(データプロバイダー、認証、決済処理、AIサービス) | 返信§4 |
| 5 | 機能やコンテンツの地域差、またはすべての地域で同じ動作であることの確認 | 返信§5 |
| 6 | 高度に規制された産業または保護された第三者の素材:許可を示す文書または認証情報 | 返信§6 |
厳格なルール
- 録画は実機で、最新OSで、1テイク、通常速度、アプリアイコンをタップするところから開始すること。 シミュレーター録画や早送り編集を提出として提供しないでください。ユーザーの電話を操作することはできないため、録画はユーザー自身が行うものです。あなたの仕事はショットリストを作成することです。
- ビルドに含まれているものだけを主張すること。 すべての機能、サービス、言語はコードから取得し、計画やメモからは取得しないでください。
- 該当しない場合も回答すること。 理由とともに1文で回答します(例:「アプリにはアカウント登録やログインはありません」)。
- アカウント: ユーザーがアカウントを作成できる場合、アカウント削除が必須であり、録画に含める必要があります。欠落している場合は、ブロッカーとして報告します。ログインがある場合、項目3にデモ認証情報(アカウントタイプごとに1セット)が必要です。ユーザーにApp Store Connectで入力するよう指示します。ファイルに実際のパスワードを書き込まないでください。
- App Store Connectで何も送信、提出、編集しないでください。 ユーザーが返信を貼り付け、ビデオを添付します。
- リポジトリまたはデバイスから入力できるすべてのプレースホルダーを埋めてください。残ったものとそれぞれを埋めるものをリストします。
ステップ1:Appleのメッセージを読む
ユーザーがメッセージをペーストした場合、その番号付き項目を上記の表と照合し、どの録画条件(アカウント、UGC、有料コンテンツ)がこのアプリに適用されるかをメモします。
ステップ2:コードに基づいて回答する
提出されたコミットのコードを読み、作業コピーは読まないでください(最初にピン留めします。ステップ6→レビュービルド、ステップ0を参照)。作業コピーは未出荷の機能を含むフィーチャーブランチであることが多く、それらをAppleに説明することは、彼らが持っていないビルドについての主張になります。git grep <pattern> <commit> -- <paths> および git show <commit>:<path> を使用します。
すべての検索で build、Pods、.dart_tool、node_modules、.git を除外します。
| 項目 | 確認場所 |
|---|---|
| 1、3:起動からのメインフロー | ルーターとスクリーン、オンボーディング、コアループ |
| 1、3:アカウント、ログイン、削除 | firebase_auth、sign_in_with_apple、supabase、Auth、login、signUp、deleteAccount、delete.*data |
| 1:ユーザー生成コンテンツ | 投稿、コメント、チャット、アップロード、report、block、flag |
| 1、3:有料コンテンツ | purchases_flutter、revenuecat、StoreKit、product_id、ペイウォール画面。ゲートされている機能、無料トライアル、ペイウォールが表示されるタイミング、購入の復元場所を特定 |
| 1:画面キャプチャ防止 | no_screenshot、isSecureTextEntry のトリック、UIScreen.capturedDidChange、FLAG_SECURE。ブロックされた画面は録画で空白になるため、理由を返信に記載 |
| 2:目的とオーディエンス | ストアリスティングのコピー、ブランドやボイスのドキュメント、README、ローンチチェックリスト、オンボーディングのコピー(.arb、.strings、strings.xml) |
| 3:サンプルファイル | ファイルインポート、ドキュメントピッカー、QR/バーコードスキャン、アプリが必要とするハードウェア |
| 4:外部サービス | 依存関係(pubspec.yaml、Podfile、package.json、Gradle)とビルド定義(--dart-define、キーファイル、リリーススクリプト)。各サービスの機能と取得するデータ。リリースビルドで実際に有効になっているSDKのみをリスト |
| 5:地域 | 出荷されているロケール、地域チェック(locale、countryCode、region)、地域固有の価格、機能、コンテンツ |
| 6:規制または保護 | 健康、医療、金融、ギャンブル、法律、子供向けコンテンツとクレーム、ライセンスコンテンツ、音楽、画像、フォントとそのライセンス |
| 連絡先 | 設定、プライバシードキュメント、ウェブサイトファイル内のサポートメール |
| プラットフォーム | IPHONEOS_DEPLOYMENT_TARGET、TARGETED_DEVICE_FAMILY(iPhoneのみか、iPadも含むか) |
項目4の分析に関する文言がリポジトリ内のプライバシーポリシーと一致することを確認します。一致しない場合、またはApp Store ConnectのApp Privacyの回答を確認できない場合はフラグを立てます。
ステップ3:デバイスとOS(項目1)
xcrun devicectl list devicesでペアリングされたデバイスを表示します。利用可能なユーザー自身のiPhoneを使用します。xcrun devicectl device info details --device <id> | grep -i osVersionでiOSバージョンを表示します。- 最新のiOSリリースをウェブで検索します。電話が遅れている場合は、その旨を伝えます。ユーザーは録画前に設定→一般→ソフトウェアアップデートで更新し、その後バージョンを再度読み取ります。電話のOSはユーザー自身が更新するものです。
- 電話がペアリングされていない場合は、
[iOS version]を残し、ユーザーに確認場所(設定→一般→情報)を伝えます。
ステップ4:よくある問題を防ぐ
Appleのよくある問題をそれぞれチェックし、結果をユーザーへのレポートに記載します。これらはユーザー向けのチェックであり、返信の一部ではありません。
| ガイドライン | チェック内容 |
|---|---|
| 2.1 バグとクラッシュ | 録画は提出バージョンのTestFlightビルドを実機で使用。TARGETED_DEVICE_FAMILY からサポートされるプラットフォーム:iPadがサポートされている場合、ユーザーにiPadでもテストするよう指示 |
| 2.1 アプリへのアクセス | ログイン→デモ認証情報がアカウントタイプごとに1セット、App Store Connectに入力され、まだ機能していること |
| 2.3.3 スクリーンショット | ストアのスクリーンショットをリスト(例:app-store-assets/*screenshots*)。タイトルアート、スプラッシュ、ログイン画面のように見えるものをフラグ |
| 3.1.1 アプリ内課金 | コード内のすべてのプロダクトIDがApp Store Connectで設定され、この提出に添付されていること。ユーザーが確認するためのIDをリスト |
| 3.2 その他のビジネスモデル | アプリが1つのビジネス、組織、またはその従業員向けの場合、別の配布オプション(カスタムアプリまたは非公開配布)が必要であることをフラグ |
ステップ5:ファイルを書く
app-store-assets フォルダが存在する場合は app-store-assets/new-app-info.md に、そうでない場合は ./new-app-info.md に書き込みます。以下の構造を維持します(完全な例は examples/seven-minute-math/new-app-info.md にあります):
# App Review information — <アプリ名>
パート2をApp Store Connectで返信し、録画を添付します。その後、パート2を
App Review Information → Notes に貼り付け、将来の提出時に情報が引き継がれるようにします。
<まだ埋めるべきプレースホルダーがあればここに。>
## パート1 — 画面収録(項目1;自分で録画してください)
理由:実機、最新OS、1テイク、通常速度、アイコンをタップするところから開始。
セットアップ(デフォルト:Macからインストールしたリリースビルド。下記「レビュービルド」を参照):
サンドボックステスターを作成(App Store Connect → ユーザとアクセス → サンドボックス → テストアカウント);
電話からアプリを削除;レビュービルドをビルドしてインストール;コントロールセンターで画面収録をオン(マイクオフ);
おやすみモードをオン;サンドボックステスターでAppleの購入シートにサインイン(「Sandbox」と表示されるシートは正常)。
番号付きショットリスト:アイコンをタップ → オンボーディング → エンドツーエンドの典型的なフロー → 結果 →
該当するすべての録画条件(サインアップ、ログイン、アカウント削除;投稿、報告、ブロック;
ペイウォール、サンドボックス購入、アンロックされた機能、購入の復元) → ユーザーがデータを削除する方法 → 停止。
空白になる画面(キャプチャ防止)とその理由。
## パート2 — 返信(これを貼り付け)
挨拶、および録画が行われたデバイスとiOSバージョン。
**1. 画面収録** … **6. 規制産業/第三者の素材**:それぞれ太字のセクション1つ。
サポートメールで締めくくる。
書き方:
- §1:録画に含まれるもの、該当しない録画条件とその理由、空白の画面。
- §2:誰のためのものか、問題点、アプリの解決方法、価値。3〜4文。
- §3:開始に必要なもの(認証情報はApp Store Connectに入力、ファイルには絶対に書かない)、主要機能を短いリストで、無料と有料の区別、ペイウォールが表示されるタイミング。
- §4:サービスごとに箇条書きで機能を説明。該当する場合、アプリが使用していないもの(AI、データプロバイダー、認証)について1行。
- §5:言語と地域差、または「すべての地域で同じ動作」。
- §6:文書、または「該当なし」と理由。
- 平易で事実に基づき、丁寧に。マーケティング用語は避ける。
ステップ6:エンドツーエンドのビデオ(項目1)
レビュービルド
レビュー中の正確なバージョンのリリースビルドを、Macから直接電話にインストールして録画します。あなたがビルドしてインストールし、ユーザーが録画します。
- 提出バージョンをピン留めします。 ユーザーに、App Store Connectでレビュー中の提出に表示されているバージョンとビルド番号(例:1.0.0 (1))を尋ねます(まだ提供されていない場合)。それを生成したコミットを見つけます:リリースタグ、リリースまたはメインブランチ、コミットメッセージ(例:「App Storeに出荷」)、または
pubspec.yaml/Info.plistがそのバージョンとビルドを設定したコミット。2つのコミットが一致する可能性がある場合は、どちらか尋ねます。作業コピーから決してビルドしないでください: 多くの場合、Appleがまだ見ていない未コミットの変更を含むフィーチャーブランチです。代わりに、分離されたワークツリーでビルドします(git worktree add --detach <scratch>/review-build <commit>)。git無視されたキーファイル(例:keys.json)をcpで読み取らずにコピーします。どのコミットをビルドしているか、新しいブランチに何がありビデオに含まれないかをユーザーに伝えます。 - プロジェクトの通常のデバイスビルドを見つけます(スクリプト、
tool/*.sh、Makefile、Fastlane)。DUMMY_PURCHASES、MOCK、FAKE、USE_TEST_STORE、RevenueCatのtest_キー、StoreKit設定ファイルなど、購入を偽装するすべてのフラグを削除します。偽の購入はAppleのシートを表示せず、レビュアーがそれなしで有料機能がアンロックされるのを見ると、アプリ内課金(3.1.1)の回避と見なされる可能性があります。購入キーがライブストアキーであることをプレフィックスのみで確認します(例:grep -q '"REVENUECAT_IOS_KEY": "appl_');キー値を決して出力しないでください。 - リリースモードでビルドします。デバッグモードは避けてください:デバッグのFlutterやReact Nativeビルドはホーム画面のアイコンから開けず、Appleは録画をそこから開始することを求めています。Flutter:
flutter build ios --releaseを、偽のフラグを除いたプロジェクトの通常の定義で実行します。 - ビルドされたアプリが提出と一致することを確認します:
/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" -c "Print CFBundleVersion" build/ios/iphoneos/Runner.app/Info.plistが提出されたバージョンとビルドを出力する必要があります。出力しない場合は、停止してユーザーに伝えます。 - ユーザーにまず電話からアプリを削除してもらいます(電話上のデータが消去されるため、ユーザーの判断です)、その後インストール:
xcrun devicectl device install app --device <id> build/ios/iphoneos/Runner.app。 - MacからインストールされたビルドはAppleのサンドボックスを通じて購入するため、ユーザーは購入シートにサインインするためにサンドボックステスターが必要です。同じビルド番号のTestFlightインストールも機能し(購入は自分のApple IDで無料)、Appleが持っている正確なバイナリを保証します。ユーザーが希望する場合はそれを使用します。
録画とチェック
パックは、録画が存在しチェックされるまで完了しません。ユーザーが録画し、あなたがそれを促します。チャットで、パート1のセットアップ(サンドボックステスターを含む)と番号付きショットリストを伝えます。AirDropでファイルを app-store-assets/review-recording/ に送信し、到着したら知らせるよう依頼します。その後:
ffprobe -v error -show_entries format=duration:stream=width,height,codec_name -of default=nw=1 <file>。解像度が実機のiPhone画面と一致し(シミュレーターウィンドウや切り抜き編集ではない)、再生時間がフロー全体をカバーしていることを確認します。- 10秒ごとに1フレームのコンタクトシートを作成:
ffmpeg -i <file> -vf "fps=1/10,scale=240:-1,tile=8x8" -frames:v 1 <dir>/contact.png。最初のフレームも単独で保存します。両方を読み取ります。 - 順番に確認:最初のフレームがホーム画面またはアプリアイコンのタップを示していること、すべてのショットリストのステップが含まれていること、録画条件がカバーされていること、空白の画面が必要な場合にのみ存在すること、録画が停止していること。