Zum Hauptinhalt springen

Differential Updater ersetzen: Der Capacitor Guide

Erfahren Sie, wie Sie die differentialen Updater in Capacitor-Apps durch Capgo ersetzen. Ein schrittweiser Migrationsleitfaden, der code-Änderungen, CI und sichere Rollouts abdeckt.

Differential Updater ersetzen: Der Capacitor Guide

Freitagnachmittag, ein Produktions-Fix ist bereit, aber der live update-Mechanismus deiner Capacitor-App macht das Deployment zum Ratespiel. Ein Gerät meldet den neuen Bundle, ein anderes behält den älteren Asset-Satz bei, und der Rollback-Pfad verhält sich je nach Version unterschiedlich. Der Updater sah bei der Installation nach einer kleinen Integration aus. Ihn zu ersetzen, ist eher wie das Einrichten eines Differentials: Das alte Bauteil muss sauber entfernt, das neue muss zur Basis passen und jede Messung muss wiederholbar sein.

Dieser Vergleich ist wichtig, weil ein Update-System mehr ist als nur ein Download-Button. Es verfolgt Versionen, rekonstruiert Bundles, wendet native und JavaScript-Grenzen an und entscheidet, was passiert, wenn ein Paket unvollständig oder inkompatibel ist. Die praktische Frage ist nicht nur, wie man die differential delivery ersetzt. Sondern wie man den Updater ersetzt, ohne während der Migration einen zweiten Fehlermodus zu erzeugen.

Inhaltsverzeichnis

Wann ein neuer Updater nötig wird

Die erste Warnung kommt meist als operatives Rätsel. Ein Release besteht die lokalen Tests, der Server meldet einen erfolgreichen Upload, doch Support erhält weiterhin Meldungen, dass Nutzer einen veralteten Screen sehen. Das Engineering-Team vergleicht Bundle-Identifikatoren, Native-Build-Versionen, Channel-Zuweisungen und Device-Logs, um festzustellen, dass der Updater ein Paket akzeptiert hat, das gegen eine andere Basis gebaut wurde als die lokal gespeicherte.

Das erinnert an ein Differential mit falschem Getriebe. Die Teile scheinen kompatibel, aber die Baugruppe erzeugt unter Last Geräusche. In einer Capacitor-App äußert sich dieses Rauschen als inkonsistenter Asset-Zustand, fehlgeschlagene Extraktion, endlose Retries oder ein Rollback, der nur einen Teil des erwarteten Bundles wiederherstellt.

Ein nützlicher Diagnose-Durchlauf beginnt mit Symptomen statt Annahmen:

  • Versionskonflikt: Stellen Sie sicher, dass die installierte Native-Shell, das heruntergeladene Bundle und die Updater-Metadaten mit ihrem vorgesehenen Kompatibilitätsbereich übereinstimmen.
  • Unklarer Rollback: Testen Sie, ob ein fehlgeschlagenes Update das vollständige vorherige Bundle zurücksetzt oder veraltete Dateien zurücklässt.
  • Schwache Observability: Prüfen Sie, ob Sie das betroffene Gerät, die Paketversion, den Channel, die Fehlerstufe und den letzten erfolgreichen Start identifizieren können.
  • Unkontrolliertes Targeting: Achte darauf, dass Produktionsnutzer keine Artefakte erhalten, die für Beta-, Staging- oder kundenspezifische Streams bestimmt sind.
  • Ineffiziente Auslieferung: Messen Sie, ob das System ein vollständiges Archiv sendet, wenn nur wenige Web-Assets geändert wurden. Der Hintergrund dieses Design-Kompromisses wird in wie Delta-Updates die Payload-Größe reduzieren,.

Ein professioneller Kfz-Mechaniker untersucht mit einer Taschenlampe die Unterseite eines Fahrzeugs, um potenzielle Fahrwerkschäden zu diagnostizieren.

Diagnose vor der Wahl des Ersatzes

