2015-05-15 10 views
8

Ich habe das Problem, dass nach der Registrierung der ServiceWorker der navigator.serviceWorker.controller immer Null ist. Ich erzwinge nie eine Aktualisierung und aktualisiere die Seite. Ich teste es mit Google Chrome 42.0.2311.152 m (32-Bit).navigator.serviceWorker.controller ist immer Null

var currentServiceWorker = null; 
navigator.serviceWorker.register(SERVICE_WORKER_URL).then(function(serviceWorkerRegistration { 
    if (navigator.serviceWorker.controller) { 
    currentServiceWorker = navigator.serviceWorker.controller; 
    } else { 
    currentServiceWorker = serviceWorkerRegistration.active; 
    } 
}); 

Dies Nach:

Die Controller schreibgeschützte Eigenschaft der ServiceWorkerContainer Schnittstelle liefert ein Serviceworker Objekt, wenn sein Zustand (das gleiche Objekt zurückgegeben durch ServiceWorkerRegistration.active) aktiviert wird. Diese Eigenschaft gibt null zurück, wenn es sich bei der Anforderung um eine erzwungene Aktualisierung handelt (Umschalt + Aktualisierung) oder wenn kein aktiver Worker vorhanden ist. (Quelle: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller)

navigator.serviceWorker.controller sollte das gleiche Objekt wie serviceWorkerRegistration.active zurückzukehren. Aber mit .active bekomme ich den aktiven Worker, mit .controller nicht.

Haben Sie irgendwelche Ideen für diese Situation?

Danke, Andi

Antwort

8

Das erste, was ich so aussehen würde, ob die aktuelle Seite an, wenn das Debuggen ist, dass Sie auf fällt unter den Umfang der Servicemitarbeiter sind. Wenn Ihre aktuelle Seite nicht im Bereich ist, wird sie nicht kontrolliert (aber der Service-Mitarbeiter, den Sie registriert haben, kann weiterhin als aktiv betrachtet werden).

Sie rufen register(SERVICE_WORKER_URL) an, die standardmäßig das Verzeichnis verwenden, das Ihr Service Worker-Skript als Bereich enthält. Das ist normalerweise das, was Sie wollen, aber Sie müssen sicherstellen, dass sich auf ein Skript bezieht, das sich im Stammverzeichnis Ihrer Website befindet. Auf diese Weise wird es möglich sein, Seiten auf derselben Root-Ebene oder auf Seiten in Verzeichnissen unter Ihrem Webstamm zu steuern. Wenn sich Ihre JavaScript-Datei für den Service-Mitarbeiter derzeit in einem /scripts/ -Unterverzeichnis oder ähnlichem befindet, verschieben Sie sie in den Stammordner.

Sie können den aktuellen Umfang Ihres Service-Mitarbeiters überprüfen, indem Sie chrome://serviceworker-internals/ besuchen und sehen, welcher Umfang mit Ihrer Registrierung verbunden ist.

+0

Dies ist eine epische Fallstricke, ich glaube, es sollte besser dokumentiert werden - zumindest einige klare Fehlermeldung wäre nett. Vielen Dank! – shabunc

+0

@shabunc hat das Problem gelöst, ich bekomme null im Controller. –

1

navigator.serviceWorker.register registrieren Sie den Serviceworker nur und aktivieren Sie ihn. Um jedoch den Controller über den Service-Mitarbeiter zu bringen, müssen Sie Ihren Service-Mitarbeiter in den öffentlichen Stammordner versetzen, so dass alle Seiten im Bereich enthalten sind und der Service-Mitarbeiter damit verbunden ist.