scan, privacy answers and credentials from a second game's first release (lessons 35-37): review-prompt needs rating context, not a bare "rate"; account signals skip import lines and module paths, config-only accounts say "from config"; accounts.inApp without deletion code stays a medium 5.1.1(v) finding; privacy-manifest --propose builds NSPrivacyCollectedDataTypes from appPrivacy.types and check warns on an empty list; appPrivacy.types is authoritative in the App Privacy sheet (unlisted = not collected), ad / support / AR types default to not collected without tracking or ad SDKs; Play advertising ID from SDKs, the AD_ID permission, app-ads.txt or the flag, never from a Device ID alone; scan.ignore[].evidence and warnings for entries that match nothing; empty credentials template, placeholder values count as missing (check, doctor)
This commit is contained in:
parent
86cd79dd45
commit
1366e7e231
34 changed files with 881 additions and 71 deletions
|
|
@ -37,6 +37,13 @@ export async function run(ctx: Ctx): Promise<void> {
|
|||
// without --lookup only the cache is read: the lookup refuses, so no request is made
|
||||
ids.appleAppId = await appleAppId(root, cfg, { say: () => { /* the plan's start says what it found */ }, ...(args.has('lookup') ? {} : { lookup: async () => { throw new Error('offline (add --lookup to ask the API)'); } }) });
|
||||
}
|
||||
// project signals (ad / attribution SDKs, the AD_ID permission, support and AR code) for the App Privacy and
|
||||
// Advertising ID answers; a scan that fails leaves them unknown (asked)
|
||||
try {
|
||||
const { detectProject } = await import('../lib/scan/project');
|
||||
const { projectSignals } = await import('../lib/project-signals');
|
||||
ids.signals = projectSignals(detectProject(root));
|
||||
} catch { /* not scanned */ }
|
||||
const plan = consolePlan(form, cfg, ids);
|
||||
if (json) return printJson(plan);
|
||||
console.log(planText(plan));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue