Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
32
Help us understand the problem. What is going on with this article?
@shigekid

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

More than 5 years have passed since last update.

この記事のゴール

サーバーから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"}]

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

32
Help us understand the problem. What is going on with this article?
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
shigekid
I'm using the Ruby on Rails.

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
32
Help us understand the problem. What is going on with this article?