OfflineâFirst HintergrundâSynchronisation mobiler Apps: Konflikte, Wiederholungen und UX
Plane die OfflineâFirstâHintergrundsynchronisation mobiler Apps mit klaren Konfliktregeln, Wiederholungslogik und einer einfachen UX fĂŒr ausstehende Ănderungen in nativen Kotlinâ und SwiftUIâApps.

Das Problem: Nutzer bearbeiten offline und die RealitÀt Àndert sich
Jemand beginnt eine Aufgabe bei guter Verbindung und lĂ€uft dann in einen Fahrstuhl, eine Ecke im Lager oder einen UâBahnâTunnel. Die App lĂ€uft weiter, also arbeitet die Person weiter. Sie tippt auf Speichern, fĂŒgt eine Notiz hinzu, Ă€ndert einen Status oder erstellt vielleicht sogar einen neuen Datensatz. Auf dem Bildschirm sieht alles sofort korrekt aus.
SpĂ€ter kommt die Verbindung zurĂŒck und die App versucht im Hintergrund aufzuholen. Genau hier kann HintergrundâSync die Leute ĂŒberraschen.
Wenn die App nicht vorsichtig ist, kann dieselbe Aktion zweimal gesendet werden (Duplikate), oder eine neuere Ănderung vom Server kann das ĂŒberschreiben, was der Nutzer gerade getan hat (verlorene Ănderungen). Manchmal zeigt die App verwirrende ZustĂ€nde wie âGespeichertâ und âNicht gespeichertâ gleichzeitig, oder ein Datensatz erscheint, verschwindet und taucht nach der Synchronisation wieder auf.
Ein Konflikt ist simpel: zwei unterschiedliche Ănderungen wurden an derselben Sache vorgenommen, bevor die App sie zusammengefĂŒhrt hat. Zum Beispiel Ă€ndert eine SupportâMitarbeiterin offline die PrioritĂ€t eines Tickets auf Hoch, wĂ€hrend ein Kollege online das Ticket schlieĂt. Wenn das offline GerĂ€t wieder verbindet, können beide Ănderungen nicht ohne Regel sauber angewendet werden.
Das Ziel ist nicht, Offline perfekt wirken zu lassen. Das Ziel ist, es vorhersehbar zu machen:
- Menschen können weiterarbeiten, ohne Angst vor Datenverlust.
- Die Synchronisation passiert spÀter ohne mysteriöse Duplikate.
- Wenn etwas Aufmerksamkeit braucht, sagt die App klar, was passiert ist und was zu tun ist.
Das gilt, egal ob du in Kotlin/SwiftUI handâcodest oder native Apps mit einer NoâCodeâPlattform wie AppMaster baust. Die schwierige Frage ist nicht das UIâWidget. Sie ist: Wie verhĂ€lt sich die App, wenn sich die Welt Ă€ndert, wĂ€hrend der Nutzer offline ist?
Ein einfaches OfflineâFirstâModell (ohne Fachchinesisch)
Eine OfflineâFirstâApp geht davon aus, dass das Telefon manchmal die Verbindung verliert; trotzdem soll die App nutzbar bleiben. Bildschirme sollten laden und Buttons funktionieren, auch wenn der Server nicht erreichbar ist.
Vier Begriffe decken das meiste ab:
- Lokaler Cache: auf dem GerÀt gespeicherte Daten, damit die App sofort etwas anzeigen kann.
- SyncâWarteschlange: eine Liste von Aktionen, die der Nutzer offline (oder bei schwacher Verbindung) durchgefĂŒhrt hat.
- ServerâWahrheit: die Version, die auf dem Backend liegt und die am Ende alle teilen.
- Konflikt: wenn die wartende Ănderung des Nutzers nicht mehr sauber angewendet werden kann, weil sich die ServerâVersion geĂ€ndert hat.
Ein nĂŒtzliches Denkmodell ist, Lesen und Schreiben zu trennen.
Lesen ist meist einfach: Zeige die bestmöglichen Daten (oft aus dem lokalen Cache) und aktualisiere ruhig, wenn das Netzwerk zurĂŒck ist.
Schreiben ist anders. Verlasse dich nicht darauf, "den ganzen Datensatz auf einmal zu speichern". Das bricht sofort, sobald du offline bist.
Stattdessen zeichne auf, was der Nutzer getan hat, als kleine EintrĂ€ge in einem Ănderungsprotokoll. Zum Beispiel: âStatus auf Genehmigt setzenâ, âKommentar X hinzufĂŒgenâ, âMenge von 2 auf 3 Ă€ndernâ. Jeder Eintrag kommt mit Zeitstempel und ID in die SyncâWarteschlange. Der HintergrundâSync versucht dann, die EintrĂ€ge zuzustellen.
Der Nutzer kann weiterarbeiten, wĂ€hrend Ănderungen von ausstehend zu synchronisiert wechseln.
Wenn du eine NoâCodeâPlattform wie AppMaster verwendest, brauchst du trotzdem dieselben Bausteine: gecachte Lesezugriffe fĂŒr schnelle Bildschirme und eine klare Warteschlange von Nutzeraktionen, die erneut versucht, zusammengefĂŒhrt oder bei Konflikt markiert werden kann.
Entscheide, was wirklich OfflineâUnterstĂŒtzung braucht
OfflineâFirst kann sich anhören wie âalles funktioniert ohne Verbindungâ, aber dieses Versprechen ist hĂ€ufig der Punkt, an dem Apps Probleme bekommen. WĂ€hle die Teile, die wirklich von Offline profitieren, und halte den Rest klar onlineâonly.
Denk in Nutzerabsicht: Was mĂŒssen Leute im Keller, im Flugzeug oder im Lager mit wechselndem Empfang tun? Eine gute Grundeinstellung ist, Aktionen zu unterstĂŒtzen, die alltĂ€gliche Arbeit erstellen oder aktualisieren, und Aktionen zu blockieren, bei denen die âaktuelle Wahrheitâ wichtig ist.
Praktisch sind oft offlineâfreundlich: Erstellen und Bearbeiten von KernâDatensĂ€tzen (Notizen, Aufgaben, Inspektionen, Tickets), EntwĂŒrfe von Kommentaren und AnhĂ€ngen von Fotos (lokal gespeichert, spĂ€ter hochgeladen). Löschen kann auch funktionieren, aber sicherer als SoftâDelete mit einer RĂŒckgĂ€ngigâZeit, bis der Server bestĂ€tigt.
Jetzt entscheide, was in Echtzeit bleiben muss, weil das Risiko zu groĂ ist. Zahlungen, BerechtigungsĂ€nderungen, Genehmigungen und alles mit sensiblen Daten sollten meist eine Verbindung erfordern. Wenn die Aktion ohne ServerprĂŒfung nicht gĂŒltig ist, erlaube sie offline nicht. Zeige eine klare âVerbindung erforderlichââHinweis, nicht eine mysteriöse Fehlermeldung.
Setze Erwartungen zur AktualitĂ€t. âOfflineâ ist nicht binĂ€r. Definiere, wie alt Daten sein dĂŒrfen: Minuten, Stunden oder ânĂ€chster AppâStartâ. Zeige diese Regel in der UI in klaren Worten, z. B. âZuletzt aktualisiert vor 2 Stundenâ und âSynchronisiert, wenn onlineâ.
Markiere schlieĂlich daten mit hohem Konfliktrisiko frĂŒh. InventarstĂ€nde, geteilte Aufgaben und TeamâNachrichten sind typische Konfliktmagneten, weil mehrere Leute schnell daran arbeiten. FĂŒr diese solltest du OfflineâBearbeitungen auf EntwĂŒrfe beschrĂ€nken oder Ănderungen als separate Ereignisse erfassen, statt einen einzelnen Wert zu ĂŒberschreiben.
Wenn du in AppMaster baust, hilft dir dieser Schritt, Daten und GeschĂ€ftsregeln so zu modellieren, dass die App sichere EntwĂŒrfe offline speichert, wĂ€hrend riskante Aktionen onlineâonly bleiben.
Design der SyncâWarteschlange: Was du fĂŒr jede Ănderung speicherst
Wenn ein Nutzer offline arbeitet, versuche nicht âdie Datenbank zu synchronisierenâ. Synchronisiere die Aktionen des Nutzers. Eine klare Aktionswarteschlange ist das RĂŒckgrat des HintergrundâSync und bleibt verstĂ€ndlich, wenn etwas schiefgeht.
Halte Aktionen klein und menschlich, passend zu dem, was der Nutzer tatsÀchlich getan hat:
- Einen Datensatz erstellen
- Bestimmte Feld(er) aktualisieren
- Status Àndern (einreichen, genehmigen, archivieren)
- Löschen (vorzugsweise SoftâDelete bis zur BestĂ€tigung)
Kleine Aktionen sind leichter zu debuggen. Wenn der Support helfen muss, ist es viel einfacher zu lesen: âStatus geĂ€ndert Draft -> Submittedâ als einen riesigen Blob geĂ€nderter JSONâDaten zu untersuchen.
FĂŒr jede wartende Aktion speichere genug Metadaten, um sie sicher erneut abzuspielen und Konflikte zu erkennen:
- DatensatzâIdentifier (und eine temporĂ€re lokale ID fĂŒr neu erstellte DatensĂ€tze)
- AktionsâZeitstempel und GerĂ€teâIdentifier
- Erwartete Version (oder zuletzt bekannte Aktualisierungszeit) des Datensatzes
- Payload (die konkreten geÀnderten Felder, plus alter Wert wenn möglich)
- IdempotencyâKey (eine eindeutige AktionsâID, damit Retries keine Duplikate erzeugen)
Diese erwartete Version ist der SchlĂŒssel zu ehrlicher Konfliktbehandlung. Wenn sich die ServerâVersion bewegt hat, kannst du pausieren und um Entscheidung bitten, statt stillschweigend jemand anderen zu ĂŒberschreiben.
Manche Aktionen mĂŒssen zusammen angewendet werden, weil der Nutzer sie als einen Schritt sieht. Zum Beispiel âBestellung erstellenâ plus âdrei Positionen hinzufĂŒgenâ sollten als Einheit gelingen oder ausstehen. Speicher eine GruppenâID (oder TransaktionsâID), damit die SyncâEngine sie zusammen senden und entweder alle bestĂ€tigen oder alle pending lassen kann.
Egal ob hĂ€ndisch gebaut oder in AppMaster: Das Ziel ist das gleiche â jede Ănderung wird einmal aufgezeichnet, sicher wiedergegeben und ist erklĂ€rbar, wenn etwas nicht passt.
Konfliktlösungsregeln, die du Nutzer:innen erklÀren kannst
Konflikte sind normal. Das Ziel ist nicht, sie unmöglich zu machen, sondern selten, sicher und leicht erklÀrbar zu halten, wenn sie auftreten.
Benenne den Moment, in dem ein Konflikt passiert: die App sendet eine Ănderung, und der Server antwortet: âDieser Datensatz ist nicht die Version, die du bearbeitet hast.â Deshalb ist Versionierung wichtig.
Behalte zwei Werte bei jedem Datensatz:
- ServerâVersion (die aktuelle Version auf dem Server)
- Erwartete Version (die Version, die das Telefon beim Bearbeiten gesehen hat)
Wenn die erwartete Version ĂŒbereinstimmt, akzeptiere das Update und erhöhe die ServerâVersion. Wenn nicht, wende deine Konfliktregel an.
WĂ€hle pro Datentyp eine Regel (nicht eine Regel fĂŒr alles)
Verschiedene Daten brauchen verschiedene Regeln. Ein Statusfeld ist nicht dasselbe wie eine lange Notiz.
Regeln, die Nutzer meist verstehen:
- Last write wins: okay fĂŒr niedriges Risiko, z. B. AnzeigeâEinstellungen.
- Felder mergen: gut, wenn Felder unabhÀngig sind (Status vs Notizen).
- Nutzer fragen: am besten bei risikoreichen Ănderungen wie Preis, Berechtigungen oder Summen.
- Server gewinnt, aber mit Kopie: behalte den ServerâWert, speichere die NutzerĂ€nderung als Entwurf, den sie wieder anwenden können.
In AppMaster lassen sich diese Regeln gut als visuelle Logik abbilden: Versionen prĂŒfen, Felder vergleichen und dann den Pfad wĂ€hlen.
Entscheide, wie Löschen sich verhÀlt (sonst verlierst du Daten)
Löschen ist der knifflige Fall. Verwende ein Tombstone (ein âdeletedââMarker) statt den Datensatz sofort zu entfernen. Dann entscheide, was passiert, wenn jemand einen Datensatz bearbeitet, der anderswo gelöscht wurde.
Eine klare Regel ist: âDeletes gewinnen, aber man kann wiederherstellen.â Beispiel: Ein VerkĂ€ufer bearbeitet offline eine Kundennotiz, wĂ€hrend ein Admin diesen Kunden löscht. Bei Sync zeigt die App: âKunde wurde gelöscht. Wiederherstellen, um deine Notiz anzuwenden?â So vermeidest du stillen Verlust und gibst Kontrolle an die Nutzerin zurĂŒck.
Wiederholungen und FehlerzustÀnde: mach es vorhersehbar
Wenn Sync fehlschlĂ€gt, kĂŒmmern sich die meisten Nutzer nicht um die Ursache. Sie wollen wissen, ob ihre Arbeit sicher ist und was als NĂ€chstes passiert. Ein vorhersehbares Zustandsmodell verhindert Panik und Tickets beim Support.
Beginne mit einem kleinen, sichtbaren Statusmodell und nutze es konsistent auf allen Bildschirmen:
- Queued: auf dem GerÀt gespeichert, wartet auf Netzwerk
- Syncing: wird gerade gesendet
- Sent: vom Server bestÀtigt
- Failed: konnte nicht gesendet werden, wird wiederholt oder braucht Aufmerksamkeit
- Needs review: gesendet, aber vom Server abgelehnt oder markiert
Retries sollten schonend fĂŒr Akku und Daten sein. Verwende anfĂ€nglich schnelle Wiederholungen (fĂŒr kurze SignalabbrĂŒche), dann verlangsame sie. Ein einfacher Backoff wie 1 Min, 5 Min, 15 Min, dann stĂŒndlich ist leicht verstĂ€ndlich. Wiederhole auĂerdem nur, wenn es Sinn macht (versuche nicht, eine ungĂŒltige Ănderung endlos zu senden).
Behandle Fehlerarten unterschiedlich, weil die nÀchste Aktion unterschiedlich ist:
- Offline / kein Netzwerk: bleibe in der Warteschlange, wiederhole bei Online
- Timeout / Server nicht verfĂŒgbar: markiere als fehlgeschlagen, automatische Wiederholung mit Backoff
- Auth abgelaufen: pausiere Sync und bitte den Nutzer, sich erneut anzumelden
- Validierung fehlgeschlagen (falsche Eingaben): braucht ĂberprĂŒfung, zeige, was zu korrigieren ist
- Konflikt (Datensatz geĂ€ndert): braucht ĂberprĂŒfung, leite gemÀà deiner Konfliktregeln
Idempotenz macht Retries sicher. Jede Ănderung sollte eine eindeutige AktionsâID (oft eine UUID) haben, die mit der Anfrage gesendet wird. Wenn die App dieselbe Ănderung erneut sendet, sollte der Server die ID erkennen und dasselbe Ergebnis zurĂŒckgeben, statt Duplikate zu erzeugen.
Beispiel: Ein Techniker speichert einen abgeschlossenen Auftrag offline und fĂ€hrt dann in einen Aufzug. Die App sendet das Update, es timeâoutet und wird spĂ€ter erneut versucht. Mit einer AktionsâID ist der zweite Send harmlos. Ohne sie erzeugst du vielleicht doppelte âabgeschlossenââEreignisse.
In AppMaster behandle diese ZustĂ€nde und Regeln als erstklassige Felder und Logik in deinem SyncâProzess, damit deine Kotlinâ und SwiftUIâApps ĂŒberall gleich reagieren.
UX fĂŒr ausstehende Ănderungen: was der Nutzer sieht und tun kann
Menschen sollen sich sicher fĂŒhlen, die App offline zu nutzen. Gute âPending changesââUX ist ruhig und vorhersehbar: Sie bestĂ€tigt, dass Arbeit auf dem GerĂ€t gespeichert ist, und macht den nĂ€chsten Schritt offensichtlich.
Ein dezenter Indikator ist besser als ein Warnbanner. Zeige z. B. ein kleines âSynchronisiereââIcon in der Kopfleiste oder ein unaufdringliches â3 ausstehendââLabel auf dem Bildschirm, wo die Ănderungen passieren. Spare auffĂ€llige Farben fĂŒr echte Gefahren (z. B. âkann nicht hochgeladen werden, weil du abgemeldet bist").
Gib den Nutzern einen Ort, an dem sie alles verstehen können. Ein simples Outboxâ oder AusstehendeâĂnderungenâFenster kann EintrĂ€ge mit klarer Sprache auflisten wie âKommentar zu Ticket 104 hinzugefĂŒgtâ oder âProfilfoto aktualisiertâ. Diese Transparenz verhindert Panik und reduziert SupportâAnfragen.
Was Nutzer tun können
Die meisten Menschen brauchen nur wenige Aktionen, die ĂŒberall konsistent sein sollten:
- Jetzt erneut versuchen
- Nochmals bearbeiten (erstellt eine neue Ănderung)
- Lokale Ănderung verwerfen
- Details kopieren (nĂŒtzlich beim Melden eines Problems)
Halte Statuslabels einfach: Pending, Syncing, Failed. Wenn etwas fehlschlĂ€gt, erklĂ€re es wie ein Mensch: âKonnte nicht hochladen. Kein Internet.â oder âAbgelehnt, weil dieser Datensatz von jemand anderem geĂ€ndert wurde.â Vermeide Fehlercodes.
Blockiere nicht die ganze App
Blockiere nur Aktionen, die wirklich online sein mĂŒssen, wie âMit Stripe bezahlenâ oder âneuen Nutzer einladenâ. Alles andere sollte weiter funktionieren, inklusive dem Anzeigen kĂŒrzlich geladener Daten und dem Erstellen neuer EntwĂŒrfe.
Ein realistischer Ablauf: Ein FieldâTech bearbeitet einen Bericht im Keller. Die App zeigt â1 ausstehendâ und lĂ€sst ihn weiterarbeiten. SpĂ€ter wechselt der Status zu âSynchronisiereâ und leert sich automatisch. Wenn es fehlschlĂ€gt, bleibt der Bericht verfĂŒgbar, markiert als âFehlgeschlagenâ, mit einem einzigen Button âJetzt erneutâ.
Wenn du in AppMaster baust, modelliere diese ZustĂ€nde als Teil jedes Datensatzes (pending, failed, synced), damit die UI sie ĂŒberall ohne SpezialfĂ€lle anzeigen kann.
Auth, Berechtigungen und Sicherheit im OfflineâModus
Offline Ă€ndert dein Sicherheitsmodell. Ein Nutzer kann Aktionen tĂ€tigen, ohne Verbindung, aber dein Server bleibt die Quelle der Wahrheit. Behandle jede wartende Ănderung als âangefordertâ, nicht als âgenehmigtâ.
Ablauf der Anmeldung im OfflineâZustand
Tokens laufen ab. Wenn das offline passiert, lass den Nutzer trotzdem Ănderungen erstellen und speichere sie als ausstehend. TĂ€usche nicht vor, dass Aktionen, die ServerbestĂ€tigung brauchen (Zahlungen, AdminâGenehmigungen), abgeschlossen sind. Markiere sie als ausstehend, bis ein erfolgreicher AuthâRefresh stattgefunden hat.
Wenn die App wieder online ist, versuche zuerst ein stilles Refresh. Wenn du den Nutzer zur Anmeldung auffordern musst, mache es einmal, dann setze den Sync automatisch fort.
Nach dem ReâLogin validiere jeden wartenden Eintrag nochmal, bevor du ihn sendest. Die NutzeridentitĂ€t kann sich geĂ€ndert haben (gemeinsames GerĂ€t) und alte Ănderungen dĂŒrfen nicht unter dem falschen Konto synchronisiert werden.
BerechtigungsÀnderungen und verbotene Aktionen
Berechtigungen können sich Ă€ndern, wĂ€hrend der Nutzer offline ist. Eine gestern erlaubte Ănderung kann heute verboten sein. Behandle das ausdrĂŒcklich:
- ĂberprĂŒfe serverseitig jede wartende Aktion auf Berechtigung
- Bei Verbot stoppe den Eintrag und zeige einen klaren Grund
- Bewahre die lokale Ănderung, damit der Nutzer sie kopieren oder Zugriff anfragen kann
- Vermeide wiederholte Versuche bei âforbiddenââFehlern
Beispiel: Ein SupportâAgent bearbeitet offline eine Kundennotiz im Flugzeug. Ăber Nacht wird seine Rolle entfernt. Beim Sync lehnt der Server das Update ab. Die App sollte anzeigen: âKann nicht hochgeladen werden: Du hast keinen Zugriff mehrâ und die Notiz als lokalen Entwurf behalten.
Sensible Daten offline speichern
Speichere nur das Minimum, das nötig ist, um Bildschirme darzustellen und die Warteschlange abzuspielen. VerschlĂŒssele lokalen Speicher, meide das Cachen von Secrets und setze klare Regeln fĂŒr Logout (z. B. lokale Daten löschen oder EntwĂŒrfe nur mit expliziter Zustimmung behalten). Wenn du mit AppMaster arbeitest, starte mit dessen AuthâModul und gestalte deine Warteschlange so, dass sie immer auf eine gĂŒltige Session wartet, bevor Ănderungen gesendet werden.
HĂ€ufige Fallen, die Arbeit verloren gehen oder Duplikate erzeugen lassen
Die meisten OfflineâBugs sind nicht spektakulĂ€r. Sie entstehen aus ein paar kleinen Entscheidungen, die harmlos wirken, wenn du mit perfektem WLAN testest, aber die reale Arbeit spĂ€ter kaputtmachen.
Ein hĂ€ufiger Fehler sind stille Ăberschreibungen. Wenn die App eine Ă€ltere Version hochlĂ€dt und der Server sie ohne PrĂŒfung akzeptiert, kannst du eine neuere Ănderung einer anderen Person löschen, und niemand bemerkt es, bis es zu spĂ€t ist. Synchronisiere mit einer Versionsnummer (oder einem updatedAtâZeitstempel) und weigere dich zu ĂŒberschreiben, wenn der Server weiter ist, sodass die Nutzerin eine klare Wahl bekommt.
Eine andere Falle ist ein RetryâSturm. Wenn ein Telefon wieder Verbindung bekommt, kann die App den Backend alle paar Sekunden zuspammen, Akku leeren und doppelte Writes erzeugen. Wiederholungen sollten ruhig sein: nach jedem Fehler langsamer werden und etwas ZufĂ€lligkeit einbauen, damit nicht tausende GerĂ€te gleichzeitig erneut versuchen.
Die Fehler, die am hĂ€ufigsten zu Datenverlust oder Duplikaten fĂŒhren:
- Behandle jeden Fehler als âNetzwerkâ: trenne permanente Fehler (ungĂŒltige Daten, fehlende Berechtigung) von temporĂ€ren (Timeout).
- Verstecke SyncâFehler: wenn Leute nicht sehen, was fehlgeschlagen ist, machen sie die Aufgabe nochmal und erzeugen zwei DatensĂ€tze.
- Sende dieselbe Ănderung zweimal ohne Schutz: hĂ€nge immer eine eindeutige RequestâID an, damit der Server Duplikate erkennt und ignoriert.
- Textfelder automatisch mergen ohne Information: wenn du Ănderungen automatisch kombinierst, lass Nutzer das Ergebnis ĂŒberprĂŒfen, wenn es wichtig ist.
- DatensĂ€tze offline ohne stabile ID erstellen: verwende eine temporĂ€re lokale ID und mappe sie auf die ServerâID nach dem Upload, damit spĂ€tere Ănderungen nicht einen zweiten Datensatz erzeugen.
Ein schnelles Beispiel: Ein FieldâTech erstellt offline einen neuen âSite Visitâ und bearbeitet ihn zweimal, bevor die Verbindung zurĂŒckkommt. Wenn der CreateâCall erneut versucht wird und zwei ServerâDatensĂ€tze erzeugt, hĂ€ngen spĂ€tere Ănderungen möglicherweise am falschen Eintrag. Stabile IDs und serverseitiges Deduping verhindern das.
Wenn du das mit AppMaster baust, Ă€ndern sich die Regeln nicht. Der Unterschied ist nur, wo du sie implementierst: in deiner SyncâLogik, im Datenmodell und in den Bildschirmen, die âfailedâ vs âsentâ anzeigen.
Beispielszenario: zwei Personen bearbeiten denselben Datensatz
Eine FieldâTechnikerin, Maya, aktualisiert in einem Keller das Ticket âJob #1842â. Sie Ă€ndert den Status von âIn progressâ auf âCompletedâ und fĂŒgt die Notiz hinzu: âVentil ersetzt, getestet OK.â Die App speichert sofort und zeigt den Eintrag als ausstehend an.
Oben arbeitet ihr Kollege Leo online am selben Job. Er Àndert die geplante Zeit und weist den Auftrag einem anderen Techniker zu, weil ein Kunde ein Update gemeldet hat.
Als Maya wieder Empfang hat, startet der HintergrundâSync leise. So lĂ€uft es in einem vorhersehbaren, nutzerfreundlichen Ablauf:
- Mayas Ănderung ist noch in der SyncâWarteschlange (JobâID, geĂ€nderte Felder, Zeitstempel und die Version, die sie zuletzt gesehen hat).
- Die App versucht hochzuladen. Der Server antwortet: âDieser Job wurde seit deiner Version aktualisiertâ (Konflikt).
- Deine Konfliktregel greift: Status und Notizen können gemerged werden, aber ZuweisungsÀnderungen gewinnen, wenn sie spÀter auf dem Server gemacht wurden.
- Der Server akzeptiert ein gemergtes Ergebnis: status = âCompletedâ (von Maya), Notiz hinzugefĂŒgt (von Maya), zugewiesener Techniker = Leos Ănderung (von Leo).
- Der Job erscheint in Mayas App mit einem klaren Banner: âSynchronisiert mit Ănderungen. Zuweisung wurde wĂ€hrend deiner OfflineâZeit geĂ€ndert.â Eine kleine âĂberprĂŒfenââAktion zeigt, was sich geĂ€ndert hat.
FĂŒge einen Fehler hinzu: Mayas LoginâToken lief offline ab. Der erste SyncâVersuch schlĂ€gt fehl mit âAnmeldung erforderlichâ. Die App behĂ€lt ihre Ănderungen, markiert sie als âPausiertâ und zeigt eine einfache Aufforderung. Nach der Anmeldung setzt der Sync automatisch fort, ohne dass sie etwas neu tippen muss.
Wenn es ein Validierungsproblem gibt (z. B. âCompletedâ erfordert ein Foto), soll die App nicht raten. Sie markiert den Eintrag als âBenötigt Aufmerksamkeitâ, sagt genau, was fehlt, und lĂ€sst ihn neu senden, wenn alles vollstĂ€ndig ist.
Plattformen wie AppMaster helfen hier, weil du Warteschlange, Konfliktregeln und PendingâZustĂ€nde visuell designen kannst und trotzdem echte native Kotlinâ und SwiftUIâApps auslieferst.
Kurze Checkliste und nÀchste Schritte
Behandle OfflineâSync wie ein EndâtoâEndâFeature, das du testen kannst â nicht als Ansammlung von Reparaturen. Das Ziel ist simpel: Nutzer sollen nie zweifeln, ob ihre Arbeit gespeichert ist, und die App darf keine ĂŒberraschenden Duplikate erzeugen.
Eine kurze Checkliste, um das Fundament zu prĂŒfen:
- Die SyncâWarteschlange liegt auf dem GerĂ€t und jede Ănderung hat eine stabile lokale ID plus eine ServerâID, wenn verfĂŒgbar.
- Klare Status existieren (queued, syncing, sent, failed, needs review) und werden konsistent verwendet.
- Requests sind idempotent (wiederholbar), und jede Operation enthĂ€lt einen IdempotencyâKey.
- DatensÀtze haben Versionierung (updatedAt, Revisionsnummer oder ETag), damit Konflikte erkannt werden können.
- Konfliktregeln sind in klarer Sprache formuliert (was gewinnt, was wird gemerged, wann fragt man den Nutzer).
Wenn das steht, prĂŒfe, ob das Erlebnis genauso robust ist wie das Datenmodell. Nutzer sollten sehen können, was aussteht, verstehen, was fehlgeschlagen ist, und handeln können, ohne Angst vor Datenverlust.
Teste mit realistischen Szenarien:
- FlugmodusâBearbeitungen: erstellen, aktualisieren, löschen und dann reconnecten.
- Flackerndes Netz: Verbindung mitten im Sync verlieren und sicherstellen, dass Retries keine Duplikate erzeugen.
- App beendet: wĂ€hrend des Sendens erzwingen, dass die App geschlossen wird, wieder öffnen und prĂŒfen, ob die Warteschlange wiederhergestellt wird.
- UhrâAbweichung: GerĂ€tzeit ist falsch; prĂŒfen, ob Konflikterkennung trotzdem funktioniert.
- Doppelte Taps: Nutzer drĂŒckt Speichern zweimal; prĂŒfen, ob es zu einer ServerâĂnderung wird.
Prototyp den kompletten Ablauf, bevor du die UI polierst. Baue einen Bildschirm, einen Datensatztyp und einen Konfliktfall (zwei Ănderungen am selben Feld). FĂŒge einen einfachen SyncâStatusbereich, einen RetryâButton fĂŒr Fehler und eine klare Konfliktseite hinzu. Wenn das funktioniert, wiederhole es fĂŒr weitere Bildschirme.
Wenn du ohne Code baust, kann AppMaster (appmaster.io) native Kotlinâ und SwiftUIâApps zusammen mit dem Backend generieren, sodass du dich auf Warteschlange, VersionsprĂŒfungen und nutzerseitige ZustĂ€nde konzentrieren kannst, statt alles von Hand zu verdrahten.


