2015-05-15 31 views
8

Ho il problema che dopo aver registrato il serviceWorker il navigator.serviceWorker.controller è sempre nullo. Non faccio mai una ricarica forzata e aggiorno semplicemente la pagina. Lo collaudo con Google Chrome 42.0.2311.152 m (32 bit).navigator.serviceWorker.controller è sempre nullo

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

Secondo questo:

Il controllore proprietà di sola lettura dell'interfaccia ServiceWorkerContainer restituisce un oggetto ServiceWorker se il suo stato è attivato (lo stesso oggetto restituito da ServiceWorkerRegistration.active). Questa proprietà restituisce null se la richiesta è un aggiornamento forzato (Maiusc + Aggiorna) o se non è presente un lavoratore attivo. (Fonte: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller)

navigator.serviceWorker.controller dovrebbe restituire lo stesso oggetto come serviceWorkerRegistration.active. Ma con .active ottengo il lavoratore attivo, con .controller no.

Avete qualche idea per quella situazione?

Grazie, Andi

risposta

8

La prima cosa che vorrei guardare quando il debug questo è se la pagina corrente siete sulla rientra nell'ambito di applicazione del lavoratore servizio. Se la tua pagina corrente non è sotto l'ambito, allora non sarà controllata (ma il lavoratore di servizio che hai registrato può ancora essere considerato attivo).

Si sta chiamando register(SERVICE_WORKER_URL) che, per impostazione predefinita, utilizzerà la directory che contiene lo script di lavoro del servizio come ambito. Normalmente è ciò che vorresti, ma devi assicurarti che lo SERVICE_WORKER_URL faccia riferimento a uno script che si trova nella radice del tuo sito web. In questo modo, sarà in grado di controllare le pagine allo stesso livello di root o le pagine nelle directory sotto la tua web root. Quindi, se il tuo file JavaScript di servizio è attualmente sotto una sottodirectory /scripts/ o qualcosa del genere, spostalo alla radice.

È possibile controllare l'ambito corrente del proprio operatore visitando chrome://serviceworker-internals/ e visualizzando l'ambito associato alla registrazione.

+0

questo è un errore epico, credo che dovrebbe essere meglio documentato - almeno un messaggio di errore chiaro sarebbe bello. Grazie! – shabunc

+0

@shabunc ha risolto il problema, ottengo null nel controller. –

1

navigator.serviceWorker.register registra solo il servitore di lavoro e lo attiva. ma per avere un controllore sul servicestore è necessario mettere il proprio operatore di servizio nella cartella radice pubblica in modo che tutte le pagine siano incluse nell'ambito e il lavoratore del servizio sia collegato ad esso.

Problemi correlati