Behandeln Sie nicht jedes fehlgeschlagene Update als Beweis dafür, dass der Updater selbst defekt ist. Ein fehlerhaftes Build-Artefakt, eine falsche Channel-Regel, ein kaputtes Signierungsgeheimnis oder eine native Kompatibilitätsänderung kann dasselbe sichtbare Symptom verursachen. Erfassen Sie zuerst den Fehlerpfad, einschließlich der Paketidentität, der Basisversion, des Gerätezustands und ob die App nach dem Update erfolgreich gestartet wurde.

Ein Ersatz ist gerechtfertigt, wenn der Mechanismus keine zuverlässigen Antworten oder eine sichere Wiederherstellung liefern kann. Wenn Ihr Team nicht nachweisen kann, welche Geräte ein Bundle erhalten haben, ein fehlerhaftes Release nicht schnell ungültig machen kann oder nicht garantieren kann, dass bei einer fehlenden Basis auf ein vollständiges Paket zurückgegriffen wird, kann das Patchen der Konfiguration den nächsten Vorfall nur hinauszögern.

Das Engineering-Prinzip ist dasselbe wie bei einer Getriebebaugruppe: Bestätige die defekte Komponente, bevor du das Gehäuse entfernst. Eine vollständige Updater-Migration kostet upfront mehr, gibt dir aber ein sauberes Protokoll, explizite Versionsregeln und eine testbare Rollback-Grenze – statt noch eine Anpassung auf eine unsichere Installation zu stapeln.

Den alten Mechanismus sicher entfernen

Betrachte die Entfernung als kontrolliertes Isolationsverfahren. Das Ziel ist nicht, ein Package zu löschen und zu hoffen, dass der nächste Build zeigt, was übrig bleibt. Das Ziel ist zu verhindern, dass zwei Update-Mechanismen um dasselbe Web-Verzeichnis, denselben Startup-Hook, denselben Konfigurationsschlüssel oder denselben Delivery-Endpoint konkurrieren.

Friere zuerst den Migrations-Branch ein und halte das aktuelle Verhalten fest. Speichere die aktive Plugin-Version, die native Konfiguration, Umgebungsvariablen, CI-Commands, Channel-Namen und den Speicherort der heruntergeladenen Bundles. Dieses Inventar brauchst du, um beim ersten sauberen Build beabsichtigte Änderungen von versehentlichen Auslassungen zu unterscheiden.

Eine saubere Baseline schaffen

Erstelle einen Wegwerf-Branch oder eine Arbeitskopie und untersuche dann den Dependency-Tree sowie die Capacitor-Konfiguration. Identifiziere das Legacy-Updater-Package anhand seines tatsächlichen Package-Namens statt über eine generische Suche nach „update“. Prüfe package.jsonLockfiles, capacitor.config.ts, iOS-Projekteinstellungen, Android-Ressourcen und der Startup-code, der die Methoden download, sync, install oder rollback aufruft.

Entferne die Dependency mit dem Package Manager, den das Repository verwendet. Zum Beispiel mit npm:

npm uninstall <legacy-updater-package>
npx cap sync

Verwende das äquivalente Kommando für pnpm oder Yarn, falls das Projekt darauf standardisiert. Der Platzhalter ist absichtlich so gewählt. Ein Migrationsguide sollte keinen Paketnamen erfinden und ein destruktives Kommando gegen die falsche Abhängigkeit empfehlen.

Durchsuche anschließend das Repository nach der alten Plugin-Identifikation, API-Aufrufen, Endpunkt-Namen, Konfigurationsschlüsseln und Event-Listenern. Entferne veraltete Imports und Initialisierungs-code aus der Anwendungsschicht. Lösche auch tote Wrapper. Eine lokale Abstraktion, die einen entfernten Updater aufruft, macht das spätere Debugging deutlich schwieriger, da der Build erfolgreich sein kann, während das Startverhalten fehlschlägt.

Native Reste bereinigen

Öffne die iOS- und Android-Projekte nach der Entfernung der Abhängigkeit. Entferne native Referenzen, die der Paketmanager nicht bereinigt hat, einschließlich manuell hinzugefügter Pods, Gradle-Abhängigkeiten, Manifest-Einträge, Ressourcenwerte, URL-Schemes, Receiver-Deklarationen und Initialisierungshooks. Lösche Dateien nicht nur, weil ihre Namen ähnlich klingen. Stelle sicher, dass jede Datei ausschließlich zum Legacy-Updater gehört und dass keine gemeinsame Capacitor-Konfiguration von ihr abhängt.

