Files
Vorrania/ios
Scarriffle ff158a1e5f iOS: mehrere Server, TabBar, Uebersicht, Verlauf und Stammdaten
Die App konnte fuenf Dinge, die Web-Oberflaeche vierzehn. Alles darueber hinaus
- nachsehen was gestern passiert ist, einen Lagerort anlegen - zwang zurueck an
den Browser.

Mehrere Server: Statt einer Adresse und einem Token kennt die App jetzt
beliebig viele Profile, jedes mit eigenem Token im Keychain. Ein Wechsel ist
damit ein Tipp und meldet an keinem der Server ab. Jedes Profil hat einen frei
waehlbaren Namen ("Zuhause"), der oben in der App steht; ohne Angabe faellt er
auf den Rechnernamen zurueck. Eine bestehende Anmeldung wird beim ersten Start
in ein Profil ueberfuehrt - ohne das waere man nach dem Update abgemeldet.

Statt einer Startseite mit Kacheln gibt es vier Tabs: Start, Scannen, Listen
und - nur fuer Administratoren, wie im Web - Verwaltung. Neu darin sind eine
Uebersicht mit den Kennzahlen des Servers, die per Tipp in die passende Liste
fuehren, der Bewegungsverlauf (auch je Artikel, weil /movements danach filtern
kann) und die Stammdaten: Lagerorte, Einheiten, Gebinde, Kategorien und
Gruppen. Die fuenf teilen sich eine Ansicht und unterscheiden sich nur darin,
wie geladen und geschrieben wird.

Zwei Dinge, die beim Pruefen gegen einen echten Server auffielen: Der Server
schickt Zeitstempel in UTC, haengt hinter SQLite aber keine Zeitzone an. Naiv
gelesen haette die App jede Uhrzeit um die eigene Zeitverschiebung daneben
angezeigt, deshalb wird die nackte Form ausdruecklich als UTC gelesen. Und die
Anzeigeeinstellungen gehoeren dem Server, werden beim Wechsel also neu geladen.

Bewusst nicht dabei: Benutzer, Einstellungen, Branding und Import/Export. Die
bleiben vorerst im Web.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 18:24:07 +02:00
..
2026-07-23 17:35:45 +02:00
2026-07-23 17:35:45 +02:00

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

  1. Xcode → File ▸ New ▸ Project…App, Interface SwiftUI, Sprache Swift
  2. Produktname Vorrania, Bundle-ID z. B. com.scarriffle.vorrania
  3. Die von Xcode erzeugte ContentView.swift und …App.swift löschen
  4. Den Ordner Sources/ per Drag & Drop ins Projekt ziehen („Copy items if needed")
  5. In den Target-Einstellungen die mitgelieferte Sources/Info.plist als Info.plist setzen (Build Settings ▸ Info.plist File) und Generate Info.plist File auf No stellen

Auf dem iPhone installieren

  1. iPhone per Kabel verbinden, in Xcode als Ziel auswählen
  2. Signing & Capabilities → dein Apple-Developer-Team wählen
  3. ▶︎ 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:

  1. Kurzbefehle ▸ + ▸ Aktion URL öffnen
  2. URL vorrania://checkin (bzw. vorrania://checkout) eintragen
  3. 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