zitare-native/devlog/2026-05-14/macher.md
Till JS 37840e6172 devlog: 2 Tage geschrieben (ζ-0 + ζ-1 + Launch-Flash-Fix)
Tag 1: Hybrid SwiftUI + WKWebView, ζ-0 + ζ-1 + Teile ζ-2.
Tag 2: dreilagiger weißer Flash beim App-Start gefixt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 22:22:49 +02:00

4.5 KiB
Raw Blame History

date day view weekday commits review
2026-05-14 1 macher Donnerstag 11 written

Donnerstag, 2026-05-14 — Tag 1 (Macher-Sicht)

Sonderfall im Native-Stack: Hybrid SwiftUI + WKWebView. Zitare hat keinen Hardware-USP gegenüber dem Browser — Native bringt nur Widget, ShareExtension, Spotlight, Submit. Lesen bleibt im Web. Phasen ζ-0 + ζ-1 + Teile von ζ-2 in einer Schicht.

Stats

11 Commits, +3 130 / 226 LoC, 36 Files. 40× .swift, 7× .yml, 8× .md. Top-Dirs Sources/Features/WebShell (15 %), Assets (9 %). Tags: icon, dark-mode. Session 10:15 → 21:45, 37 aktive Minuten in 3 Blöcken (Vormittag + Abend).

Phasen

  • ζ-0 — Setup. Repo-Skelett, project.yml (XcodeGen), ManaCore
    • ManaTokens als Package-Dependency, leerer Build im Simulator grün, /healthz-Probe gegen zitare-api.mana.how.
  • ζ-1 — WebShellView. WKWebView als UIViewRepresentable/ NSViewRepresentable-Bridge, Universal-Link-Routing, Cookie-SSO- Bridge (mana.access auf .mana.how).
  • ζ-1 abgeschlossenDeepLinkRouter + Web-Header-Hide via injizierter CSS. Header + Footer der Website werden in der App ausgeblendet, weil App-Chrome reicht.
  • ζ-2 nativeSwiftData-Snapshot-Cache + DailyQuoteWidget vorbereitet. Snapshot kommt von https://zitare.com/index-min.json, App-Group group.ev.mana.zitare reicht es an Widget durch.
  • ζ-1 Polish — robuster Header-Selektor (DOM-Drift-Tolerant), zitare.mana.how als zweite UL-Domain.
  • Cloudflare-TODO + PLAN.md externe Blocker. zitare.mana.how-DNS-Record + CNAME-Cleanup nötig, sonst AASA-Validation flapsig.
  • TestFlight-Validation grün — Icon-Asset + CFBundleIconName korrekt gesetzt. Erste Upload-Versuche scheiterten an iconAsset.
  • Icon-Platzhalter — vereinfachte Anführungszeichen-Glyphe, Pixel-Render. Echtes Icon kommt vor Submit.
  • Mac-Window + Konto-Header nach erstem TestFlight-Build.
  • CFBundleVersion 2 für nächsten Upload-Roundtrip.
  • Dark-Mode-Fix — WebView folgt System-prefers-color-scheme statt zitare.com-localStorage-Toggle. Vorher hat man im App-Modus unbeabsichtigt den Web-Schalter umgestellt.

Architektur-Entscheidungen

  • Hybrid ausnahmsweise. Lese-Surfaces via WKWebView, Native- Surfaces (Widget, ShareExt, Submit, Spotlight) pure SwiftUI. Trennung ist fest — keine schleichende Native-Re-Implementation von Read-Routes (CLAUDE.md Invariante 1, „Don't do").
  • AASA-Domain zitare.com, nicht zitare.mana.how. Public-URL trägt die App, mana.how ist API/Backstage.
  • Cookie-SSO-Bridge statt JWT-Header in WebView. Domain .mana.how setzt Cookie, WebView lädt zitare.mana.how mit Cookie automatisch.
  • Snapshot lokal für Widget + Spotlight, nicht für WebView. WebView lädt live, Widget/Spotlight können nicht live laden (Background-Refresh-Budget).
  • Header-Hide via injizierter CSS, statt eigene App-Routes. Selektor robust gegen DOM-Drift; bricht im worst case lautlos, zeigt aber dann Header — kein Crash.
  • Theme: paper-Variant aus @mana/themes/paper, lokal in ZitareTheme.swift nachgebaut. Match zur Website.

Trade-offs

  • WebView-Hybrid spart Native-Read-Surface-Aufwand komplett, aber: WebView-DOM ist nicht App-DOM. Selektor-Drift, Cookie- Sync-Edge-Cases, Performance-Regressions im JS sind Web-Sorgen, nicht App-Sorgen — und wir merken sie hier später.
  • zitare.com als AASA-Domain + zitare.mana.how als zweite: doppelte Universal-Link-Logik. Wenn Web-Routing sich ändert, muss App + AASA + Web nachziehen.
  • Snapshot-Pull bei Launch macht App schneller-startend gegen Widget-Daten, kostet aber bei jedem Cold-Start 11+ Quotes Bandbreite. Bei 50 k Quotes-Korpus später Schmerz; heute irrelevant.
  • TestFlight-Roundtrip kostet Iterationen — CFBundleIconName fehlte, Icon-Asset hatte falsche Größe, dadurch zwei Failed- Validations. Standard für native App-Erstbuilds.

Offene Punkte

  • DNS-CNAME für zitare.mana.how in Cloudflare setzen, alter CNAME entfernen.
  • Echtes AppIcon statt vereinfachter Anführungszeichen-Glyphe.
  • ζ-3 Submit-View in SwiftUI mit ManaAuthGate (Action-Level- Login-Eskalation). Pending.
  • ζ-4 Spotlight + ShareExtension + App Intents. Pending.
  • ζ-5 Polish — iPad-Split-Layout, Accessibility.
  • ζ-6 App-Store-Submission — Bundle ev.mana.zitare, Team registriert.
  • DailyQuoteWidget auf echtem Gerät testen — Simulator zeigt's, echtes iPhone-Widget-Behavior ist gelegentlich anders.