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>
101 lines
4.5 KiB
Markdown
101 lines
4.5 KiB
Markdown
---
|
||
date: 2026-05-14
|
||
day: 1
|
||
view: macher
|
||
weekday: Donnerstag
|
||
commits: 11
|
||
review: 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 abgeschlossen** — `DeepLinkRouter` + Web-Header-Hide via
|
||
injizierter CSS. Header + Footer der Website werden in der App
|
||
ausgeblendet, weil App-Chrome reicht.
|
||
- **ζ-2 native** — `SwiftData`-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.
|