Zuletzt aktualisiert:

ios-shell — Capacitor-Hülle für Silverscale

Native iOS-App, die https://silverscale.dennisfisch.de live in einer WKWebView lädt (Remote-Modus). Zweck: dauerhafte Kamera-Permission für den Barcode-Scan (Spec: docs/superpowers/specs/2026-06-07-capacitor-sidestore-mvp-design.md). App-Updates kommen weiter per npm run build auf dem VPS — die IPA muss praktisch nie neu gebaut werden.

Phase 0 „Jaqueline-Gate" (07.06.2026, Frontend-Audit)

Dieser Stand bündelt alles IPA-Pflichtige in EINEN Rebuild:

IPA v2 (Gerätetest-Feedback 07.06.)

Zweiter Rebuild, behebt die Geste-Probleme aus dem ersten Gerätetest:

Build wie gehabt: npm i && npx cap sync ios → xcodebuild → IPA → SideStore drüberinstallieren (Session bleibt erhalten).

IPA v3 (Welle 5): Nativer VisionKit-Scanner

App/NativeScanner.swift (DataScannerViewController, EAN-8/13/UPC-E, Abbrechen-Button, Erfolgs-Haptik) — registriert per Code in App/MyViewController.swift (CAPBridgeViewController-Subclass, Main.storyboard zeigt darauf) über registerPluginInstanceregisterPluginType ist bei aktivem autoRegisterPlugins (Default) ein stilles No-Op! ⚠️ NICHT über packageClassList in capacitor.config.json versuchen: cap sync ÜBERSCHREIBT die Liste bei jedem Lauf mit den npm-Plugins — lokale Plugin-Klassen fliegen raus (so geschehen beim ersten v3-Build, „Scanner: web"). Das Frontend erkennt das Plugin über die Bridge: mit v3-IPA übernimmt der native Scanner ALLE Scan-Stellen (Essen loggen, Artikel, Bons), ältere IPAs fallen automatisch auf den Web-Scanner zurück. Build: ./build-ipa.sh (Swift-Fehler landen im Log — bei Problemen Log an Claude).

Voraussetzungen (Mac)

Xcode + Command-Line-Tools, Node (brew), CocoaPods: brew install cocoapods (falls noch nicht da).

Erstmaliges Bauen

cd app/ios-shell
npm i
npx cap add ios          # erzeugt ios/ – DANACH committen (git add ios/)

In ios/App/App/Info.plist vor dem schließenden </dict> einfügen, dann erneut committen:

    <key>NSCameraUsageDescription</key>
    <string>Barcode-Scan für Artikel</string>

Unsignierte IPA bauen (SideStore signiert selbst um)

cd app/ios-shell
./build-ipa.sh

Das Skript macht npm i → cap sync → xcodebuild → IPA packen, zeigt pro Schritt nur 1–2 Zeilen und schreibt das volle Protokoll (inkl. Versions- Diagnose) nach logs/build-<zeitstempel>.log — bei Fehlern die letzten Zeilen direkt im Terminal, das Log-File an Claude geben.

Installation (je iPhone, einmalig — Stand 06/2026, iloader-Weg)

  1. LocalDevVPN (App Store) auf dem iPhone installieren.
  2. iloader auf dem Mac installieren: https://github.com/nab138/iloader/releases/latest (darwin-universal.dmg)
  3. iPhone per Kabel an den Mac, „Vertrauen" + Code bestätigen.
  4. iloader öffnen → mit der Sideload-Apple-ID anmelden (case-sensitive!) → Gerät wählen → „Install SideStore (Stable)".
  5. iPhone (iOS 26): Einstellungen → Allgemein → VPN & Geräteverwaltung → Entwickler-App-Profil → „Allow & Restart" + Passcode. Entwicklermodus (Datenschutz & Sicherheit) aktivieren, falls noch nicht an (Neustart).
  6. LocalDevVPN verbinden → SideStore öffnen → mit derselben Apple-ID anmelden → den „7 DAYS"-Counter antippen (erster manueller Refresh schließt das Setup ab).
  7. Silverscale.ipa per AirDrop aufs iPhone → SideStore „+" → IPA aus „Dateien" wählen → installieren.
  8. App öffnen → Geräte-Code-Seite erscheint → Code aus den PWA-Einstellungen (📱 Geräte-Login) eingeben → fertig. Kamera-Frage kommt EINMAL nativ.

Login-Architektur

WKWebView kann kein WebAuthn/Passkey → GET /api/auth/login erkennt den User-Agent SilverscaleApp (appendUserAgent in capacitor.config.json) und zeigt eine Code-Eingabeseite; POST /api/auth/device-login setzt die normale 180-Tage-Session (ADR-40, backend/auth.py).

Refresh-Betrieb (SideStore)

Freie Apple-ID = Signatur läuft nach 7 Tagen ab. SideStore refresht selbst (LocalDevVPN an, Hintergrundaktualisierung an, App gelegentlich öffnen). Verpasster Refresh: App startet nicht mehr — kein Datenverlust, einmal in SideStore manuell refreshen. Limits: max. 3 aktive Apps inkl. SideStore.