【Parse】Push通知をAndroidアプリに簡単に組み込む方法


こんにちは

[bowyer-app](https://github.com/bowyer-app)です。

AndroidアプリでPush通知を送りたいと思ったら[GCM](http://dev.classmethod.jp/smartphone/android/gcm/)を実装して、サーバーを用意していろいろやることが多いですね。
個人でアプリを開発していると、そこまで手が回らないと思います。

そんな煩わしい作業を解決してくれるのが[Parse](https://www.parse.com/)です。
今回は、そのParseを使って、カスタマイズ可能なPush通知を実装する方法を紹介します。

# まず、Parseとは？
[個人のスマホアプリ開発者がParseを使うべき15の理由](http://qiita.com/koyopro/items/b9891aa7bb596b958d7e)
こちらの記事に詳しく書かれています。

Push通知の実装に必要なメリットだけピックアップすると
・ スケールするまで無料
[https://parse.com/plans](https://parse.com/plans)
・ サーバーを用意する必要がない
です。
無料で使えて、サーバーの用意も必要ないので、個人開発者にはとても優しいです。

# どんなPush通知が送れるのか？ 
・ セグメント配信
・ 通知文言のA/Bテスト
・ 予約配信
・ カスタムjsonの送信

予約配信とカスタムjsonはとても魅力的です。
カスタムjsonには自分のアプリに必要なmodelを組み込んでおけば、push通知受信時にいろいろできます。

# 予約配信とカスタムjsonを扱えるライブラリを作りました
そのままParseを組み込むだけでも十分使えるのですが、カスタムjsonの準備や予約配信がめんどくさいなと感じたのでライブラリにしました。

[https://github.com/bowyer-app/ParseSendClient](https://github.com/bowyer-app/ParseSendClient)
githubからcloneしてもらえればすぐ動くようになっています。

こちらのデモでは
・ 通知タイトル
・ 通知メッセージ
・ 通知音を強制的に鳴らすか
・ 通知受信時に開くurl
・ 予約配信
を指定してpush通知を送信できます。

![sendnow.gif](https://qiita-image-store.s3.amazonaws.com/0/92349/6ea54cb7-9b0f-515e-b72f-76c010385fe0.gif)

## プロジェクト構成
・ [demo](https://github.com/bowyer-app/ParseSendClient/tree/master/demo)
これが受信用のクライアントアプリです。ここを見るだけでParseのPush通知の実装は可能です。
カスタムjsonを受け取るようにしています。

・ [senddemo](https://github.com/bowyer-app/ParseSendClient/tree/master/senddemo)
push通知送信用のクライアントアプリです。入力した任意の文字列をカスタムjsonにして送信することができます。
また、予約配信も可能です。

・ [parsesendclient](https://github.com/bowyer-app/ParseSendClient/tree/master/parsesendclient)
ParseのREST APIを使ってpush通知を送れるようにしたライブラリです。

# 使い方
## カスタムjsonとして扱いたいObjectの用意
共通のmodelを受信側と送信側で用意します。
このObjectがカスタムjsonとして機能します。
[ParsePushModel](https://github.com/bowyer-app/ParseSendClient/blob/master/demo/src/main/java/com/bowyer/app/parsesendclient/demo/model/ParsePushModel.java)

```lang:java
    String title; // pushのタイトル

    String message; // pushのメッセージ

    String url; // push受信時に開くurl

    boolean forceSound; // push受信時に強制的に通知音を鳴らす
```

## 送信したいmodelを準備
```lang:java
ParsePushModel model = ParsePushModel.to().setTitle(pushTitle).setMessage(
                                       pushMessage).setUrl(pushUrl).setForceSound(forceSound);
```

## channelを指定
```lang:java
String[] channel = new String[1];
channel[0] = "demo";
```

## pushの送信
### pushの即時送信
即時にpushを送信できます。

```lang:java
PushSendLogic.sendPush(model, channel, new PushSendLogic.PushSendCallBack() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onFailure(String message) {

    }

});
```

### pushの予約配信
pushを送信する時間帯を指定できます。Calenderクラスに送信したい日時を指定してください。

```lang:java
Calendar calendar = Calendar.getInstance();
//set push date
calendar.set(year, monthOfYear, dayOfMonth);
//set push time
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
//call sendSchedulingPush
PushSendLogic.sendSchedulingPush(model, calendar, channel,
    new PushSendLogic.PushSendCallBack() {
         @Override
         public void onSuccess() {

        }

        @Override
        public void onFailure(String message) {
        }
});
```

# 最後に
共通のmodelは何を入れてもらっても大丈夫なので、自由にカスタマイズしたObjectを送信することが出来ます。
独自でカスタムした予約pushの仕組みを実装したい時はぜひ参考にしてみてください。
[https://github.com/bowyer-app/ParseSendClient](https://github.com/bowyer-app/ParseSendClient)
気にっていただけたらStarお願いします。