Führe ein natives Dependency-Refresh durch und kompiliere beide Plattformen, bevor du den Ersatz installierst. So trennst du Bereinigungsfehler von Integrationsfehlern. Ein sauberer nativer Build beweist nicht, dass die Migration funktioniert, aber ein fehlerhafter sauberer Build beweist, dass der alte Mechanismus nicht vollständig neutralisiert wurde.

Dasselbe Disziplin gilt für Skripte. Entferne alte Upload-Jobs, Endpoint-Variablen, Signing-Schritte, Artifact-Kopierbefehle und Release-Benachrichtigungen aus der CI. Prüfe auch Pull-Request-Workflows sowie Produktions-Workflows. Ein vergessener Preview-Job kann ein inkompatibles Paket in einen Channel veröffentlichen, der harmlos aussieht, bis ein Tester es erhält.

Praktische Regel: Migriere niemals, indem du den alten Updater änderst und den neuen Updater im selben Commit hinzufügst. Mache die Entfernung beobachtbar, baue das Projekt und führe erst dann den Ersatz ein.

Bevor du weitermachst, installiere die bereinigte App auf einem Testgerät und stelle sicher, dass sie nicht mehr versucht, den alten Dienst zu kontaktieren. Lösche bei Bedarf die App-Daten, überprüfe die Start-Logs und bestätige, dass die App ihre gebündelten Web-Assets weiterhin normal lädt. Diese Basis ist deine Kontrollprobe für die nächste Stufe. Für einen breiteren Vergleich der Ansätze siehe CodePush-Alternativen für Capacitor, Ionic und Cordova.

Installation und Konfiguration der neuen Plattform

Ein Ersatz-Updater sollte als explizites Protokoll in ein Projekt einziehen, nicht als undurchsichtige Bibliothek. Definiere, was ein Bundle enthält, welche nativen Versionen es anwenden können, wie Channels auf Zielgruppen gemappt werden und was der Client tut, wenn seine gespeicherte Basis nicht verfügbar ist. Wenn diese Regeln vor der Installation nicht klar sind, wird die Migration einen Happy-Path-Test bestehen, bleibt aber in der Produktion unsicher.

Füge den Client bewusst hinzu

Installiere das neue Updater-Paket mit dem Paketmanager des Repositories und synchronisiere anschließend die nativen Projekte:

npm install <new-updater-package>
npx cap sync

Verwende den dokumentierten Paketnamen und die Konfigurationsschlüssel des Anbieters im eigentlichen Projekt. Halte die Abhängigkeitsänderung von Capacitor-Upgrades getrennt, damit ein fehlerhafter Native Build eine enge Ursache hat.

Initialisiere den Updater an einem vorhersehbaren Punkt beim App-Start. Er muss den aktuellen Native Build, den aktiven Channel, die lokale Web-Bundle-Version und die Server-Policy für Update-Checks kennen. Vermeide es, Update-Aufrufe über mehrere Screens zu streuen. Ein einzelner Service sollte Checks, Downloads, Verifikation, Installationsentscheidungen und Fehlerberichte verwalten.

Der Client muss zwischen einem JavaScript-Bundle-Update und einem Native-App-Update unterscheiden. Ein Web-Bundle kann kein Native-Plugin hinzufügen, Plattform-Berechtigungen ändern oder sicher davon ausgehen, dass eine neue Native Bridge existiert. Kodiere die Kompatibilität in den Release-Metadaten und lass den Updater Pakete außerhalb des unterstützten Native-Bereichs ablehnen.

Channels vor der Veröffentlichung erstellen

Richte separate Streams für interne Tests, Staging und Produktion ein. Ein Channel ist mehr als nur ein Label. Er ist ein Guardrail, das bestimmt, welche Zielgruppe ein Paket erhalten kann, und bietet einen kontrollierten Ort, um Start, Navigation, Authentifizierung, Offline-Verhalten und Native-Bridge-Aufrufe zu validieren.

