new-app-info 是做什麼的?
將 Apple 的「我們需要更多資訊」要求轉換成一個檔案。使用者在 App Store Connect 中以該回覆回覆,並將其貼到 App Review Information 的 Notes 欄位中,以便未來提交時都已包含此資訊。螢幕錄影是唯一需要使用者自行產生的部分。
Apple 要求的六個項目
每個資訊包都會回答所有六個項目,編號為 1–6,依此順序排列,即使 Apple 的訊息遺漏或措辭不同。如果 Apple 的訊息新增或變更了某個項目,請遵循 Apple 的版本並註明差異。
| # | Apple 要求的內容 | 回答方式 |
|---|---|---|
| 1 | 在實體裝置上錄製的螢幕錄影,裝置需執行最新作業系統。必須從啟動 App 開始,展示典型使用者流程,包括(如果 App 有):帳號註冊、登入與帳號刪除;使用者生成內容及其檢舉與封鎖功能;以及存取付費內容或功能 | 第 1 部分(拍攝清單)+ 回覆 §1 |
| 2 | App 的目的與目標受眾:它解決的問題與提供的價值 | 回覆 §2 |
| 3 | 設定與存取主要功能的說明,包括任何必要的登入憑證或範例檔案 | 回覆 §3 |
| 4 | 用於核心功能的外部服務、工具或平台(資料提供者、身分驗證、支付處理、AI 服務) | 回覆 §4 |
| 5 | 功能或內容的任何地區差異,或確認 App 在所有地區運作方式相同 | 回覆 §5 |
| 6 | 對於高度監管的產業或受保護的第三方素材:證明授權的文件或憑證 | 回覆 §6 |
嚴格規則
- 螢幕錄影必須在實體裝置上進行,使用最新作業系統,以正常速度一次不間斷拍攝,從點擊 App 圖示開始。 切勿提供模擬器錄影或加速剪輯作為提交內容。您無法操控使用者的手機,因此錄影需由使用者自行完成;您的工作是提供拍攝清單。
- 僅聲明建置檔案中存在的內容。 每個功能、服務和語言都必須來自程式碼,而非來自計劃或備註。
- 不適用也是一種答案。 用一句話說明原因(例如:「此 App 沒有帳號註冊或登入功能」)。
- 帳號: 如果使用者可以建立帳號,則必須提供帳號刪除功能,且必須出現在錄影中;如果缺少此功能,請將其回報為阻礙。如果有登入功能,第 3 項需要示範用憑證(每種帳號類型一組):告知使用者在 App Store Connect 中輸入這些憑證。切勿在檔案中寫入真實密碼。
- 切勿在 App Store Connect 中發送、提交或編輯任何內容。 使用者貼上回覆並附加影片。
- 盡可能從儲存庫或裝置填入所有佔位符。列出尚未填入的項目及應填入的內容。
步驟 1:閱讀 Apple 的訊息
如果使用者貼上了 Apple 的訊息,請檢查其編號項目與上表的對應關係,並記錄哪些錄影條件(帳號、使用者生成內容、付費內容)適用於此 App。
步驟 2:以程式碼為基礎
讀取已提交版本中的程式碼,而非工作副本(先鎖定該版本,如步驟 6 → 審查建置,步驟 0 所述)。工作副本通常是功能分支,包含未發佈的功能,向 Apple 描述這些功能相當於聲稱他們未擁有的建置。使用 git grep <pattern> <commit> -- <paths> 和 git show <commit>:<path>。
在每次搜尋中排除 build、Pods、.dart_tool、node_modules 和 .git。
| 項目 | 查找位置 |
|---|---|
| 1, 3:啟動後的主要流程 | Router 和畫面;入門引導;核心迴圈 |
| 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:目的與受眾 | App Store 商店文案、品牌或語音文件、README、發佈檢查清單、入門引導文案(.arb、.strings、strings.xml) |
| 3:範例檔案 | 檔案匯入、文件選擇器、QR 碼/條碼掃描、App 需要的硬體 |
| 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 隱私權答案,請標記出來。
步驟 3:裝置與作業系統(第 1 項)
xcrun devicectl list devices會顯示已配對的裝置。使用使用者可取得的 iPhone。xcrun devicectl device info details --device <id> | grep -i osVersion會顯示其 iOS 版本。- 搜尋網路以取得最新的 iOS 版本。如果手機版本落後,請告知:使用者需在錄影前前往「設定」→「一般」→「軟體更新」更新,然後您重新讀取版本。手機的作業系統需由使用者自行更新。
- 如果沒有配對的手機,請留下
[iOS 版本]並告知使用者到何處尋找(「設定」→「一般」→「關於本機」)。
步驟 4:預防常見問題
檢查 Apple 的每個常見問題,並將結果回報給使用者。這些檢查是為使用者進行的,並非回覆的一部分。
| 指導方針 | 檢查內容 |
|---|---|
| 2.1 錯誤與崩潰 | 錄影使用提交版本的 TestFlight 建置,在實體裝置上進行。查看 TARGETED_DEVICE_FAMILY:如果支援 iPad,請告知使用者也在 iPad 上測試 |
| 2.1 存取 App | 登入 → 示範用憑證已在 App Store Connect 中輸入,每種帳號類型一組,且仍可使用 |
| 2.3.3 螢幕截圖 | 列出商店螢幕截圖(例如 app-store-assets/*screenshots*)。標記任何看起來僅為標題藝術、啟動畫面或登入畫面的截圖 |
| 3.1.1 應用程式內購買 | 程式碼中的每個產品 ID 都已在 App Store Connect 中設定並附加到此提交。列出 ID 供使用者檢查 |
| 3.2 其他商業模式 | 如果 App 專為單一企業、組織或其員工設計,請標記需要不同的發行選項(自訂 App 或非公開發行) |
步驟 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 資訊 — <App 名稱>
在 App Store Connect 中回覆時貼上第 2 部分並附加錄影。然後將第 2 部分貼到 App Review Information → Notes,以便未來提交時都已包含此資訊。
<尚有未填入的佔位符(如果有的話)。>
## 第 1 部分 — 螢幕錄影(第 1 項;請自行錄製)
原因:實體裝置、最新作業系統、一次拍攝、正常速度、從點擊圖示開始。
設定(預設:從 Mac 安裝的發佈建置;請參閱「審查建置」下方):
建立沙盒測試人員(App Store Connect → Users and Access → Sandbox → Test Accounts);
從手機刪除 App;您建置並安裝審查建置;在控制中心開啟螢幕錄影並關閉麥克風;開啟勿擾模式;使用沙盒測試人員登入 Apple 的購買表單(出現「Sandbox」字樣是正常的)。
拍攝清單,依序編號:點擊圖示 → 入門引導 → 端到端的典型流程 → 結果 → 每個適用的錄影條件(註冊、登入、刪除帳號;發文、檢舉、封鎖;付費牆、沙盒購買、解鎖的功能、還原購買)→ 使用者如何刪除其資料 → 停止。
任何會顯示為空白的畫面(因螢幕截圖封鎖)及其原因。
## 第 2 部分 — 回覆(請貼上此內容)
問候語,以及錄影所用的裝置與 iOS 版本。
**1. 螢幕錄影** … **6. 受監管產業 / 第三方素材**:每個項目以粗體標題呈現。
結尾行附上支援電子郵件。
撰寫方式:
- §1:錄影內容、哪些錄影條件不適用及其原因,以及任何空白畫面。
- §2:對象、問題、App 解決方式、價值。三到四句話。
- §3:開始使用所需條件(憑證請輸入在 App Store Connect,切勿寫入檔案),然後以簡短列表說明主要功能,區分免費與付費,以及付費牆出現時機。
- §4:每個服務以一個項目符號說明其功能。然後一行說明 App 未使用的服務(AI、資料提供者、身分驗證)(若屬實)。
- §5:語言及任何地區差異,或「在所有地區運作方式相同」。
- §6:文件,或「不適用」並附上原因。
- 簡潔、基於事實且有禮貌。勿使用行銷語言。
步驟 6:端到端影片(第 1 項)
審查建置
錄製審查中的確切版本的發佈建置,透過 Mac 直接安裝到手機上。您負責建置與安裝,使用者負責錄影。
- 鎖定提交的版本。 詢問使用者在 App Store Connect 中顯示的、正在審查的提交的版本與建置號碼(例如 1.0.0 (1)),除非使用者已提供。找到產生該版本的 commit:一個發佈標籤、發佈分支或主分支、包含「shipped to the App Store」等訊息的 commit,或
pubspec.yaml/Info.plist中設定該版本與建置號碼的 commit。如果有兩個可能的 commit,請詢問使用者應使用哪一個。絕不能從工作副本建置: 工作副本通常位於功能分支上,包含未提交的變更,Apple 尚未見過這些變更。請改在隔離的 worktree 中建置(git worktree add --detach <scratch>/review-build <commit>)。使用cp將任何被 git 忽略的關鍵檔案(例如keys.json)複製到其中,無需讀取其內容。告知使用者正在建置哪個 commit,以及哪些在新分支上的內容不會出現在影片中。 - 尋找專案正常的裝置建置方式(執行腳本、
tool/*.sh、Makefile、Fastlane)。移除所有模擬購買的旗標,例如DUMMY_PURCHASES、MOCK、FAKE、USE_TEST_STORE、RevenueCattest_金鑰或 StoreKit 設定檔。模擬購買永遠不會顯示 Apple 的購買表單,審查人員看到付費功能在未經購買表單的情況下解鎖,可能會將其視為規避應用程式內購買的方式(3.1.1)。僅透過前綴檢查購買金鑰是否為正式商店金鑰(例如grep -q '"REVENUECAT_IOS_KEY": "appl_');切勿印出金鑰值。 - 以發佈模式建置,絕不能用除錯模式:除錯模式的 Flutter 和 React Native 建置無法從主畫面圖示開啟,而 Apple 要求錄影從那裡開始。Flutter:
flutter build ios --release,使用專案常用的定義,但移除模擬用的定義。 - 檢查建置的 App 是否與提交相符:
/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" -c "Print CFBundleVersion" build/ios/iphoneos/Runner.app/Info.plist必須列印出提交的版本與建置號碼。如果不相符,請停止並告知使用者。 - 要求使用者先從手機刪除 App(這會清除手機上的資料,因此由使用者決定是否執行),然後安裝:
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 秒一張畫面:
ffmpeg -i <file> -vf "fps=1/10,scale=240:-1,tile=8x8" -frames:v 1 <dir>/contact.png。同時單獨儲存第一張畫面。讀取兩者。 - 依序檢查:第一張畫面顯示主畫面或正在點擊的 App 圖示;拍攝清單中的每個步驟都已依序執行;使用者已正確示範註冊、登入、帳號刪除、發文、檢舉、封鎖、付費牆、還原購買;最後顯示停止錄影。檢查錄影中沒有模擬器視窗、開發者工具、快轉或剪輯的跡象。
- 錄影中的操作順序應與拍攝清單相符。如果不符,請要求使用者重新錄製,並解釋原因。
- 驗證錄影檔案大小合理:對於 10–15 分鐘的 1080p 影片,通常為 100–200 MB。如果太小,可能暗示問題。
完成
在檔案準備就緒後,告知使用者:「您的 App Review 資訊包已準備就緒。請前往 App Store Connect → App Review Information,將第 2 部分貼到 Notes 欄位,然後點擊『回覆並附加影片』,上傳螢幕錄影。未來提交時,此資訊會自動隨附。」