Posted at

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

More than 3 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"}]

以上になります。

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