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()
だけで済むのでラクです。