Zum Inhalt

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+; Fallback app-store), teamID = U9X7M39R56, signingStyle = automatic, destination = export, uploadSymbols = true. Die bestehende developer-id-ExportOptions.plist (macOS-DMG) bleibt unangetastet.
  • Neues scripts/build-appstore.sh (analog zu build-macos-app.sh): xcodebuild archive für iOS + tvOS (-allowProvisioningUpdates) → -exportArchive -exportOptionsPlist ExportOptions-appstore.plist. Produziert .ipa/.pkg zum 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.xcprivacy existiert, ist valides Plist, in iOS+tvOS-Bundle eingebunden; Required-Reason-Codes durch Code-Audit belegt; iOS+tvOS bauen weiter grün.
  • [ ] ITSAppUsesNonExemptEncryption = false in der gebauten Info.plist (verifizierbar am Build-Produkt).
  • [ ] ExportOptions-appstore.plist valides Plist; build-appstore.sh syntaktisch lauffähig (dry-run/-help); die developer-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.md geschrieben.
  • [ ] 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.