Der Start-Tab spiegelte bisher fest die Web-Dashboards - dieselbe gespeicherte Anordnung, und Diagramme gab es nur den Hinweis "im Web". Das war der Punkt, der geaergert hat. Jetzt ist der Modus je Server umschaltbar: "Web-Uebersicht spiegeln" (weiter Standard, damit nach dem Update nichts ueberrascht) oder "Eigene App-Uebersicht". Die eigene Uebersicht liegt nur auf dem Geraet (pro Server), unabhaengig vom Web und nicht synchronisiert. Beim ersten Umschalten entsteht gleich eine sinnvolle Startanordnung. Sie funktioniert wie im Web, nur fuers Telefon: mehrere Dashboards, Karten einspaltig untereinander, im Bearbeiten-Modus hinzufuegen, per Ziehen sortieren und loeschen; Artikelkarten bekommen ihren Artikel zugewiesen. Anzeigen und Bearbeiten sind getrennt - so laufen Sortieren und Loeschen sauber, statt an Sektionsgrenzen zu haken. Die Diagramme sind nativ mit Swift Charts: Ablauf- und Kategorien-Anteile (Ring ab iOS 17, sonst ein 100-%-Balken - das Ziel ist iOS 16, deshalb kein stilles Anheben), Kategorien nach Zustand als gestapelte Balken, Bestands- und Artikelverlauf als Linie, Ein-/Auslagerungen als gruppierte Balken. Dieselben Endpunkte wie das Web-Dashboard, kein Backend-Eingriff. Der "gibt es nur im Web"-Hinweis faellt damit weg - auch beim Spiegeln werden die Diagramme jetzt nativ gezeichnet. Geprueft: Build; alle vier Diagramm-Modelle gegen echte Serverantworten dekodiert (auch der Zeitstempel mit Z und Sekundenbruchteilen); refactorte DashboardCardView ohne alte Aufrufstellen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Vorrania – iOS-App
Native SwiftUI-App zum Ein- und Auslagern per Barcode-Scan. Sie spricht dieselbe REST-API wie die Web-Oberfläche.
Stand: Läuft auf dem Gerät. Login, Scanner, Einlagern mit mehreren Chargen/MHDs, MHD per Texterkennung, Auslagern mit Chargenauswahl, Artikel anlegen aus Open Food Facts, Einkaufsliste, Ablaufliste sowie Produkte ansehen und bearbeiten.
Projekt in Xcode öffnen
Variante A – mit XcodeGen (empfohlen)
brew install xcodegen
cd ios
xcodegen generate
open Vorrania.xcodeproj
project.yml beschreibt das Projekt vollständig (Bundle-ID, Info.plist,
Shortcuts, URL-Schema).
Variante B – ohne XcodeGen
- Xcode → File ▸ New ▸ Project… → App, Interface SwiftUI, Sprache Swift
- Produktname
Vorrania, Bundle-ID z. B.com.scarriffle.vorrania - Die von Xcode erzeugte
ContentView.swiftund…App.swiftlöschen - Den Ordner
Sources/per Drag & Drop ins Projekt ziehen („Copy items if needed") - In den Target-Einstellungen die mitgelieferte
Sources/Info.plistals Info.plist setzen (Build Settings ▸ Info.plist File) und Generate Info.plist File auf No stellen
Auf dem iPhone installieren
- iPhone per Kabel verbinden, in Xcode als Ziel auswählen
- Signing & Capabilities → dein Apple-Developer-Team wählen
- ▶︎ Run. Beim ersten Start auf dem iPhone unter Einstellungen ▸ Allgemein ▸ VPN & Geräteverwaltung dem Entwickler vertrauen
Erste Schritte in der App
Beim Start nach der Server-Adresse fragen lassen, z. B. http://192.168.1.50:8080
(dieselbe Adresse wie im Browser), dann mit deinem Benutzer anmelden. Adresse und
Token bleiben gespeichert – das Token liegt im Keychain.
Home-Screen-Shortcuts
Es gibt zwei Wege direkt in den Scan-Bildschirm:
Schnellaktionen – langer Druck auf das App-Symbol zeigt „Einlagern" und „Auslagern" (funktioniert ohne weitere Einrichtung).
Eigene Symbole auf dem Home-Bildschirm – über die Apple-App Kurzbefehle:
- Kurzbefehle ▸ + ▸ Aktion URL öffnen
- URL
vorrania://checkin(bzw.vorrania://checkout) eintragen - Kurzbefehl benennen, dann ▸ Zum Home-Bildschirm hinzufügen
Beide Wege öffnen die App direkt in der Kamera.
Aufbau der Quellen
| Datei | Inhalt |
|---|---|
VorraniaApp.swift |
App-Einstieg, Schnellaktionen, URL-Schema |
Session.swift |
Server-Adresse (UserDefaults) und Token (Keychain) |
APIClient.swift |
REST-Aufrufe gegen /api/... |
Models.swift |
Codable-Typen passend zu backend/app/schemas.py |
ScannerView.swift |
Kamera + Barcode-Erkennung (EAN-8/13, UPC-E, Code128, QR) |
RootView.swift |
Startbildschirm und Routing |
LoginView.swift |
Server + Anmeldung |
CheckInView.swift / CheckInFormView.swift |
Scan → Menge, mehrere Chargen mit MHD |
CheckOutView.swift |
Scan → Menge, Chargenauswahl oder FEFO |
ProductViews.swift |
Artikelsuche und Anlegen (mit OFF-Vorbefüllung) |
ProductDetailView.swift |
Produkt bearbeiten, Chargen korrigieren und löschen |
ListViews.swift |
Einkaufsliste, „bald ablaufend", Produktliste |
DateScanView.swift / BestBeforeText.swift |
MHD per Texterkennung ablesen |
DisplaySettings.swift |
Datumsformat und Einheiten-Beschriftungen vom Server |
CategoryPicker.swift |
Kategorie-Auswahl und Gruppe anlegen |
Gruppe und Kategorie – zwei verschiedene Dinge
Gruppe dient der Bestandsrechnung: Mehl von Rewe, Aldi und Migros zählen zusammen, wichtig ist „ich habe 5 kg Mehl“. Eine Gruppe hat deshalb einen gemeinsamen Mindestbestand mit Einheit und EAN-Codes. Ordnest du einen Artikel einer Gruppe zu, erscheint sein EAN-Code automatisch dort; wechselt er die Gruppe, wandert der Code mit.
Kategorie dient allein dem Überblick („Süßwaren“, „Molkereiprodukte“) und ist verschachtelbar wie ein Lagerort (Süßwaren → Schokolade). Sie hat keinen Bestand, keinen Mindestbestand und keine EAN-Codes. Filterst du auf eine Oberkategorie, erscheinen die Artikel ihrer Unterkategorien mit. Beim Anlegen schlägt der Server eine Kategorie aus der Open-Food-Facts-Einordnung vor.
Noch offen
- Push-Benachrichtigungen bei ablaufenden Produkten
- Lagerort je Charge beim Einlagern wählbar