LoginSignup
34

More than 5 years have passed since last update.

特定のユーザーにブラウザPush通知を送信する方法

Posted at

この記事のゴール

サーバーからOneSignalのAPIを叩いて特定のユーザー(例えばidが100のユーザー)に対してPush通知を送るれるようになること。

前提

この記事は以下記事の続きです。
なので以下記事がまだな方はご一読ください。
超簡単にブラウザPush通知を実装する方法【ブラウザ編】
超簡単にブラウザPush通知を実装する方法【サーバー編】

必要なもの

前提に書いてある記事まで終わっていることw

やること

  • JavaScript側でIDを設定。
  • Push通知のプログラムでIDを設定して送ること
  • 試してみる

1.JavaScriptでIDを設定

これは実はidではなく、key-valueで管理されるtagというものを使います。
なので例えばidが100の人に送りたいとした場合、tagとしてkeyがid、valueが100を持っているブラウザに対してPush通知は送られます。
ですのでkey:type, value:login_userみたいなtagを付けておけばlogin_userというタグを持っているユーザー全員に送信することも可能です。

OneSignalにおいてタグを保持するのは、sendTag、もしくはsendTagsを使います。
今回はsendTagを使ってid:100を設定してみましょう。

tags.html
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js"></script>
    <script>
      var OneSignal = OneSignal || [];
      OneSignal.push(["sendTag", "id", "100", function(tagsSent) {}]);
    </script>
  </head>
  <body>
  </body>
</html>

このページを作ったらサーバーにアップロードしてアクセスしてみましょう。
これでid:100のタグを持っている対象に対してPush通知を送った場合の送信対象に、今回のこのブラウザは含まれるようになりました。
ちなみにtagは上書かれます。ですので例えばsendTagでid:200を設定した場合、id:100は上書かれ、200になるので可変するようなデータを保持する際には注意してください。
sendTag、sendTagsの使い方に関しては詳しくはこちらを参照してください。

2.Push通知のプログラムでIDを設定して送ること

超簡単にブラウザPush通知を実装する方法【サーバー編】の記事で書いたプログラムを少しだけ書き換えます。
具体的にはincluded_segmentsを消して、tagsにします。そしてそのtagsで具体的に送る対象を定義します。

web_push.rb
require 'active_support/core_ext'
require 'active_support/json'
require 'net/http'

module WebPush
  ProductionOneSignalAppId="取得したOneSignalAppID"
  ProductionSignalRestAPIKey="取得したREST API Key"

  def notification!
    params = {
      app_id: ProductionOneSignalAppId,
      rest_api_key: ProductionSignalRestAPIKey,
      headings: {en: "notification test", ja: "id:100の人に通知テストですよ"},
      contents: {en: "This is notification test", ja: "id:100の人に通知のテストですよ"},
      tags: [{ key: "id", relation: "=", value: 100 }]
    }
    one_signal_web_push(params)
  end

  def one_signal_web_push(params)
    raise "AppId or RestAPIKey is required" if params[:app_id].blank? || params[:rest_api_key].blank?
    raise "ContentsIsNone" if params[:contents].blank?
    params[:isChromeWeb] = true
    uri = URI.parse('https://onesignal.com/api/v1/notifications')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri.path,
                              'Content-Type' => 'application/json',
                              'Authorization' => "Basic #{params[:rest_api_key]}")
    request.body = params.as_json.to_json
    return http.request(request)
  end
end

include WebPush
notification!

これでruby web_push.rbを叩いてみましょう!

3.試してみる

スクリーンショット_2016-04-10_10_26_11.png

お、届きましたね。
ちなみに最初のhtmlのidを200にして、アップロード&アクセスし直して、web_push.rbを叩いたら飛んできませんでした。
これでセグメントを切ったpush通知は送信できますね。

ポイントは今回追加したtags: [{ key: "id", relation: "=", value: 100 }]の部分です。
何となく想像つくかもしれませんが、relationは">"、"<"、"="が指定できます。
またAnd条件やOR条件でtagsを組み合わせて送ることもできるようです。以下公式ドキュメントのサンプルです。

onesignal_sample.rb
tags: [{"key": "level", "relation": ">", "value": "10"},
       {"key": "madePurchase", "relation": "=","value": "true"}]
onesignal_sample.rb
tags: [{"key": "level", "relation": "=", "value": "10"},
       {"operator": "OR"},
       {"key": "level", "relation": "=", "value": "20"}]

以上になります。
わからない点、わかりにくい点あればコメントください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34