review access: guest-play apps rejected by Play as a login wall (empty name field, disabled Continue, a code link on the first screen): check warns for a Play app with a first-run gate or IAP and no reviewAccess.instructions; with guest steps the play-sign-in-details plan declares one entry without credentials, the dialog's required full-access box as the owner's step; store-pitfalls 73
This commit is contained in:
parent
d6070cc185
commit
824758179b
11 changed files with 202 additions and 15 deletions
|
|
@ -7,7 +7,9 @@ import { allSubscriptions } from './subscriptions';
|
|||
|
||||
export interface ProfileIssue { level: 'error' | 'warn'; msg: string }
|
||||
|
||||
export function profileIssues(config: ShipConfig, o: { demoAccount: boolean }): ProfileIssue[] {
|
||||
/** firstRunGate: where the code shows a first-run gate (name entry, code / transfer entry, account transfer UI), from
|
||||
* scan's SIGNALS.firstRunGate; check fills it for a Play app without reviewer instructions. */
|
||||
export function profileIssues(config: ShipConfig, o: { demoAccount: boolean; firstRunGate?: string[] }): ProfileIssue[] {
|
||||
const out: ProfileIssue[] = [];
|
||||
const err = (msg: string) => out.push({ level: 'error', msg });
|
||||
const warn = (msg: string) => out.push({ level: 'warn', msg });
|
||||
|
|
@ -29,6 +31,15 @@ export function profileIssues(config: ShipConfig, o: { demoAccount: boolean }):
|
|||
if (!o.demoAccount) err('App Review needs a demo account (sign-in required) · add reviewDemoAccount to .storebound/credentials.json · review-access skill');
|
||||
if (!config.reviewAccess.instructions) warn('reviewAccess.instructions: tell the reviewer how to sign in and where the main features are');
|
||||
} else if (accounts && config.reviewAccess === undefined) warn('the app has accounts: set reviewAccess { signInRequired } so App Review and Play App access get a demo account when needed');
|
||||
// a guest-play app (no sign-in) rejected by Play as a login wall: an empty name field with Continue disabled and an
|
||||
// "I have a code" link on the first screen read as a sign-in. Guest steps in reviewAccess.instructions turn Play's
|
||||
// Sign in details into a "restricted" entry without credentials that tells the reviewer how to get in.
|
||||
const gate = o.firstRunGate ?? [];
|
||||
const iap = !!config.products?.length || allSubscriptions(config.subscriptions).length > 0;
|
||||
if (config.play && !config.reviewAccess?.signInRequired && !config.reviewAccess?.instructions?.trim() && (gate.length || iap))
|
||||
warn(`Play may reject as a login wall; add guest steps: ${[gate.length && `first-run gate in the code (${gate.slice(0, 2).join(', ')})`, iap && 'in-app purchases'].filter(Boolean).join(' and ')} with no reviewAccess.instructions. Set reviewAccess.instructions to English steps for a reviewer without an account (e.g. "No account needed: tap Continue, the name is pre-filled; the code link is only for moving progress"); the play-sign-in-details plan then declares a guest entry (store-pitfalls: guest-play apps rejected as a login wall)`);
|
||||
const steps = config.reviewAccess?.instructions?.trim() ?? '';
|
||||
if (config.play && steps.length > 500) warn(`reviewAccess.instructions: ${steps.length} characters; Play's Sign in details "Any other information" takes at most 500`);
|
||||
const subs = allSubscriptions(config.subscriptions);
|
||||
if (subs.length) {
|
||||
if (!config.app.termsUrl) err('subscriptions: set app.termsUrl (Terms of Use / EULA, linked in the app and the metadata; Apple 3.1.2)');
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue