ウェブプッシュくん サンプル

TESTページ

このページはウェブプッシュくん のサンプルページです。
このページを参考に、ウェブプッシュくん を導入して下さい。

最新情報は ドキュベース⧉ をご確認下さい。

reCaptcha のマークを非表示に

ウェブプッシュくん では不正防止に reCaptcha を導入しています。 (※別途管理画面でkeyの追加が必要)
この右下の邪魔なマークは以下の手順で非表示にする事が出来ます。

  1. 以下のテキストをページ内に掲載する
    This site is protected by reCAPTCHA and the Google
       <a href="https://policies.google.com/privacy">Privacy Policy</a> and
       <a href="https://policies.google.com/terms">Terms of Service</a> apply.
  2. CSSで非表示にする
    .grecaptcha-badge { display: none }

WebPushについて

WebPush通知の簡単な説明

WebPush通知は、簡単にいうと暗号化された Tokenをブラウザ毎に保持させ、 その Tokenに対してメッセージをPush送信する技術です。

受信者のメリット
メールアドレスの登録・会員登録などの面倒な手続き無しで、 そのサイトから必要な情報を簡単に受け取る事ができます。
また、メーリングリストなどの場合は登録解除するのにもいちいち手間ですが、 Push通知の場合はブラウザ上でポチッと簡単に登録解除ができるのもメリットです。

さらに、Tokenをブラウザで保持しているだけなので、 プライバシーに関しても匿名性が高く安全と言えます。

こんなメリット満載の WebPush通知は今のところ普及しているとは言えませんが、 今まで利用出来なかった iOSで利用可能になったため今後爆発的に普及する可能性があります。

とは言え、導入までには多少のハードルがあるのも事実ですので、 研究・調査し早めに導入することで先行者利益を得ることができると思われます。

iOSは PWA(ホーム画面に追加)が必要

iOSバージョン 16.3以下は WebPush通知機能が使えません。 また、バージョンが16.4以上であっても PWAインストール(ホーム画面に追加) しなければ通知を受け取る事が出来ません。
そのため、PCや androidなどのその他のプラットフォームより、通知受け取りまでの手順が少し多く複雑になります。

このことはデメリットではなく 「スマホのホーム画面という一等地を先行者優位で早くゲットできる」と メリットとして捉えることも出来ます。

配信者界隈では「チャンネル登録お願いします」が決まり文句みたいになってますが、 Web界隈では今後「ホーム画面に追加お願いします」がウザいほど目につくようになるでしょう。

通知のサブスクのさせ方

WebPush通知がそれほど普及していない理由として、iOSが対応していなかった事と、 すでに導入しているブログなどで 突然ダイアログで許可を求められる 事が考えられます。

検索でたどり着いていきなりダイアログで許可を求められたら、反射的に「キャンセル」や「拒否」をしてしまうものです。

この事が原因かわかりませんが、現在では設定で デフォルトで拒否 にすることが出来るようになってます。
chromeなら「プライバシーとセキュリティ > サイトの設定 > 通知」から 「サイトに通知の送信を許可しない」を選択することで、デフォルトで拒否することが出来ます。


以上のことから、いきなりダイアログを開かずに、 受信者のメリットを説明して、 通知の購読(サブスク)を促進する事が逆に近道であると言えるでしょう。

購読(サブスク)の促進方法

前述の受信者のメリットの説明を、 ページ内に掲載するのか、モーダルで開くのか、専用ページを作って読ますのかは、 サイトのデザインや方向性などによって変わってくると思いますので、 それぞれご検討頂ければと思います。

また、iOSは PWAインストール(ホーム画面に追加)する必要があるなど、 プラットフォームにより表示する説明も変わってきますので、 このページ及び ./webpush_samplete/webpushSamplete.js を 参考にコーディングして頂ければ幸いです。

まだまだ発展途上

通知メッセージには iconimage を設定可能ですが、 2023/09/20 現在 image は実験的機能🔗 になっており、 プラットフォームによって対応がまちまちです。

例えば、iOS SE2 では、icon,image を指定しても通知には表示されずアプリアイコン(manifest.json で指定した icon)のみ表示されます。
一方 chrome は、androidでは icon,image 両方表示されるけど PCでは icon のみの表示になります。

以上のことから、しばらくは「画像系」はおまけと考えて、 「タイトル」と「本文」で注意を引き、 クリック遷移link先でアピールすることになると思います。


ウェブプッシュくん の初期設定

ウェブプッシュくん の導入

複雑な WebPush通知の導入を簡単にする ウェブプッシュくん を作りました。

必須ファイルを設置し IDなどを設定するだけで WebPushを導入することが出来ます。 (別途コーディングは必要)
以下ではその事前に準備について説明させて頂きます。

  1. manifest と 2サイズの icon を用意する
  2. serviceworker を用意する
  3. ウェブプッシュくん JS を使えるようにする
  4. ウェブプッシュくん SDK を使えるようにする
  5. サイト毎のデザインにあわせたコーディングで実装

1.manifestと 2サイズの icon を用意する

iOSには PWAインストールが必須と説明しましたが、 WebPush機能は PWAの機能の一つで、 PCや androidでも裏では PWAとして振る舞っている。はず。多分。

なので、このサイトは PWAだよ!と宣言する必要があります。
その宣言は /manifest.json に必要情報を記載することで出来ます。
↓サンプル

{
    "name": "ちょっと長めのサイトの名前",
    "short_name": "短いサイト名",
    "display": "standalone",
    "scope": "/",
    "start_url": "/",
    "gcm_sender_id": "103953800507",
    "icons":[
        {
            "src": "webpush_sample/icon_192.png",
            "sizes": "192x192"
        },
        {
            "src": "webpush_sample/icon_512.png",
            "sizes": "512x512"
        }
    ]
}
この中の icons がホーム画面に追加した際の「アプリアイコン」になります。
一般的には色々なサイズの icon を用意しますが、 最低限「192x192」「512x512」のサイズ(ピクセル)のアイコンがあれば良いらしいので、 こちらの2サイズはご用意下さい。

iconを作成し配置(どこでも好きな場所でOK)したら src を配置した場所に書き換えて下さい。

※この manifest.json は ドキュメントルート に配置しなければなりません。

2.serviceworker を用意する

serviceworker とは、通常のWebサイトとは別の領域で動作する Javascritベースのスクリプトで、 これがあることでサイトを開いていないバックグラウンドの状態でも通知を受信することが出来るようになります。

この serviceworker は firebase-messaging-sw.js という名前のファイルで、 現在開いているサンプルページ index.html と一緒に入っていたと思います。
それをそのままご利用下さい。

3.ウェブプッシュくん JS を使えるようにする

ウェブプッシュくん JS は「通知の購読」「通知の解除」「フォアグラウンドでの通知の受信」などの処理に使います。
また、iOSの判定などプラットフォームの識別もすることが出来ます。

ウェブプッシュくん JS の導入は ./webpush_sample/webpushSample.js 内の 上部にある import { WebPushKun } from "https://webpush.wingit.lol/webpushkun/js?id=randomstring"; で出来ます。

webpushSample.js を参考に、既存の JSに組み込んでも良し、webpush用に新たに JSファイルを作成しても良し ですので、状況に合わせて調整して下さい。

★ポイント
ウェブプッシュくん JS を import するには、 今までの type="text/javascript" ではダメで、 以下のように type="module" である必要があります。
<script type="module" src="./webpush_sample/webpushSample.js"></script>

4.ウェブプッシュくん SDK を使えるようにする

ウェブプッシュくん では「バックエンド」はPHPを使って、 別のサーバで一元管理するようになっています。
その別のサーバとやり取りするためのPHPが ./webpush/ に格納されています。

その中の ./webpush/index.php を開いて、 このサンプルセットと一緒に受け取った clientID と clientSecret を当該の場所に書き込んで下さい。


  'oauth' => [
    'client_id'     => 'ここに clientId を書き込む',
    'client_secret' => 'ここに clientSecret を書き込む',
    ・・・・

5.サイト毎のデザインにあわせたコーディングで実装

最後に、「通知の勧誘メッセージ」「通知の解除」などのメッセージ領域の、 各サイト毎のデザインにあわせたコーディング(HTML,CSS,JS)をやれば完成です。
基本的な処理や構成はこのサンプル index.html./webpush_sample/webPushSample.js を参考にして頂ければと思います。

☆ コーディングのポイントは以下になります。

  1. メッセージ領域の種類を把握する
    閲覧中のブラウザの WebPushステータスの状態によって表示する内容が変わってきますので、 この ステータスの種類 を把握することが重要になります。
    ステータスの種類は ★WebPush対応状況の「statusLists」を参照。

    1. WebPush通知が非対応
    2. まだ通知の購読(サブスク)してない
    3. 購読している
    4. ブラウザの通知機能をOFFにしてるか、このサイトの通知を拒否している
  2. どのようにメッセージ領域を表示するか。
    突然ダイアログで許可を求めるのは前述の通りやめた方が良い ので、 どうするか考える必要があります。

    例)ベルなどプッシュ通知っぽいアイコンを position: fixed; で配置し、 クリックしたら勧誘メッセージと許可ボタンを表示する。
  3. どこにメッセージ領域を配置するか。
    仮に、訪問ユーザーの現在のブラウザがWebPush非対応であっても、 別の所有端末では WebPushに対応しているかもしれない。

    なので、WebPush通知サービスを行っていることを常に表示させておくことで、 より登録者数を増やす事が出来るようになると思われる。

    そう考えた場合、ヘッダー、左右メニュー、フッター などに固定配置、常時表示しても面白い。 ただ、サイト毎にデザインやクライアントの要望などの制約があって出来ない場合もある。

    では、どうするか? を考えて下さい。


