6

Ich versuche einen Service-Arbeiter in Ruby On Rails registrieren, um eine Push-Benachrichtigung GCM zu implementieren. Aber nichts passiert. Bitte, siehe untenstehenden Code:Wie kann ich einen Service-Mitarbeiter in Ruby on Rails registrieren?

if ('serviceWorker' in navigator) { 
    navigator.serviceWorker.register('/assets/service-worker.js') 
    .then(initialiseState); 
    } else { 
    window.Demo.debug.log('Service workers aren\'t supported in this browser.'); 

Dieser Teil funktioniert gut. Aber wenn ich navigator.serviceWorker.ready.then(function(serviceWorkerRegistration) rufe, passiert nichts.

Ich suchte auf der Suchmaschine und es gibt einige Dinge, die mir helfen.

Kann mir jemand helfen?

+0

Sind Sie sicher, dass 'Serviceworker. bereit ist Teil der ServiceWorker API? Einen Verweis darauf finde ich nicht in der [docs] (https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API). – nicohvi

+0

@nicohvi Ich folge dem Tutorial von Google. Siehe in diesem Link [Push-Benachrichtigungen im offenen Web] (https://developers.google.com/web/updates/2015/03/push-notificatons-on-the-open-web) – Tercio

Antwort

2

Das Service-Worker-Skript service-worker.js muss in Ihrem Fall entweder vom URL-Pfad des gleichen Verzeichnisses wie die Seite, die es registriert, oder von einem Unterpfad bedient werden.

Sie verwenden den Pfad /assets/service-worker.js, es wird also fehlschlagen, wenn die Registrierungsseite nicht auch von /assets/ geliefert wird. Wenn Sie eine .catch(function(error) { console.warn(error); }) am Ende Ihres register() setzen (die eine Promise zurückkommt, würden Sie den Fehler sehen dort berichtet.

Die einfachste Sache zu tun ist, stellen Sie sicher, dass service-worker.js aus dem gleichen Verzeichnis wie die Webseite serviert und register('service-worker.js') dann nennen, die eine gleich Verzeichnis relativen Pfad verwendet.

+0

Jeff, passiert nichts mit dem Änderungen. Meine JS-Dateien befinden sich im selben Ordner. Sie schlagen mir vor, wie es mein Rails-Projekt strukturieren würde? – Tercio

+0

Welche URL verwenden Sie, um auf die Seite zuzugreifen, die gerade 'register ('/ assets/service-worker.js') aufruft? –

+0

Jeff, 'localhost: 3000/users/edit'. In dieser Ansicht gibt es einen Code JS, der den Service Worker registriert. – Tercio

2

Schauen Sie sich die serviceworker-rails gem.

Wie Jeff erwähnt, auf dem der Weg der Dienstarbeiter „in scope“ sein muss. Dieses Juwel erlaubt Sie können Service-Worker-Anforderungen im Stammverzeichnis (oder einem anderen Pfad) an eine Ressource in der Rails-Asset-Pipe übertragen Linie.

Zum Beispiel, wenn Ihr Serviceworker Skript Eintrittspunkt in app/assets/javascripts/nested/directory/serviceworker.js in Ihrem Rails-Projekt ist, können Sie Ihre Anwendung so konfigurieren, das Skript von /serviceworker.js mit einigen einfachen Konfigurationseinstellungen zu machen:

# config/application.rb 
config.serviceworker.routes.draw do 
    match "/serviceworker.js" => "nested/directory/serviceworker.js" 
end