Eine Electron-App ist keine Webseite, auch wenn sie aus einer gebaut ist, es gibt hier also kein Skript-Tag: es gibt ein Paket und einen Aufruf je Prozess. Siehe eine App messen dazu, was Sie damit bekommen. Das Skomi-Electron-Paket hängt von nichts außer Electron selbst ab.
Der Quelltext und eine Demo-App, die sich selbst meldet, liegen unter skomi-sdk-electron.
Drei Prozesse, drei Zeilen
// main.js — einmal starten
const skomi = require('@skomi/electron').init({
appId: 'your-app-id',
});
skomi.screen('launch');
// preload.js — dem Fenster zugänglich machen
require('@skomi/electron/preload');
// renderer — dort, wo Ihr Routing liegt
window.skomi.screen('checkout/review', { tier: 'gold' });
Das ist die gesamte Einbindung. Die App-ID kommt aus My Apps in Skomi. Sie ist kein Geheimnis und gehört in Ihren Quelltext: sie kennzeichnet eine App, statt eine zu authentifizieren, genau wie eine Website-ID.
⚠ Greifen Sie in Ihrem Renderer nicht zum Web-Snippet. Es misst eine Website: Es will einen Hostnamen, ein Dokument zum Beobachten und ein Netz, auf das es sich verlassen kann, und ein Electron-Fenster hat nichts davon so, wie es das erwartet. Das SDK gibt es, weil die Probleme einer Desktop-App andere sind.
Benennen Sie Ihre Bildschirme
Es gibt keine automatische Erfassung, und das ist Absicht: Ein Routenpfad ist das, was Ihr Code einen Bildschirm nennt, nicht das, was Sie in einem Bericht so nennen würden. Bis zu 20 Eigenschaften je Bildschirm: Zeichenketten, Zahlen oder Wahrheitswerte.
Was das SDK übernimmt, das Sie sonst schreiben müssten
Es funktioniert offline. Bildschirme werden im eigenen Datenverzeichnis der App auf der Platte zwischengespeichert und überstehen Beenden, Abstürze und vierzehn Tage ohne Netz. Eine Desktop-App, die nur online meldete, verlöre genau die Sitzungen, auf die es ankommt.
Es zählt nicht doppelt. Jeder Bildschirm trägt eine einmal vergebene und unverändert erneut gesendete Kennung, ein wiederholter Stapel wird also erkannt statt noch einmal gezählt. Eine Offline-Warteschlange ohne das macht aus dem, was Ihre Daten rettet, das, was sie erfindet.
Es übersteht eine falsche Uhr. Jeder Stapel hält fest, wann er abgeschickt wurde, der Server kann also ausrechnen, wie weit die Uhr der Maschine daneben liegt, und den Stapel korrigieren. Ein auf nächsten Dienstag gestellter Laptop meldet sonst nächsten Dienstag.
Es wirft nie in Ihren Code. Falsche Argumente, ein unerreichbarer Server, ein nicht beschreibbares Profilverzeichnis, alles intern behandelt und über onError gemeldet, wenn Sie es wissen wollen. Analytics ist das Unwichtigste, was Ihre Anwendung tut.
Auf die Einwilligung warten
const skomi = require('@skomi/electron').init({ appId: '…', enabled: false });
// später, sobald der Nutzer zugestimmt hat
skomi.setEnabled(true);
Solange es abgeschaltet ist, wird nichts erfasst, auch nicht für später zwischengespeichert. Ein Bildschirm, der angesehen wurde, bevor jemand zustimmte, ist keiner, den Sie danach senden sollten.
Fehler und Abstürze
skomi.captureError(err, { screenName: 'checkout', fatal: false });
Zwischengespeichert, dauerhaft abgelegt und wiederholt wie ein Bildschirm, und nach derselben Regel entdoppelt, was hier mehr zählt, denn ein Absturz wird meist beim nächsten Start aus der Warteschlange gesendet.
⚠ captureUncaught ist standardmäßig aus, und überlegen Sie, bevor Sie es einschalten. Einen Listener an uncaughtException zu hängen ist das, was Node am Beenden hindert, ein standardmäßig installierter Absturzmelder machte aus einem tödlichen Absturz also einen Prozess, der auf beschädigtem Zustand weiterläuft. Mit eingeschaltetem Kennzeichen ist die Bedeutung wiederhergestellt: Der Bericht wird synchron auf die Platte geschrieben, der Listener wird entfernt, und der Fehler wird erneut geworfen.
Optionen
init({
appId: '…', // erforderlich
appVersion: app.getVersion(), // Voreinstellung: bei Electron erfragt
origin: 'https://t.skomi.com', // Überschreibung für Selbstbetrieb
enabled: true, // false starten, nach Einwilligung einschalten
flushIntervalMs: 10000,
onError(error, context) { }, // 'screen' | 'flush' | 'transport' | 'rejected' | 'queue'
});
init verdrahtet den Renderer-Kanal und schreibt beim Beenden weg. Wenn Sie einen Client wollen, dessen Lebensdauer Ihnen gehört (kein IPC, kein Beenden-Haken), nehmen Sie stattdessen createClient.
Was eine App nicht bekommt
⚠ Nur Analytics liest eine App. Heatmaps, Sitzungsaufzeichnungen und das Feedback-Widget sind Website-Produkte: Sie brauchen eine Seite in einem Browser, und in einem Desktop-Fenster gibt es nichts, woran sie sich hängen könnten. Eine App meldet Bildschirme, Sitzungen, Versionen, Plattformen und Fehler, und das ist alles.
Siehe eine App messen dazu, was das Dashboard damit macht, und Installation in MAUI oder Flutter, wenn Sie dasselbe Produkt auch dort ausliefern.