ウェブプッシュくん function の説明
ウェブプッシュくん は状況にあわせて自由に調整出来るように各種 function を用意しています。
これらを使い、自由な表現方法でPush通知のサブスクユーザーを獲得して下さい。
  • インスタンス
    ウェブプッシュくん を使えるようにします。
    const WebPushKunOps = {
        dir      : '/webpush', // WebPushシステムがあるDIR。
        debugMode: false,      // true にすると、ところどころで console に情報が表示される
    };
    window.WebPushKun = new WebPushKun(WebPushKunOps);
    
  • analyzeBrowser()
    アクセスしてきたユーザーのブラウザの WebPush対応状況を解析します。
    返り値 Promise
    let s;
    await window.WebPushKun.analyzeBrowser().then(function(r) {
        s = r;
    });
    console.log('First time status', s);
    
  • getStatusCode()
    ブラウザの WebPush対応状況を statusCode であらわします。
    statusCode 詳細は ★WebPush対応状況の「statusLists」を参照。
    返り値 number
    const statusCode = window.WebPushKun.getStatusCode();
    if (statusCode === 200) {
        alert('すでに購読済みです😄');
    } else if (statusCode === 404) {
        alert('非対応ブラウザです💀');
    }
    
  • getStatusSlug()
    ブラウザの WebPush対応状況を statusSlug であらわします。
    slug 詳細は ★WebPush対応状況の「statusLists」を参照。

    例えば、slug ごとに BOXを作成し非表示にしておき、 以下の様にしてブラウザの状態別に表示するようにすることも出来ます。
    返り値 string
    const statusSlug = window.WebPushKun.getStatusSlug();
    const target = '#webpush_message_box__' + statusSlug;
    if ($(target).get(0) ) {
        $(target).show();
    }
    
  • その他 StatusCode関連 function
    lists 詳細は ★WebPush対応状況の「statusLists」を参照。
    返り値 object
    // statusCode の詳細データリストを取得。
    const lists = window.WebPushKun.getStatusCodeLists();
    // statusCode の説明文取得
    const text = window.WebPushKun.getStatusText();
    
    console.log(text, lists);
    
  • isSupported()
    WebPushに対応してる場合は true を返します
    返り値 boolean
    if (window.WebPushKun.isSupported() === true) {
        alert('WebPush対応ブラウザです😙');
    }
    
  • isDenied()
    このサイトの通知を「拒否」してる場合は true を返します
    返り値 boolean
    if (window.WebPushKun.isDenied() === true) {
        alert('このサイトの通知を拒否しています😢');
    }
    
  • getAllStatus()
    analyzeBrowser() で解析した現在のブラウザの状態情報を全て取得
    取得内容は ★WebPush対応状況の「All Status」を参照
    const status = window.WebPushKun.getAllStatus();
    console.log(status);
    
  • requestPermission()
    左上に表示される「通知の許可ダイアログ」を開きユーザーに許可させ、新Tokenを取得→保持します。
    返り値 Promise
    ↓をクリックしたら左上に通知の許可を求めるアレが表示されるので【許可】して下さい。
    <button class="requestPermission">購読する</button>
    <script>
    $(document).on('click', '.requestPermission', function(e) {
        e.stopPropagation();
    
        window.WebPushKun.requestPermission()
        .then(function(token) {
            console.log('Success requestPermission!!', token);
            setStatus(); // ←webpushSample.js 内参照
        })
        .catch(function(err) {
            console.log('Error requestPermission!!', err);
        });
    
        return false;
    });
    </script>
    
  • unSubscribe()
    サブスク(通知購読)の解除をします。
    ブラウザの「通知を拒否」でもサブスク解除は可能です。
    返り値 Promise
    <button class="unSubscribeWebPush">購読を解除する😭</button>
    <script>
    $(document).on('click', '.unSubscribeWebPush', function(e) {
        e.stopPropagation();
        window.WebPushKun.unSubscribe().then(function(res) {
          setStatus(); // ←webpushSample.js 内参照
        });
        return false;
    });
    </script>
    
  • setCallbackOfOnMessage(callbackFunction)
    フォアグラウンドで通知を受信した際の処理を事前に登録しておけます。
    これの指定がない場合は「通常の通知表示」されます。

    例)↓以下は、showNotification() で「通常の通知表示」をさせ、 送信データを console.log() で確認する場合の処理。
    引数 function
    返り値 Promise
    window.WebPushKun.setCallbackOfOnMessage(function(payload) {
        window.WebPushKun.showNotification(payload)
          .then(function(senddata) {
              console.log('setCallbackOfOnMessage()', senddata);
          })
          .catch(function(error) {
              console.log('catch setCallbackOfOnMessage()', error);
          });
    });
  • showNotification(payload)
    payload を通常の通知表示をさせる。
    ※通常これは使わないが、デバッグや確認などに使う事が出来る。
    返り値 Promise
    const payload = {
        notification: {
            title: "通知のタイトル",
            body : "通知の本文",
            image: "https://hoge.com/img/hoge.png"
        },
        data: {
            link: "https://hoge.com/test.html"
        }
    };
    window.WebPushKun.showNotification(payload)
      .then(function() {
          console.log('メッセージ表示後');
      })
      .catch(function(err) {
          console.log(err);
      });

★WebPush対応状況

statusCode
statusSlug
statusText
statusLists
Support
isDenied
mustPWA
Permission
permissionは・・・
このブラウザの Token
All Status