Help us understand the problem. What is going on with this article?

ブラウザ向けのWeb Pushをトライしてみた

More than 3 years have passed since last update.

概要

Web Pushをトライした時の情報を整理する目的です
ブラウザを立ち上げるとFacebookやGmailからプッシュ通知をよく目にすると思いますが、あれを実装します
基本的な仕組みは以下のエントリでわかりやすく解説されていますので、ご参照ください

ざっくりとした処理の流れ

  • プッシュ通知登録時
    ブラウザ(プッシュ通知許可) -> アプリケーションサーバ(ユーザのプッシュ通知キーを保存)

  • プッシュ通知する時
    アプリケーションサーバ(通知情報)-> Google Firebase Cloud Messaging(FCM) -> ブラウザ(通知内容の表示)

さっそくコード

以下の説明はこちらのサンプルコードで説明します
このコードはGoogleのウエブアプリへのプッシュ通知をベースに実装したものです

構成

  - static                 # クライアント
    - js
      - webpush.js         # プッシュ通知の購読是非などの処理
      - webpush-sw.js      # プッシュ通知を許可した際に、対象のブラウザに保存されるスクリプト
    - index.html           # プッシュ通知購読を求めるページ
    - success.html         # プッシュ通知を押下時に遷移するページ
  - subscriptions
    - subscription.json    # ユーザがプッシュ通知を許可した際に購読キーを保存する(ストレージとしての仮置き)
  - .env                   # 環境変数
  - app.js                 # Webアプリケーション(プッシュ通知を送る)
  - subscription.js        # プッシュ通知の購読キーを保存や取り出す処理

実行手順

  1. Googleのcompanion-siteで秘密鍵と公開鍵を生成する
    2.png

  2. 手順1で生成した公開鍵と秘密鍵を.envファイルに追加します

    APP_PUB_KEY=<public-key>
    APP_PRV_KEY=<private-key>
    
  3. 手順1で生成した公開鍵をwebpush.jsに追加します

    'use strict';
    
    const applicationServerPublicKey = '<public key>';
    
  4. nodejsライブラリのインストール

    > npm install
    
  5. サンプルアプリの起動

    > npm start
    
  6. プッシュ通知ページにアクセスし、「プッシュ通知を有効」を押下
    1.png
    *ブラウザがプッシュ通知に対応していない場合は「Push messaging is not supported」が表示されます

  7. プッシュ通知を許可した場合は、手順1で生成した公開鍵をもとに購読キーが生成されます
    許可した時点でsubscription.jsonにこの購読キーが保存されます
    あとは好きなタイミングでサーバサイドでその購読キーを用いてユーザにプッシュ通知を送ることができます
    今回はユーザの識別子としてuseridという文字列を用いていますが、システムに応じて一意のユーザ識別子で保存してください

    また、それと同時にwebpush-sw.jsがブラウザのserviceworkerに登録されます
    chromeのアドレスバーにchrome://serviceworker-internalsを入力することで確認できます
    *webpush-sw.jsを更新した場合は、手動で登録済みのserviceworkerを削除するか、更新する処理を追加してください!

    3.png

  8. 「Push Nortification」ボタンを押して、プッシュ通知を送る
    今回はクライアント側にトリガーを置きましたが、システムに応じてサーバ側から送信してください

  9. プッシュ通知が表示され、クリックするとsuccess.htmlに遷移します

    4.png

ハマったところ

前述でも書きましたが、webpush-sw.jsを更新したのに反映されないところで少々ハマりました。
それ以外はGoogle公式のチュートリアルで一通り試したので問題なく実装できました

comefigo
自社クラウドサービスの開発・運用をやっています。 ここには日々のアウトプットを残したいと思います。 [Katacoda](https://www.katacoda.com/comefigo7)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away