※本記事はRailsでWebサービス開発している方向けです。

アプリケーション内で、何かしらのアクションがあったときに、任意のユーザーへプッシュ通知を出す機能を実装していきます。

通知方法についてはOneSignalを使用します。

実装にあたって、下記の記事を参考にさせていただきました、ありがとうございました🙏

参考サイト

OneSignalの設定

サインアップ後、画面に沿って進めます。赤枠箇所を参考にしてください。
name等の項目は、任意の名前で設定してください。

※開発環境でデバッグを行いたいため、SITE URLは、ngrokで一時的に外部公開したURLを設定しております。ngrokの設定方法はこちら参考にしてもらえたらと。

完了すると下記の画像のような画面になると思います。

Railsへ実装します

まず「6.Upload Files」を進めます。

SDK FILESをダウンロードして解凍します。
「OneSignalSDKWorker.js」というファイルをRailsのpublic配下へ格納します。

続いて、「7.Add Code to Site」に進みます。

コードをコピーして、任意のレイアウトファイルへ貼り付けます。

<head>
 #省略
  <script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async=""></script>
  <script>
    var OneSignal = window.OneSignal || [];
    OneSignal.push(function() {
      OneSignal.init({
        appId: "99c70284-99e4-4710-8188-0a5703d1aa1c",
      });
    });
  </script>
 #省略
</head>

これでサイトを表示してみましょう。

右下にベルマークがでてきています。
Google Chromeデベロッパーツールでエラー等の表示がなければ、一旦ここまで大丈夫でしょう。

続いて、先ほどのscriptを下記のようにハイライト箇所を追加してみてください。

<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async=""></script>
<script>
  window.OneSignal = window.OneSignal || [];
  OneSignal.push(function() {
    OneSignal.init({
      appId: "85d1787-ef63-451f-9def-26fd86bf7ec7",
    });
  });
  
  OneSignal.push(function() {
    // Occurs when the user's subscription changes to a new value.
    OneSignal.on('subscriptionChange', function (isSubscribed) {
      console.log("The user's subscription state is now:", isSubscribed);
    });
  });
</script>

この状態で再度サイトを表示して、登録をしてみます。

登録 => true 、解除 => false と返ってくるため、登録と解除のそれぞれのタイミングでRails側へ情報を送って処理すればOKでしょう。

OneSignalのダッシュボードでも、先ほどの登録で無事登録できていることが確認できました。

次に、アプリケーションのユーザーIDとOneSignalのユーザーIDの紐付けを行いたいため、OneSignalのユーザーIDを取得します。

参考
https://documentation.onesignal.com/docs/web-push-sdk#user-ids

<script>
  window.OneSignal = window.OneSignal || [];
  OneSignal.push(function() {
    OneSignal.init({
      appId: "85d1787-ef63-451f-9def-26fd86bf7ec7",
    });
  });
  
  OneSignal.push(function() {
    // Occurs when the user's subscription changes to a new value.
    OneSignal.getUserId(function(userId) {
      console.log("OneSignal User ID:", userId);
      // (Output) OneSignal User ID: 270a35cd-4dda-4b3f-b04e-41d7463a2316    
    });
  });
</script>

コンソールで確認できました。

ということで、下記のように進めてみます。
登録 => ユーザーIDとOneSignalのユーザーIDをRailsへ送る
解除 => ユーザーIDとOneSignalのユーザーIDをRailsへ送る

ユーザーIDが2つあるとややこしいため、これから下記にて表示します。
アプリケーションのユーザーID => user_id
OneSignalのユーザーID => onesignal_user_id

まず、適当にRailsのルーティングを作成します。

  # onesignalの情報の受け取り
  post 'onesignal/:user_id/add', to: 'users#onesignal_add', as: 'onesignal_add'
  post 'onesignal/:user_id/remove', to: 'users#onesignal_remove', as: 'onesignal_remove'

続いてコントローラーでアクションを作成します。

def onesignal_add
  # 行いたい処理を記載する
  # user_idは、params[:user_id]で取得
  # onesignal_user_idは、params[:onesignal_user_id]で取得
  render status: 200, json: { status: 200, message: "Success" }
end

def onesignal_remove
  # 行いたい処理を記載する
  # user_idは、params[:user_id]で取得
  # onesignal_user_idは、params[:onesignal_user_id]で取得
  render status: 200, json: { status: 200, message: "Success" }
end

scriptを下記のように編集します。

<script>
  // ユーザーと紐付けたいため、ユーザーがサインインしているときのみ通知のON/OFFボタンを表示させます
  <% if user_signed_in? %> 
  window.OneSignal = window.OneSignal || [];
  OneSignal.push(function() {
    OneSignal.init({
      appId: "85d1787-ef63-451f-9def-26fd86bf7ec7",
    });
  });
  OneSignal.push(function() {
    OneSignal.on('subscriptionChange', function (isSubscribed) {
      OneSignal.getUserId(function(userId) {
     
     // 登録した時の処理
        if (isSubscribed) {
          $.post("/onesignal/<%= current_user.id %>/add",
            {"onesignal_user_id":userId}
          );

     // 解除した時の処理
        } else {
          $.post("/onesignal/<%= current_user.id %>/remove",
            {"onesignal_user_id":userId}
          );
        }

      });
    });
  });
  <% end %>
</script>

もしデバッグしながら進めたい場合は、下記のようにすると良いかと思います。

<script>
  <% if user_signed_in? %>
  window.OneSignal = window.OneSignal || [];
  OneSignal.push(function() {
    OneSignal.init({
      appId: "85d1787-ef63-451f-9def-26fd86bf7ec7",
    });
  });
  
  OneSignal.push(function() {
    OneSignal.on('subscriptionChange', function (isSubscribed) {
      OneSignal.getUserId(function(userId) {
        if (isSubscribed) {
          console.log("通知:"+ isSubscribed);
          console.log("onesignal_user_id:" + userId);
          console.log("user_id:<%= current_user.id %>");
          $.post("/onesignal/<%= current_user.id %>/add",
            {"onesignal_user_id":userId},
            function(dt){
              console.log(dt);
            }
          );
        } else {
          console.log("通知:" + isSubscribed);
          console.log("onesignal_user_id:" + userId);
          console.log("user_id:<%= current_user.id %>");
          $.post("/onesignal/<%= current_user.id %>/remove",
            {"onesignal_user_id":userId},
            function(dt){
              console.log(dt);
            }
          );
        }
      });
    });
  });
  <% end %>
  
</script>

これでアプリケーションのユーザーIDとOneSignalのユーザーIDを紐づけることができます。

次は、何かアクションがあったときにプッシュ通知を出してみます。