Definiere den Promotion-Pfad schriftlich:

  1. Entwicklung wird lokal gebaut, ohne veröffentlicht zu werden.
  2. Intern erhält signierte Artefakte für Engineering- und QA-Geräte.
  3. Staging testet produktionsähnliche Dienste und Release-Konfiguration.
  4. Produktion akzeptiert nur ein Artefakt, das die vorherigen Prüfungen bestanden hat.

Halten Sie die Kanalzuweisung nach Möglichkeit außerhalb des App-Bundles, indem Sie verwaltete Umgebungskonfiguration statt fest codierter Testwerte verwenden. Ein Produktions-Build, der versehentlich auf einen Beta-Stream zeigt, ist ein Fehler im Release-Prozess, kein Nutzerfehler.

Die Bundle-Grenze schützen

Der Service sollte ein vollständiges, deterministisches Web-Bundle veröffentlichen, auch wenn die Transportoptimierung später nur geänderte Dateien überträgt. Erzeugen Sie das Artefakt aus einem sauberen Workspace, schließen Sie Source Maps oder Entwicklungsdateien aus, es sei denn, Sie haben einen bewussten Grund, sie auszuliefern, und halten Sie eine Inhaltsidentität für das resultierende Paket fest.

Verlangen Sie eine Integritätsprüfung vor der Installation. Der Client sollte die heruntergeladenen Daten validieren, das erwartete Verzeichnis rekonstruieren und atomar darauf umschalten. Wenn die Prüfung fehlschlägt, behalten Sie das aktuell funktionierende Bundle bei und melden Sie den Fehler mit ausreichend Kontext zur Diagnose.

Das umfassendere OTA-Modell, einschließlich sicherer Update-Zeitpunkte und nativer Einschränkungen, ist beschrieben in OTA-Updates durchführen.

Screenshot von https://capgo.app

Speichern Sie Konfiguration im Secret Manager der Plattform oder in geschützten CI-Variablen, nicht im Repository. Trennen Sie den Lesezugriff für Build-Jobs von administrativen Berechtigungen, die Releases löschen oder das Produktions-Targeting ändern können. Der Updater sollte außerdem einen Fallback auf das vollständige Paket bereitstellen. Wenn dem Gerät die erforderliche Basisversion fehlt, darf das System nicht versuchen, einen nicht verankerten Patch anzuwenden.

Build- und CI-Pipelines anpassen

Manuelles Publishing ist für Experimente akzeptabel, aber als Release-System gefährlich. Eine zuverlässige Pipeline wandelt eine Quellrevision in ein bekanntes Artefakt um, führt Checks gegen dieses Artefakt aus, signiert es, veröffentlicht es im vorgesehenen Channel und protokolliert das Ergebnis. Dieselbe Eingabe sollte dieselbe Release-Entscheidung liefern, egal ob der Job auf einem Entwickler-Workstation oder einem gehosteten Runner läuft.

Artefakt in einer sauberen Umgebung bauen

Beginnen Sie mit einer reproduzierbaren Sequenz. Installieren Sie gesperrte Abhängigkeiten, führen Sie Linting und Tests aus, bauen Sie die Web-Schicht und generieren Sie die Capacitor-Ausgabe aus den resultierenden Dateien. Berechnen Sie keine Differenzialdaten gegen das Arbeitsverzeichnis eines Entwicklers. Vergleichen Sie zwei unveränderliche, versionierte Bundles, die von der CI erstellt wurden.

Eine praktische Pipeline trennt die Verantwortlichkeiten:

  • Validierung: Führen Sie Unit-Tests, Typprüfungen, Linting und einen Produktions-Web-Build aus, bevor Sie etwas hochladen.
  • Kompatibilität: Stellen Sie sicher, dass die erforderlichen nativen Fähigkeiten des Bundles mit den Ziel-App-Builds übereinstimmen.
  • Packaging: Erstellen Sie ein deterministisches Archiv oder eine Dateimanifest-Liste und schließen Sie temporäre Dateien aus.
  • Signierung: Signiere das Release mit geschützten Credentials, die die CI-Umgebung bereitstellt.
  • Veröffentlichung: Sende das Artefakt an den Channel, der durch Branch, Tag oder Release-Freigabe ausgewählt wurde.
  • Verifizierung: Frage den Delivery-Service ab und stelle sicher, dass veröffentlichte Version, Checksumme und Channel übereinstimmen.

