Service Worker in PWA

isaack

Mitglied
Hallo,

ich bin gerade dabei, meine erste PWA zu erstellen und teste viel herum. Hierbei handelt es sich um eine Fahrerapp für meinen Chef.
Nun bin ich an einem Punkt, wo ich nicht wirklich weiter komme.
Es soll in der App, wenn sie im Hintergrund läuft, weiter den Standort und die aktuelle Geschwindigkeit gesendet werden.
Standort und Geschwindigkeit sind keine Probleme und auch das Senden der Daten an den Server ist erledigt.

Das große Problem ist der Service Worker.
Ich habe schon viele Beiträge im Internet gelesen, das es geht mit einem Service Worker die Daten auch weiterhin zu senden, auch wenn die App im hintergrund läuft.
Leider macht diese das nicht lange. Nach etwa 1 Minute hört sie auf, diese Daten zu senden und ich weis nicht warum.
Vielleicht kann mir von euch jemand ein Tip geben, warum das so ist.
Mein Service Worker ist auch nicht wirklich groß

Javascript:
document.addEventListener("DOMContentLoaded", function () {
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register('/js/sw.js', { scope: '/js/' }).then(function(reg) {
            console.log('Registrierung erfolgreich');
        }).catch(function(error) {
            console.log('Registrierung fehlgeschlagen mit ' + error);
        });
    };
});

die Funktion SaveSpeerd2F() steht in der Datei sw.js und enthält die Abfrage der Position und der aktuellen Geschwindigkeit und sendet diese dann per Jquery Ajax an den Server weiter, mit einem Zeitintervall von 5 Sekunden.
Wie bereits gesagt, sie hört halt nach etwa 1 Minute auf, Daten zu senden und ich weis nicht wirklich warum.
 
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
Wie ich das verstehe, ist das halt so.
Servicemitarbeiter haben bewusst eine sehr kurze Lebensdauer. Sie werden als Reaktion auf ein bestimmtes Ereignis ( install, activate, message, fetch, push, etc.) „geboren“ , erfüllen ihre Aufgabe und „sterben“ kurz darauf. Die Lebensdauer ist normalerweise lang genug, dass mehrere Ereignisse behandelt werden können (dh auf ein installfolgt ein activategefolgt von einem fetch), bevor der Arbeiter stirbt, aber er stirbt schließlich. Aus diesem Grund ist es sehr wichtig, sich nicht auf einen globalen Status in Ihren Skripten zu verlassen und alle Statusinformationen, die Sie benötigen, über IndexedDB oder die Cache Storage API zu booten, wenn Ihr Service Worker startet.

Du könntest sowas wie eine Dummy Datei nutzen, die du in ständig aufrufst. Dadurch soll SW weiterlaufen.
Die Antwort habe ich er Googelt und selber noch nicht getestet.
Klingt mir aber soweit logisch
 

basti1012

Erfahrenes Mitglied
Ich kann dir nur das sagen, was ich selbst ergoogelt, habe.
Ich habe mich mit SW noch nie so auseinandergesetzt.
Das werde ich aber als Nächstes machen.

Dummy Datei;
Erstellen eine Dummy Datei auf dem Server, z. B. hallo.txt
Datei auf dem SW zwischenspeichern.
Jetzt musst du nur die Datei aus der HTML Datei ständig aufrufen
Javascript:
setInterval(function(){
var request = new XMLHttpRequest();
request.open("GET","hallo.txt");
request.addEventListener('load', function(event) {
   if (request.status >= 200 && request.status < 300) {
      console.log(request.responseText);
   } else {
      console.warn(request.statusText, request.responseText);
   }
});
request.send();
},30000);

So soll der SW aktive bleiben.
 

isaack

Mitglied
hm, habe das jetzt mal ein wenig probiert und getestet.
allerdings verlängert sich dadurch nur die zeit um 2 MInuten.
also nicht wirklich das was benötigt wird :-(