JHipsterでService WorkerでWeb Pushを、 と思っていて、Angularだから、 前やったように app.modules.ts
でServiceWorkerModule.register('./service-worker.js',...);
してから@angular/service-worker
でSwPush
をinjectして、 って思ってたんですが、違うんですね。 JHipsterではworkboxでService Worker使うようになってるんですね予め。 確かにindex.html
でservice-worker.js
を有効にして挙動を見てると、 cachingは綺麗に行っている様子です。 えーでも調べてみると、workboxってWeb Pushはないじゃーないですかー。
特に私の知っている範囲ではworkboxはプッシュ通知のロジックを作ってくれないので、そこは自分で書いてやる必要があります。 ServiceWorkerを簡単に書けるworkbox-swの使い方
しかも、自分のcodeとmergeする、 即ちworkboxPlugin(...)
にswSrc:
を追加すると、 generateSW
が使えず自分で書かないといけないの!? ですか? いやー、jhipsterで生成されるservice-worker.js
とか見ると、 色んなfilesにhash値?が付与されているから、 これを自分で作るというのはあり得ないでしょー。 どーしたらいーのー?!
と、途方に暮れました。
workboxを捨ててAngularのSwPushにする? いやー、でもjhipsterでのbuildではng
実行されないので、 いくら.angular-cli.json
に"serviceWorker": true
と書いても効かないんですよー。 Angularのservice workerは生成されないわけですね。
jhipsterで生成されたbuild/www/service-worker.js
を見ていると、 上部のコメントに、
1 2 3 4 |
|
とあります。言われるままにそのURLを見てみると、 importScripts
というoptionがあることがわかりました。 これを指定するとどうなるのかなー、試してみます。 指定する場所は、webpackでworkboxのservice worker生成をやっているので、 webpack/webpack.prod.js
になります。 それの最下段、new WorkboxPlugin.GenerateSW({...})
の中に importScripts: ['push-notifications.js']
と書いてみると、 自動生成されたbuild/www/service-worker.js
中に、 importScripts("push-notifications.js",...)
と出ます。 なるほど。 ではこのpush-notifications.js
というのを作ってwww root folderに置き、 そこにpush notificationのlogicを書いておけばいいんじゃーん。 でも、基本的には全てのfile名はhash化?されてしまいます。 どうやって名前をhash化されないようにするの?! favicon.ico
等の例から手探りで探し当てました。 webpack/webpack.common.js
のnew CopyWebpackPlugin([..])
に 書いておけばいーんですね。なるほど。
結局要するにworkboxのimportScripts
を使うということで、具体的には、
src/main/webapp/push-notification.js
にWeb Push通知時の処理addEventListener('push', function(event) {...});
と通知をclickした時の処理addEventListener('notificationclick', function(event) {...});
を書いておくwebpack/webpack.prod.js
のnew WorkboxPlugin.GenerateSW({...})
にimportScripts: ['push-notifications.js']
を書くwebpack/webpack.common.js
のnew CopyWebpackPlugin([..])
に{ from: './src/main/webapp/push-notifications.js', to: 'push-notifications.js' },
を書く
で目出度くJHipster application上でのWeb Push通知が出来ました。
尚、通知の許可を求める処理やendpoint、auth、publicKeyを求める処理では、 AngularのSwPush
を使うことが出来ます。 JavaScriptでゴリゴリ書かなくてもthis.swPush.requestSubscription()
だけで済むのでラクです。