Teilen-Weg repariert, Zwischenablage nativ, Sprung in den Tankvorgang (2026.9.2.24/.25)
BEFUND. Die Uebergabe der Teilen-Erweiterung an die App konnte nie
funktionieren: sie legte den Beleg im Gruppen-Container ab, die App suchte ihn
ueber @capacitor/preferences - und dessen iOS-Code liest IMMER
UserDefaults.standard der App, configure({group}) setzt nur ein
Schluessel-Praefix. Falscher Behaelter, falscher Schluessel, und weil ein
fehlender Eintrag der Normalfall ist, meldete nichts einen Fehler.
UMBAU. Die Erweiterung schreibt das PDF als Datei in den Gruppen-Container und
gibt den Pfad im Aufruf mit; die App liest ihn ueber @capacitor/filesystem
(volle file://-Pfade) und loescht ihn danach. Abgeholt ueber getLaunchUrl()
und appUrlOpen - iOS benutzt beide. Nebenbei entfallen die
Base64-Aufblaehung und die 4-MB-Grenze der UserDefaults.
ZWEI WEITERE FEHLER AUF DEMSELBEN WEG. Ein Beleg zu einem bestehenden
Tankvorgang lief in die 20-Sekunden-Frist, obwohl der Server laengst fertig
war. Und beim Duplikat verriet das Backend nicht, welcher Vorgang gemeint ist
- jetzt kommt vorhandener_tank_id mit, und beide Oberflaechen springen
dorthin. Dazu: nach dem Speichern oeffnet sich der neue Vorgang, und waehrend
gelesen wird, steht "Tankbeleg wird verarbeitet ..." mit Zapfsaeule und
Kreisel im Formular.
ZWISCHENABLAGE. navigator.clipboard.read() gibt nur Text, HTML und Bilder
heraus - ein kopiertes PDF ist dort nie zu bekommen. UIPasteboard kennt die
Grenze nicht: ein kleines eigenes Plugin holt es, auch aus Mail (Anhang als
Verweis, ueber pasteboard.urls mit Sicherheitsbereich).
Der native Teil braucht einen Mac-Lauf; ios-teilen-einrichten.mjs spielt beide
Swift-Dateien bei jedem Bau ein.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -8338,3 +8338,78 @@ nativ. Steht zur Prüfung beim Eigentümer.
|
||||
`UIPasteboard` oder er verschwindet auf dem Telefon.
|
||||
- **Teilen legt keinen Tankvorgang an** (Abschnitt BQ) — die drei OTA-Teile und der native Umbau
|
||||
stehen weiter aus.
|
||||
|
||||
---
|
||||
|
||||
## BR. Der Teilen-Weg, der nie ankam — und was daran alles hing (2026.9.2.24/.25)
|
||||
|
||||
### Der Befund: falscher Behälter, falscher Schlüssel
|
||||
|
||||
Gemeldet am 02.09.2026: „ich habe am iPhone einen Tankbeleg mit der App geteilt. Dabei öffnet die
|
||||
App" — und danach passiert nichts, es wird kein Tankvorgang angelegt.
|
||||
|
||||
Die Erweiterung legte den Beleg base64-kodiert unter `dm360_geteilter_beleg` in
|
||||
`UserDefaults(suiteName: "group.app.datametric360")` ab. Die App holte ihn mit
|
||||
`@capacitor/preferences` und `configure({ group })` — in der Annahme, das Plugin lese damit die
|
||||
UserDefaults der Gruppe. **Das tut es nicht.** Sein iOS-Code (8.0.1,
|
||||
`ios/Sources/PreferencesPlugin/Preferences.swift`):
|
||||
|
||||
```swift
|
||||
private var defaults: UserDefaults { return UserDefaults.standard } // immer
|
||||
private var prefix: String { group + "." } // Gruppe = nur Präfix
|
||||
```
|
||||
|
||||
`configure({group})` wechselt **nicht den Container**, es setzt ein Schlüssel-Präfix. Gesucht wurde
|
||||
also `group.app.datametric360.dm360_geteilter_beleg` im eigenen Bereich der App, abgelegt war der
|
||||
blanke Schlüssel im Gruppen-Container. Zwei Seiten, die sich nie treffen konnten — und weil ein
|
||||
fehlender Eintrag der Normalfall ist (jeder gewöhnliche App-Start), meldete nichts einen Fehler.
|
||||
|
||||
**Die Lehre:** Bei einem Plugin, das eine Systemgrenze überbrücken soll, den Quelltext lesen, nicht
|
||||
die README. Zwei Zeilen hätten den ganzen Entwurf verhindert.
|
||||
|
||||
### Der Umbau: Datei statt UserDefaults
|
||||
|
||||
Die Erweiterung schreibt das PDF jetzt in den Container der App-Gruppe und gibt den Pfad im Aufruf
|
||||
mit — `datametric360://beleg?pfad=file:///…`. Die App liest ihn über `@capacitor/filesystem`, das
|
||||
volle `file://`-Pfade ausdrücklich unterstützt, und löscht die Datei danach. Abgeholt wird über
|
||||
**`getLaunchUrl()` und `appUrlOpen`**: iOS benutzt beide, je nachdem ob die App lief.
|
||||
|
||||
Zwei Altlasten fallen dabei weg: die Base64-Aufblähung um ein Drittel und die 4-MB-Grenze der
|
||||
UserDefaults (jetzt 24 MB, eine reine Vernunftgrenze).
|
||||
|
||||
### Zwei weitere Fehler auf demselben Weg
|
||||
|
||||
**Ein Beleg zu einem bestehenden Tankvorgang lief in die Zeitüberschreitung.** Die Warteschleife in
|
||||
`Tanken.tsx` wertete nur Ergebnisse mit `tank_id == null` aus; kam eine `tank_id` zurück, drehte sie
|
||||
20 Sekunden weiter und meldete „Der Server hat den Beleg noch nicht zurückgemeldet", obwohl er
|
||||
längst fertig war.
|
||||
|
||||
**Beim Duplikat verriet das Backend nicht, welcher Vorgang gemeint ist.** `belege.py` meldete
|
||||
`{"fehler": "Beleg bereits erfasst", "tank_id": <Eingabe>}` — beim Teilen ist das `null`. Jetzt
|
||||
kommt `vorhandener_tank_id` mit, und beide Oberflächen springen dorthin. Bewusst ein **eigenes
|
||||
Feld**: `tank_id` ist die Eingabe des Aufrufs, und das Panel entscheidet daran, wo es den Fehler
|
||||
anzeigt — eine Umdeutung hätte die Anzeige im Neuanlage-Formular stillschweigend zerstört.
|
||||
|
||||
Dazu, auf Wunsch des Eigentümers: nach dem Speichern öffnet sich der neu angelegte Vorgang (die
|
||||
Liste wird frisch gelesen und der Eintrag am `receipt_key` wiedererkannt — der Dienst gibt keine ID
|
||||
zurück), und während der Server liest, steht „Tankbeleg wird verarbeitet …" mit Zapfsäule und
|
||||
Kreisel im Formular.
|
||||
|
||||
### Zwischenablage: dieselbe Grenze, dieselbe Lösung
|
||||
|
||||
`navigator.clipboard.read()` gibt nur Text, HTML und Bilder heraus — ein kopiertes PDF ist dort
|
||||
**nie** zu bekommen. Der Knopf „Aus Zwischenablage einfügen" endete auf dem Telefon zwangsläufig mit
|
||||
„In der Zwischenablage liegt kein PDF". Keine Lücke im Code, sondern die Grenze der Schnittstelle.
|
||||
|
||||
`UIPasteboard` kennt sie nicht. Ein kleines eigenes Plugin
|
||||
(`native/BelegZwischenablage.swift`, 70 Zeilen) holt das PDF auf zwei Wegen: als Daten unter
|
||||
`com.adobe.pdf`, und — für Mail, das Anhänge oft nur als Verweis kopiert — über `pasteboard.urls`
|
||||
mit Sicherheitsbereich. `ios-teilen-einrichten.mjs` hängt die Datei bei jedem Bau an die
|
||||
Sources-Phase des App-Ziels; das steht **vor** dem Ausstieg für „Erweiterung schon vorhanden",
|
||||
weil `ios/` jederzeit neu erzeugt werden kann.
|
||||
|
||||
### Was davon einen Mac-Lauf braucht
|
||||
|
||||
Alles Native: der Umbau der Übergabe und das Zwischenablage-Plugin. Die drei Teile davor
|
||||
(Backend-Feld, Warteschleife, Anzeige) laufen per OTA. **Rein per OTA ist die Brücke über die
|
||||
App-Gruppe nicht zu reparieren** — egal welchen Weg man nimmt.
|
||||
|
||||
Reference in New Issue
Block a user