OneSignalでWebサイトにpush通知機能を付ける



## OneSignalとは

[W3C Push API](https://developer.mozilla.org/ja/docs/Web/API/Push_API)の使い方を調べていたのですが、
Rebuild.fmのServiceWorkerがヒントにならないかと思い、Chromeのコンソールで開いてみたところ、[OneSignral](https://onesignal.com/)というサードパーティのライブラリが使われていることがわかりました。

![OneSignal_-_Multi-platform_Push_Notification_Service.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/d9898f64-56ed-ad88-d9cb-3f34f3674edd.jpeg "OneSignal_-_Multi-platform_Push_Notification_Service.jpg")


日本語の情報は少ないものの、無料である程度は使えるようだし、ドキュメントも充実していたので試してみることに。

PushAPIはSSLでしか受け付けないのだけど、OneSignalを使うと非SSLのサイトでもプッシュ通知を送ることができるようです。
（その場合、~.onesignal.comから通知が発行される）


まずはチュートリアルに従ってやってみます。


## Google Cloud Messagingの登録

Chromeブラウザへプッシュ通知を行うにはGoogle Cloud MessagingのAPIKeyが必要なので、まずはGoogle Developer Consoleでアプリケーションを作成し、API Keyとプロジェクト番号（プロジェクトIDではないことに注意!）を取得する必要があります。
この辺は別の方の記事が詳しいのでそちらを参照してください。

[初めてのService Worker （Push API編）](http://qiita.com/k-taro/items/26dc55281d414babd495#google-developer-console%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)


## OneSignalチュートリアル

HTTPでプッシュ通知を行う方法は↓のチュートリアル。
Dashboardからプッシュ通知を組み込みたいアプリの登録をして数行のコードをhtmlに組み込む。


[Web Push SDK Installation (HTTP)](https://documentation.onesignal.com/docs/website-sdk-http-installation)


## OneSignalアプリケーションの登録

Dashboardから 「Add a new app」を選択。
アプリケーション名の登録。

![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/8c101938-7cc3-d25d-a744-acb4a02e4d16.jpeg "OneSignal.jpg")

モバイルアプリ等にも対応してるみたいだけど、今回はWebsite Pushを選択。

![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/ca807eb6-51da-48b8-2160-488de2d6efcb.jpeg "OneSignal.jpg")

Safariへ通知するにはもう一手間かかるらしい。今回はChromeを選択。

![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/009b37e2-a46b-0304-a9d2-dc4d329c394a.jpeg "OneSignal.jpg")


localhostで試すぶんには「Site URL」を「*」で登録。
「Google Server API Key」にはGoogle Developer Consoleで発行されたAPIKeyを入力。
非HTTPSサイトから通知をしたいので「My Site is not fully HTTPS.」にチェックを入れる。

![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/029b8bbb-d486-7cba-ee17-a5bad55f0c46.jpeg "OneSignal.jpg")

「Choose Subdomain」には任意の値。HTTPの場合はこのサブドメインを含むURLから通知が発行される。
「Google Project Number」にはGoogle Developer Consoleから発行されたプロジェクト番号。

![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/979c5ba2-81c0-1bdc-a651-7732f7377e78.jpeg "OneSignal.jpg")

プロジェクト番号は「全てのアクティビティを表示」をクリックしたページから参照できる。

![アクティビティ.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/4cdd9230-ab4f-fa57-f113-6a940a168acb.jpeg "アクティビティ.jpg")


![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/07e02032-3577-17d9-c9ce-d56d2514d0dc.jpeg "OneSignal.jpg")


最後にAPPIDが発行されるので、メモしておく。

![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/e326d958-b318-10e6-b1a3-916071cb77e5.jpeg "OneSignal.jpg")


あとは元のチュートリアルに従って、以下のスクリプトをhtmlのhead内に記述する。
アプリケーション登録時に発行されたAPPIDはここに。


```html
<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async='async'></script>
<script>
  var OneSignal = OneSignal || [];
  OneSignal.push(["init", {
    appId: "YOUR_APP_ID",
    subdomainName: 'PushAPI',
    notifyButton: {
        enable: true // Set to false to hide
    }
  }]);
</script>
```

ページを開くと右下にonesignralのアイコンが表示されるのでそれをクリックすればsubscribeされる。


## 通知を送ってみる

通知を送るのはDashboardから。

![OneSignal.jpg](https://qiita-image-store.s3.amazonaws.com/0/8607/f489393b-0d9e-6df6-b525-53582050dabd.jpeg "OneSignal.jpg")


ユーザーのボタンクリックでプッシュ通知がされるようにしたいのだけど、API Referenceを読んだ感じだと、SDKからpushする方法が無さそう..?
この辺はもう少し調べてみます。


**2016.5.9 追記**

ドキュメントをしっかり読んだところ通知用のAPIが公開されていることがわかりました。

[/notifications (Create Notification)]
(https://documentation.onesignal.com/docs/notifications-create-notification)


jsxからのPOSTは[superagent](https://github.com/visionmedia/superagent)というnpmを使っています。

```jsx
import request from "superagent"

~

pushNotify(){
    var api_url = "https://onesignal.com/api/v1/notifications";
    var api_key = "my_api_key";
    var json = {
      "app_id": "my_app_id",
      "contents": {"en" : "Hello! this is " + this.props.name},
      "included_segments": ["All"]
    };

    request.post(api_url)
      .send(JSON.stringify(json))
      .set("Content-Type", "application/json")
      .set("Authorization", "Basic " + api_key)
      .end((err, res) => {
        console.log(res);
        console.log(err);
      });
  },
```



サクッと試してみるぶんには数分でいけるので是非是非お試しください。