App Store Submission Readiness (SP2) — Design¶
Datum: 2026-06-21 Status: Spec — zur Review Plattform-Ziel: iOS + iPad + tvOS → App Store (ein universal App-Record). macOS bleibt der notarisierte Developer-ID-DMG (kein Mac App Store, kein Sandbox-Umbau).
1. Kontext & Ziel¶
SP1 (Quality-Hardening) ist abgeschlossen, gepusht, headless verifiziert (293/0 Host, 3-Plattform-Build, tvOS-Test-Build grün). SP2 bringt die App bis zum „Submit"-Klick in App Store Connect (ASC): alle headless erstellbaren Artefakte (Entitlements/Manifest/Export-Config/Screenshots/Metadaten-Entwurf/Checkliste). Die account-gebundenen Schritte (ASC-Records anlegen, Archive hochladen, „Submit for Review") bleiben Johannes' — headless nicht ausführbar.
Schon vorhanden (aus apple/PhysarumApp/project.yml verifiziert): Bundle-ID de.jkaindl.physarum identisch über iOS+tvOS (→ ein universal App-Record), Team U9X7M39R56, Automatic-Signing (iOS/tvOS device Apple Development), Kategorie public.app-category.entertainment, UILaunchScreen, Usage-Strings (NSMicrophoneUsageDescription, NSPhotoLibraryAddUsageDescription, NSLocalNetworkUsageDescription, NSBonjourServices), iCloud-KVS-Entitlements (iOS/tvOS), MARKETING_VERSION 2.2.0. Guideline 4.2 (Minimum Functionality): niedriges Risiko (voller Editor + Audio + Capture + tvOS-Ambient). Die native Metal-App rendert im Simulator → echte Screenshots sind skriptbar.
Fehlt / zu ergänzen: kein PrivacyInfo.xcprivacy; kein ITSAppUsesNonExemptEncryption; kein app-store-Export (die vorhandene ExportOptions.plist ist developer-id für den macOS-DMG).
2. Scope-Entscheidungen (ratifiziert 2026-06-21)¶
| Frage | Entscheidung |
|---|---|
| Preis | Kostenlos (keine IAP, kein Paid-Apps-Agreement nötig) |
| Record-Struktur | Ein universal App-Record (iOS+tvOS, Bundle de.jkaindl.physarum); macOS später nachrüstbar |
| Screenshots | Ich generiere die Baseline aus dem Simulator (ersetzbar) |
| macOS App Store | Nicht in Scope (bleibt Developer-ID-DMG) |
3. Arbeitsteilung¶
Meine Deliverables (headless): Privacy-Manifest · Encryption-Flag · app-store-Export-Config + Build-Skript · Baseline-Screenshots · Metadaten-Entwurf · Privacy-Nutrition-Label-Daten · ASC-Checkliste.
Johannes' Schritte (Apple-Account, headless nicht ausführbar): ASC-App-Record anlegen (Bundle registrieren), Paid/Free-Agreements bestätigen (bei Free trivial), Archive hochladen (oder das Build-Skript mit -allowProvisioningUpdates laufen lassen, sofern sein Account App-Store-Distribution + Apple-Distribution-Cert hat), Screenshots final wählen, Metadaten finalisieren, Age-Rating-Fragebogen, „Submit for Review".
4. Architektur / Komponenten¶
① PrivacyInfo.xcprivacy (iOS + tvOS)¶
Eine Bundle-Ressource (apple/PhysarumApp/PrivacyInfo.xcprivacy, in project.yml als sources mit eingebunden). Inhalt:
- NSPrivacyTracking = false, NSPrivacyTrackingDomains = [] (kein Tracking, keine externen Domains).
- NSPrivacyCollectedDataTypes = [] — wir sammeln/senden keine Daten: Mikrofon-Audio wird on-device zu Frequenzbändern verarbeitet und nie gespeichert/gesendet; Fotos sind add-only-Schreibungen (keine Sammlung); Local-Network dient nur der ATV-Steuerung im eigenen Netz.
- NSPrivacyAccessedAPITypes — Required-Reason-APIs deklarieren (Audit im Plan, exakte Codes je nachgewiesener Nutzung): mindestens NSPrivacyAccessedAPICategoryUserDefaults (Reason CA92.1 — App-eigene Daten via @AppStorage/UserDefaults) und NSPrivacyAccessedAPICategoryFileTimestamp (Reason C617.1 — Mod-Date-Lesung in CaptureCleanup zum Prunen von Temp-Dateien im App-Container). Disk-Space / System-Boot-Time / aktive Tastatur: nur deklarieren, falls der Code-Audit sie nachweist.
② ITSAppUsesNonExemptEncryption = false¶
In project.yml unter info.properties ergänzen. Begründung: nur CryptoKit SHA-256 fürs Content-Hashing (kein nutzerdaten-/transport-verschlüsselndes Crypto) → standard-/exempt. Spart die Export-Compliance-Frage je Einreichung.
③ app-store-Export-Config + Build-Skript¶
- Neues
scripts/ExportOptions-appstore.plist:method = app-store-connect(Xcode 15+; Fallbackapp-store),teamID = U9X7M39R56,signingStyle = automatic,destination = export,uploadSymbols = true. Die bestehendedeveloper-id-ExportOptions.plist(macOS-DMG) bleibt unangetastet. - Neues
scripts/build-appstore.sh(analog zubuild-macos-app.sh):xcodebuild archivefür iOS + tvOS (-allowProvisioningUpdates) →-exportArchive -exportOptionsPlist ExportOptions-appstore.plist. Produziert.ipa/.pkgzum Upload. Hinweis: ein echter Archive+Export braucht Johannes' Apple-Distribution-Cert + App-Store-Provisioning (Account-Setup) — das Skript+Config sind das Deliverable; der reale Upload ist Johannes' Schritt (oder läuft mit-allowProvisioningUpdates, wenn sein Account App-Store-fähig ist).
④ Baseline-Screenshots¶
Skript scripts/shoot-appstore-screens.sh: bootet die ASC-Pflicht-Simulatoren (iPhone 16 Pro Max = 6.9″, iPad Pro 13″, Apple TV 4K), installiert+launcht die App, fängt mit xcrun simctl io booted screenshot Hero-Shots des gerenderten Players je Gerätegröße. Mehrere/variierte Shots: der Plan klärt den saubersten Mechanismus, um pro Shot ein anderes kuratiertes Preset zu zeigen (bevorzugt ein #if DEBUG-Launch-Argument -uiTestPreset <slug> zum gezielten Boot; sonst Default-Preset-Hero je Größe). Ausgabe nach docs/appstore/screenshots/<device>/. Baseline = einreichbar; Johannes ersetzt/ergänzt nach Geschmack.
⑤ Metadaten-Entwurf¶
docs/appstore/metadata.md (Johannes feilt): App-Name (Default „Physarum" — ASC-Eindeutigkeit prüft Johannes), Subtitle (≤30 Z.), Promotional Text (≤170 Z.), Description, Keywords (≤100 Z., kommagetrennt), Support-URL, Marketing-URL (Codeberg-Pages/uplink), Kategorie Entertainment, Age-Rating-Vorschlag 4+.
⑥ Privacy-Nutrition-Label-Daten¶
docs/appstore/privacy-labels.md: die exakten Antworten für den ASC-„App Privacy"-Fragebogen, konsistent mit ①. Erwartung: „Data Not Collected" (Mic on-device, Fotos add-only-Write, Local-Network im Eigennetz) — präzise begründet, damit Johannes den Fragebogen schnell + korrekt ausfüllt.
⑦ ASC-Checkliste¶
docs/appstore/ASC-submission-checklist.md: abhakbare, geordnete Schritte für Johannes' account-gebundenen Teil (Record anlegen → Build hochladen → Metadaten/Screenshots → Privacy/Age-Rating → Submit), inkl. der Gotchas (universal-Record für iOS+tvOS, App-Name-Eindeutigkeit, Distribution-Cert).
5. Was NICHT in Scope (YAGNI)¶
- macOS App Store / Sandbox-Umbau (bleibt Developer-ID-DMG).
- Paid/IAP-Infrastruktur (Free gewählt).
- Account-gebundene ASC-Aktionen (Johannes' Schritte).
- App-Preview-Videos (optional, später).
- Neue App-Features oder weiteres a11y (SP1 abgeschlossen).
- Kein Anfassen der Web-PWA / des macOS-DMG-Build-Pfads.
6. Verifikation / DoD¶
- [ ]
PrivacyInfo.xcprivacyexistiert, ist valides Plist, in iOS+tvOS-Bundle eingebunden; Required-Reason-Codes durch Code-Audit belegt; iOS+tvOS bauen weiter grün. - [ ]
ITSAppUsesNonExemptEncryption = falsein der gebauten Info.plist (verifizierbar am Build-Produkt). - [ ]
ExportOptions-appstore.plistvalides Plist;build-appstore.shsyntaktisch lauffähig (dry-run/-help); diedeveloper-id-Kette unverändert. - [ ] Baseline-Screenshots erzeugt (≥1 je Pflicht-Gerätegröße), Pixelmaße ASC-konform.
- [ ]
metadata.md+privacy-labels.md+ASC-submission-checklist.mdgeschrieben. - [ ] Voller Regressions-Check: macOS+iOS+tvOS-Build + Host-Suite weiter grün (keine SP2-Änderung darf SP1 brechen).
7. Offene Annahmen / Risiken¶
- Annahme: der reale Archive→Upload→Submit hängt an Johannes' Apple-Account (Distribution-Cert, App-Store-Agreements, ASC-Record). Ich liefere Config+Skript+Checkliste; das Drücken ist seins.
- Risiko (gering): Required-Reason-API-Codes — falsche/fehlende Deklaration führt zu ASC-Upload-Warnungen/Reject. Mitigation: echter Code-Audit im Plan (UserDefaults/FileTimestamp/DiskSpace/BootTime/Keyboard), konservativ deklarieren.
- Risiko (gering): Simulator-Screenshots des Metal-Renderers — falls ein Sim keinen Metal-Frame liefert, Fallback auf ein Gerät/Default-Preset; im Plan ein Sichtbarkeits-Check der erzeugten PNGs.
- Offen für den Plan: sauberster Mechanismus für variierte Screenshots (Launch-Arg vs. Default-Hero); exakte ASC-Pflicht-Screenshot-Größen zum Zeitpunkt der Einreichung.
8. Folge¶
Nach SP2 ist die iOS/tvOS-Einreichung bis auf Johannes' ASC-Schritte vorbereitet. macOS bleibt der DMG. Ein späterer Mac-App-Store-Zweig (Sandbox-Umbau) wäre ein eigener Spec.