Eine sechsstufige Infografik, die den kontinuierlichen Verbesserungsprozess zur Optimierung von Software-Builds und CI-Pipelines illustriert.

Versionsidentität eindeutig machen

Verwende einen Release-Identifikator, der Quellrevision, native Kompatibilität und das veröffentlichte Bundle verknüpft. Verlasse dich beim Troubleshooting nicht auf veränderbare Labels wie „latest“. Der Updater muss die exakt installierte Version und die exakte Kandidatenversion melden, während das Release-System genug Historie vorhalten muss, um gezielt zurückzurollen oder erneut zu veröffentlichen.

Ein nützliches Manifest hält fest:

Feld Warum das wichtig ist
Bundle-Version Identifiziert die installierten und Kandidaten-Web-Assets
Native Kompatibilität Verhindert, dass ein Web-Bundle eine nicht verfügbare Bridge code annimmt
Kanal Definiert die beabsichtigte Zielgruppe
Basisversion Verankert die differentielle Rekonstruktion
Integritätswert Erkennt Beschädigung oder Manipulation
Release-Status Unterstützt Entscheidungen zu Promotion, Pause und Rollback

Die Basisversion ist besonders wichtig für die differentielle Auslieferung. RFC 3229 beschreibt das allgemeine Modell: Ein Client identifiziert seine gespeicherte Darstellung, fordert einen Differenzalgorithmus an und erhält eine Antwort, die die Änderung statt der vollständigen Ressource darstellt. Das anwendungsebene Äquivalent sollte nur dann einen Patch berechnen, wenn die bekannte Basis des Geräts gültig ist, und andernfalls das vollständige Bundle senden.

Publishing-Pfad absichern

Behandle den CI-Runner als privilegierte Release-Maschine. Beschränke, wer die Produktion veröffentlichen darf, halte Signaturmaterial aus den Logs heraus, rotiere Credentials über die Secret-Steuerung der Plattform und verhindere, dass unzuverlässige Pull Requests auf Release-Secrets zugreifen. Die DevArmor CI/CD Security Practices bieten nützlichen Kontext für die Härtung von Berechtigungen, Secrets und Pipeline-Grenzen.

Füge vor der Produktion einen Dry-Run- oder Staging-Publishing-Schritt hinzu. Teste das heruntergeladene Artefakt auf einem sauberen Simulator oder Gerät und prüfe dabei den ersten Start, Neustart, unterbrochenen Download, abgelehnte Signatur und Rollback-Verhalten. Halte den Release-Job möglichst idempotent. Das erneute Ausführen eines fehlgeschlagenen Jobs sollte keine mehrdeutige Sammlung von Paketen mit überlappenden Identifiern erzeugen.

Für ein konkretes Implementierungsmuster nutze die Capacitor CI/CD Pipeline Setup Guide. Das Ziel ist nicht nur, Uploads zu automatisieren. Es geht darum, jedes Release von der Source-Commit bis zum Gerätezustand auditierbar zu machen.

Rollout und Erfolgsmessung

Ein Rollout ist der Moment, in dem das Updater-Design unter Last getestet wird. Am ersten Tag trifft ein Paket, das im Staging sauber aussah, auf Geräte mit älteren Basisversionen, unterbrochenen Downloads, wenig Speicherplatz und App-Versionen, die eure QA-Matrix nicht abdeckt. Behandelt prozentbasiertes Targeting wie einen Regler; der eigentliche Sicherheitsmechanismus ist die Fähigkeit, die Promotion zu stoppen und Nutzer zu einem bekannt guten Bundle zurückzubringen. Rollt genauso aus, wie ihr ein neues Differentialgetriebe einbauen würdet: erst kontrollierte Einbauprüfung, auf Probleme achten, und erst dann aufdrehen, wenn der Zahneingriff nachweislich stabil ist.

