diff --git a/CHANGELOG.md b/CHANGELOG.md index 24629af..a7816ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- **App Privacy console plan follows today's page** (verified 2026-10-22): on an app published before, Edit opens the + Data Collection question first and the type list ends in Continue; each type's last step is Publish (it goes live, + no draft). Publish stays the owner's unless bypass mode is on. + - **A new Play language in one run.** `play listing` uploads the hi-res icon (and the feature graphic when rendered) for a language Play does not have yet, in the same edit (Play refused the commit with 403 otherwise). Pitfall 102. - Script traces skip test files (`*.test.*`, `*.spec.*`). diff --git a/cli/lib/console-plan.ts b/cli/lib/console-plan.ts index f333e0d..7eeac67 100644 --- a/cli/lib/console-plan.ts +++ b/cli/lib/console-plan.ts @@ -273,7 +273,7 @@ function appPrivacyPlan(answers: PlanAnswer[], appId: string | null | undefined) const add = (s: Omit) => steps.push({ n: steps.length + 1, ...s }); add({ text: appId ? 'Open the App Privacy page of the app (deep link).' : `Open App Store Connect > Apps > the app > App Privacy (sidebar): ${consoleUrl('asc.apps')}` }); add({ text: 'First time: click "Get Started" and answer the Data Collection question; then Next.', click: ['Get Started'], answers: ['collects'] }); - add({ text: 'Data types: when the Data Types section does not list exactly the collected types below, click the "Edit" next to the "Data Types" heading (never the Privacy Policy Edit), tick exactly these types and untick the rest, then Save (a draft: nothing is public before Publish). Console labels: Purchase History shows as "Purchases", Other Data Types as "Other Data".', click: ['Edit', 'Save'], answers: ids(answers, a => a.id.startsWith('type:')) }); + add({ text: 'Data types: when the Data Types section does not list exactly the collected types below, click the "Edit" next to the "Data Types" heading (never the Privacy Policy Edit), tick exactly these types and untick the rest, then Save. On an app whose answers were published before (verified 2026-10-22), Edit first opens the "Data Collection" question (Yes / No, then Next); the type list is step 2 and ends in "Continue", not "Save". Console labels: Purchase History shows as "Purchases", Other Data Types as "Other Data".', click: ['Edit', 'Next', 'Save', 'Continue'], answers: ids(answers, a => a.id.startsWith('type:')) }); add({ text: `${APPLE_ADDITIONAL_SETUP}`, click: ['OK'] }); for (const t of collected) { const set = setUpTexts(t).filter(x => !/ ayarla$/.test(x)); @@ -281,9 +281,9 @@ function appPrivacyPlan(answers: PlanAnswer[], appId: string | null | undefined) add({ type: t, text: `"${t}" step 1, purposes: tick and untick the 6 checkboxes as answered, then Next.`, click: ['Next'], answers: ids(answers, a => a.id.startsWith(`purpose:${t}:`)) }); add({ type: t, text: `"${t}" step 2, linked to the user: pick the radio, then Next.`, click: ['Next'], answers: [`linked:${t}`] }); add({ type: t, text: `"${t}" steps 3 and 4: two information pages ("Let’s define two important terms…", then "To help put tracking into context, here are a few examples:"), no inputs: press Next on each.`, click: ['Next', 'Next'] }); - add({ type: t, text: `"${t}" step 5, tracking: pick the radio, then Save (a draft). Never "Definitions and Examples". The dialog closes; the row shows Edit and the summary.`, click: ['Save'], answers: [`tracking:${t}`] }); + add({ type: t, text: `"${t}" step 5, tracking: pick the radio, then the last button: "Save" (first setup: a draft) or "Publish" (answers published before: this type goes live at once, verified 2026-10-22). Publish is the owner's button unless bypass mode is on (storebound settings bypass status). Never "Definitions and Examples". The dialog closes; the row shows Edit and the summary.`, click: ['Save'], answers: [`tracking:${t}`] }); } - add({ text: 'Stop. Do NOT press Publish: tell the owner to review the summary on the App Privacy page and press Publish, then Publish again in the "Publish Your App Privacy Responses?" dialog (it puts the answers on the App Store product page). Afterwards the page shows "Published … ago by …".' }); + add({ text: 'First setup only: the page then has a Publish button (top right) and the dialog "Publish Your App Privacy Responses?". That Publish is the owner’s unless bypass mode is on; then press it yourself. Afterwards the page shows "Published … ago by …". (Answers published before: each type was already published by its own last step.)' }); add({ text: 'Verify: read the Data Types section as text (document.querySelector("main").innerText) and pipe it to `storebound console verify apple-app-privacy --from-text -`.' }); return { start: appId ? { url: `${ASC}/apps/${appId}/distribution/privacy`, deepLink: true, reach: [] } @@ -297,7 +297,7 @@ function appPrivacyPlan(answers: PlanAnswer[], appId: string | null | undefined) 'Step 2, linked: 2 radios, "Yes, data collected from this app is linked to the user’s identity" / "No, …" (curly ’). Buttons: Back, Cancel, Next.', 'Step 3: an information page "Let’s define two important terms…" (Tracking / Third-Party Data). No inputs: press Next.', 'Step 4: an information page "To help put tracking into context, here are a few examples:". No inputs: press Next. (Two information steps in a row: keep pressing Next while the dialog shows no inputs.)', - 'Step 5, tracking: 2 radios, "Yes, we use data for tracking purposes" / "No, we do not …". Buttons: "Definitions and Examples" (help: never press), Back, Cancel, Save.', + 'Step 5, tracking: 2 radios, "Yes, we use data for tracking purposes" / "No, we do not …". Buttons: "Definitions and Examples" (help: never press), Back, Cancel, and Save (first setup) or Publish (answers published before: no draft, the type goes live; verified 2026-10-22).', 'Save closes the dialog. The type then shows "Edit" and a summary: "Used for ", "Linked to the user’s identity" (or not), "Used for tracking purposes" (or not). That summary is what `console verify` reads.', 'Labels use typographic quotes (’): match straight and curly quotes alike.', 'The "?" buttons ("More information") are help only. Publish (top right) is the owner\'s: it opens a "Publish Your App Privacy Responses?" with Cancel / Publish (the owner\'s final button); after it the page shows "Published a few seconds ago by …" (verified 2026-10-12), which `console verify` reads as the published signal.',