Files
certain/ios/App/CertainApp.swift
GuidoandClaude Opus 5 09ec2dc5fd feat: Bildschirmsperre mit Face ID und PIN
Beim ersten Start fuehrt kein Weg an einer sechsstelligen PIN vorbei. Danach
sperrt die App beim Kaltstart und beim Wegschalten; kommt man binnen einer
Minute zurueck, geht sie ohne Nachfrage wieder auf. Face ID zuerst, die PIN
als Rueckfallweg und als einziger Weg ohne Biometrie. Nach fuenf falschen
PINs meldet die App ab.

Gesperrt wird schon bei inactive, nicht erst im Hintergrund - sonst stuenden
die Kontostaende im App-Umschalter.

Von der PIN liegt nur ein gesalzener SHA-256 im Schluesselbund. Die
Gerätemarke selbst bleibt wie bisher abgelegt: Die Sperre verdeckt die
Oberflaeche, sie verschluesselt nichts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-24 18:09:05 +02:00

39 lines
1.4 KiB
Swift

import SwiftUI
@main
struct CertainApp: App {
@State private var zustand = AppZustand()
@Environment(\.scenePhase) private var phase
var body: some Scene {
// Das Erscheinungsbild kommt aus den Server-Einstellungen, damit App
// und Weboberfläche gleich aussehen. „system" heisst: nichts vorgeben.
let schema: ColorScheme?
switch zustand.einstellungen.erscheinungsbild {
case "light": schema = .light
case "dark": schema = .dark
default: schema = nil
}
return WindowGroup {
RootAnsicht()
.environment(zustand)
.task { await zustand.starte() }
.preferredColorScheme(schema)
// Einmal hier, damit jeder Knopf, Schalter und Link
// die Markenfarbe traegt statt des System-Blaus.
.tint(.marke)
.onChange(of: phase) { _, neue in
// `inactive` kommt, bevor iOS das Bild für den
// App-Umschalter macht. Dort soll der Sperrbildschirm
// stehen, nicht der Kontostand.
switch neue {
case .inactive, .background: zustand.gehtWeg()
case .active: zustand.kommtZurueck()
@unknown default: break
}
}
}
}
}