iPhone Duo screenshots (render, check, upload skip with console link while the API has no display type) and the medium display class as the required iPhone set, labels as in the console

This commit is contained in:
CRTkafa 2026-10-18 13:07:15 +07:00
parent 0b32df57f0
commit 3381673ae6
17 changed files with 163 additions and 16 deletions

View file

@ -899,3 +899,15 @@ that fails without the fix (see CONTRIBUTING.md).
`cli/lib/scan/rules.ts`, the SDK table `REMOTE_SDKS` in `cli/lib/scan/sdks.ts`). A code obfuscator (DexGuard,
iXGuard, a JavaScript obfuscator) is a low `obfuscation` note; ProGuard / R8 minify alone is never reported.
`tests/remote-features.test.ts`.
## 75. iPhone Duo screenshots: in the console, not in the API
- **Symptom:** App Store Connect shows an "iPhone Duo" tab next to "iPhone with Dynamic Island (medium display)" and
"iPad 13" display", but an upload for it through the API has no display type to use (a guessed one answers 400).
- **Cause:** the API's `ScreenshotDisplayType` (4.5.1) has no Duo value yet; only the asset library enum lists
`IPHONE_DUO`. Duo is optional now, reportedly required from April 2027 for iOS 27.1 SDK builds.
- **Do:** render and check the sets (`apple.iphoneDuo: true`), add them in the console's iPhone Duo tab (the skip
message has the deep link), never guess an enum name. For Play point foldables to the tablet sets; there is no Duo slot.
- **Guard:** `IPHONE_DUO_DISPLAY` in `cli/shots/spec.ts` (null = not in the API; regenerate with
`bun tools/gen-api.ts` and fill in the exact names), `skippedDuoSets` in `cli/apple/screenshots.ts`, the
`screenshots-duo` note in check / validate. `tests/ppo.test.ts`.

View file

@ -33,6 +33,8 @@ or uploaded as another size. `store/renders` can be large (hundreds of MB) and n
|---|---|---|
| ios69 | 1320 x 2868 | App Store 6.9" (`APP_IPHONE_67`, "Dynamic Island (large display)"); the set storebound requires |
| ios65 | 1284 x 2778 | App Store 6.5" (`APP_IPHONE_65`) |
| iphone-duo-outer | 1398 x 2034 (or 2034 x 1398) | App Store "iPhone Duo" outer display; optional, only with `apple.iphoneDuo: true` (tablet frames) |
| iphone-duo-inner | 2007 x 2853 (or 2853 x 2007) | App Store "iPhone Duo" inner display; same switch |
| ipad13 | 2064 x 2752 | App Store 13" iPad (`APP_IPAD_PRO_3GEN_129`), required when the app runs on iPad; only with `apple.ipad: true` |
| play | 1080 x 1920 | Play phone (2-8, ratio at most 2:1) |
| tab7 | 1080 x 1920 | Play 7" tablet (tablet frames, Android tablet body); optional, see `play.tablets` |
@ -61,6 +63,18 @@ to the 13" iPad screen (1032 x 1352 CSS px @2x below a 24 px bar), so an `iPad P
simulator screenshot fits after the bar is cropped. Play tablet sizes (tab7 / tab10) reuse the same tablet frames, drawn
in a plain Android tablet body instead of the iPad one.
**iPhone Duo (foldable).** App Store Connect's "App Previews and Screenshots" tab now lists three classes:
"iPhone with Dynamic Island (medium display)" (required for iPhone; a 6.9" or 6.5" set scales down into it, so
`validate` passes with the `ios69` set), "iPhone Duo" and "iPad 13" display" (required with `apple.ipad`). Duo takes an
outer (1398 x 2034) and an inner (2007 x 2853) set, portrait or landscape, PNG / JPEG without alpha, 1-10 each. It is
optional now and reportedly required from April 2027 for builds with the iOS 27.1 SDK or later; `check` / `validate`
print an info note until then (a warning after, never a blocker). `apple.iphoneDuo: true` adds both sizes to
`shots render` / `shots check` / the gallery. The API (4.5.1) has no Duo `ScreenshotDisplayType` yet, so
`apple screenshots` skips the Duo folders with a message and the deep link to the version page; add them in the
console's iPhone Duo tab until then (one constant, `IPHONE_DUO_DISPLAY` in `cli/shots/spec.ts`, takes the names once
the enum has them). No Duo app preview sizes are published. Google Play has no foldable slot: foldables show the
7" / 10" tablet sets below.
**Play tablets are optional.** Play requires the 512 x 512 icon, the 1024 x 500 feature graphic and at least 2
screenshots (answer 9866151 above); 7" / 10" tablet screenshots are optional, but without them the app is not eligible
for tablet featuring. `play.tablets` decides: unset = true when tablet renders (tab7/ or tab10/) already exist, else