ブラウザプッシュを実装してみた際のメモ書き

2017/09/15   #web push  #Java 
このエントリーをはてなブックマークに追加

本当にメモ書きなので具体的にどう実装するとか書いてませんすいません。

Service Worker

  • ブラウザのページのライフサイクルとは別のライフサイクルでスクリプトが動き続ける
    • ページのタブを閉じてもブラウザを終了するまで動き続ける
  • ペイロード(プッシュ通知に伝える任意の内容)をプッシュするには暗号化が必要
    • 暗号化していない場合はプッシュ通知はできるが任意の内容を送れない ので、通知をうけた後にサーバーに通知内容を取りに行って通知を出すといったことが必要となる
  • endpoint
    • Chrome は https://android.googleapis.com/gcm/send/d4bju1Eaj0U:APA...3lY みたいな形
    • Firefox は https://updates.push.services.mozilla.com/wpush/v1/gAAAAABZ...bw8 みたいな形

参考

調べた感じ、ペイロードの暗号化を含めて自前でやるのはツラそうだったので webpush-java を使うことにした。

ハマったこと

Service Worker が反応しない

Service Worker の js は配置パス以下の階層にのみ適用される。 ので、/sw/xxx.js とかいうふうに sw ディレクトリをきって整理していると /sw でない普通のページに対して反応しなくなる。

ServiceWorker のスコープとページコントロールについて - Qiita

navigator.serviceWorker.register("/sw.js", {scope: "/scope/"}) というふうに scope を指定すれば配置パスに関わらず適用パスを決められる。たぶん。

2回目以降の通知がこない

showNotification の部分を以下のようにしていた。

  event.waitUntil(
    self.registration.showNotification(title, {
      body: body,
      icon: '/assets/img/ogp.png',
      tag: "hogehoge"
    })
  );

tag: "hogehoge" を設定していると、同じ tag は同じ通知とみなされ、2回目以降 UI に表示されないみたい。

service worker - Multiple Chrome push notifications automatically closes except the last one - Stack Overflow

を参照すると、解決策は tagを設定しないこと らしい。 そうすると push する度に UI に通知された。