Den gesamten Update-Pfad beobachten

Beobachtet den gesamten Pfad, nicht nur den Transfer. Geräte können jedes Byte herunterladen und trotzdem bei der Signaturverifizierung, Extraktion, Aktivierung oder beim ersten Start nach dem Swap scheitern. Protokolliert jede Stufe mit der Bundle-Version, der nativen App-Version, dem Channel, der Plattform, einer datenschutzfreundlichen Geräte-ID und einer Fehlerkategorie, auf die das Team reagieren kann.

Die minimalen Signale sollten einige operative Fragen beantworten:

  • Hat das Gerät den Kandidaten entdeckt?
  • Hat es das vollständige Bundle oder einen Differential-Patch erhalten?
  • Hat die Integritätsprüfung bestanden?
  • Wurde die Aktivierung abgeschlossen?
  • Startete die App danach erfolgreich?
  • Blieb der Client in seiner nächsten normalen Sitzung gesund?

Diese Ereignisfolge gibt verschiedenen Teams, was sie brauchen. Support benötigt eine Timeline pro Gerät, um zu erklären, was auf einem bestimmten Telefon passiert ist. Release-Owner benötigen Trends zu Adoption, Fehlern und Rollbacks über die gesamte Flotte. Ein praktisches Modell für Tracking des OTA-Update-Erfolgs in Capacitor-Apps lässt sich sauber auf diese Phasen abbilden und vereinfacht das Dashboard-Design erheblich.

Eine professionelle Infografik, die einen zweistufigen Prozess zum Rollout neuer Projekte und zur Überwachung des anschließenden Erfolgs zeigt.

Rollback als Release-Feature nutzen

Definiere Rollback-Bedingungen vor dem Publish. Gute Trigger sind steigende Launch-Fehler, wiederholte Integrity-Errors, eine wachsende Anzahl an Geräten, die beim Candidate feststecken, oder Crash-Muster, die nur auf einer Plattform auftreten. Behalte das letzte funktionierende Bundle auf dem Gerät und stelle sicher, dass der Switch ohne App Store Release reversibel ist.

Ein Rollback erfordert zudem, dass Belege aufbewahrt werden. Behalte die Metadaten und Logs des fehlgeschlagenen Pakets, damit das Team das Problem reproduzieren, den betroffenen Kompatibilitätsbereich identifizieren und entscheiden kann, ob das vorherige Assignment wiederhergestellt oder ein korrigiertes Artefakt ausgeliefert werden soll. Ein Rollback, der zwar das Symptom für User behebt, aber die Spuren verwischt, führt meist dazu, dass derselbe Fehler im nächsten Release wieder auftritt.

Das Transportmodell hinter der Differential Delivery gibt es schon lange. HTTP Delta Encoding wurde durch RFC 3229 zu einem offiziellen Webstandard, veröffentlicht von der Internet Engineering Task Force im Januar 2002,, und die RFC-3229-Spezifikation ist aus einem praktischen Grund immer noch nützlich. Ein Delta hilft nur, wenn der Client eine gültige Basisversion hat und die Rekonstruktion des Ergebnisses weniger kostet, als die gesamte Ressource zu senden.

Deshalb funktionieren App-aware Updater meist besser als sich auf generisches HTTP-Delta-Verhalten zu verlassen. Der Service kennt das Base Bundle, der Client kann die rekonstruierte Ausgabe verifizieren, und der Updater kann auf ein vollständiges Paket zurückfallen, wenn es nicht passt. Die Engineering-Entscheidung ist, ob das Delivery-Protokoll Kompatibilität, Integrität, Rollback und Observability explizit macht – und die Antwort entscheidet, ob Differential Delivery überhaupt hilft.

Live-Updates für Capacitor-Apps

Wenn ein Bug im Web-Layer live ist, liefere den Fix über Capgo aus, statt Tage auf die App-Store-Freigabe zu warten. Nutzer bekommen das Update im Hintergrund, während native Änderungen im normalen Review-Prozess bleiben.

Neues aus unserem Blog

Capgo gibt dir die besten Insights, um eine wirklich professionelle Mobile App zu erstellen.