この記事のゴール
サーバーから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
を設定してみましょう。
<!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で具体的に送る対象を定義します。
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.試してみる

お、届きましたね。
ちなみに最初のhtmlのidを200にして、アップロード&アクセスし直して、web_push.rbを叩いたら飛んできませんでした。
これでセグメントを切ったpush通知は送信できますね。
ポイントは今回追加したtags: [{ key: "id", relation: "=", value: 100 }]
の部分です。
何となく想像つくかもしれませんが、relationは">"、"<"、"="が指定できます。
またAnd条件やOR条件でtagsを組み合わせて送ることもできるようです。以下公式ドキュメントのサンプルです。
tags: [{"key": "level", "relation": ">", "value": "10"},
{"key": "madePurchase", "relation": "=","value": "true"}]
tags: [{"key": "level", "relation": "=", "value": "10"},
{"operator": "OR"},
{"key": "level", "relation": "=", "value": "20"}]
以上になります。
わからない点、わかりにくい点あればコメントください。