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

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

## 前提
この記事は以下記事の続きです。
なので以下記事がまだな方はご一読ください。
[超簡単にブラウザPush通知を実装する方法【ブラウザ編】](http://qiita.com/shigekid/items/34cbe874a4ec83ab59e3)
[超簡単にブラウザPush通知を実装する方法【サーバー編】](http://qiita.com/shigekid/items/ffcda99de43bdb52e89c)

## 必要なもの
前提に書いてある記事まで終わっていること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`を設定してみましょう。

```lang: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の使い方に関しては詳しくは[こちら](https://documentation.onesignal.com/docs/website-sdk-api#section-sendtag)を参照してください。


### 2.Push通知のプログラムでIDを設定して送ること
[超簡単にブラウザPush通知を実装する方法【サーバー編】](http://qiita.com/shigekid/items/ffcda99de43bdb52e89c)の記事で書いたプログラムを少しだけ書き換えます。
具体的には`included_segments`を消して、tagsにします。そしてそのtagsで具体的に送る対象を定義します。

```lang: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.試してみる
<img width="366" alt="スクリーンショット_2016-04-10_10_26_11.png" src="https://qiita-image-store.s3.amazonaws.com/0/1389/ac5f25a6-363b-7729-816e-a537ce201cec.png">

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

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

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

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


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