リテンション風なプッシュ通知配信ができるUnityアプリを作ってみた（Android）


# 前段

プッシュ通知を配信する中で、よく使われる方法が「しばらく起動していないユーザー」に対してプッシュ通知を送る「リンテンション」的な使われ方。
今回は[ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)のプッシュ通知機能を使って上記のリテンション風なプッシュ通知を実装してみた。

# [ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)における配信端末の管理からみるリテンションプッシュ通知実装法

[ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)では配信端末を[データストア](http://mb.cloud.nifty.com/function.htm#datastore)のinstallationクラスで管理しています。

![スクリーンショット 2016-02-27 17.19.04.png](https://qiita-image-store.s3.amazonaws.com/0/55227/6ec71e19-d294-f8ed-6102-c9debce9322a.png "スクリーンショット 2016-02-27 17.19.04.png")

このinstallationの各フィールド（カラム）の値を使って絞り込みも行えるようになります。

![スクリーンショット 2016-02-27 17.23.29.png](https://qiita-image-store.s3.amazonaws.com/0/55227/ad3637bd-30bb-3acf-3594-c9280f5d04b8.png "スクリーンショット 2016-02-27 17.23.29.png")

installationに「login」というフィールド作りそこにタイムスタンプを入れれば、「○○日以降起動していない人」だけにプッシュ通知を配信できるようになります。

# リテンションプッシュ通知実装までの流れ

リテンションプッシュ通知実装までには下記の作業が必要になります。

1. 通常のプッシュ通知を配信できるようにする
2. NCMBManager.csのコードを少し変更する
3. ダッシュボードから絞り込みプッシュ通知を配信する

上記の内容を1から順に説明していきます

# 通常のプッシュ通知を配信できるようにする

いきなりで申し訳ないですがこちらは、以前のブログに記載しているのでそちらをご参照ください。
[UnityアプリにAndroidのプッシュ通知を組み込んでみる、開封通知も加えてみる](http://qiita.com/fumishitan/items/4512c2b39d349350c8bc)

# NCMBManager.csのコードを少し変更する

上記のブログの中で設定したNCMBManager.csを変更して,
「login」フィールドを加えて、タイムスタンプを入れるようにします。

NCMBManager.csはAssets>Pluginにあります。

その235行目〜269行目に実装しているメソッドTokenReceivedの「//端末情報をデータストアに登録」（253行目）と描かれている行の下の行に
System.DateTime now = System.DateTime.UtcNow;
installation["login"] = now;
と実装します。

```csharp:NCMBManager.cs
//ネイティブでデバイストークン取得後に呼び出されます
internal void onTokenReceived (string token)
{
	_token = token;	//onAnalyticsReceivedで使用。

	string path = SearchPath ();	//currentInstallationのパスを設定

	//currentInstallationがあれば読み込み、更新の必要性を判定します
	string jsonText = "";
	NCMBInstallation installation = null;
	if ((jsonText = ReadFile (path)) != "") {	//currentInstallationあり
		installation = new NCMBInstallation (jsonText);
	} else {
		installation = new NCMBInstallation ();
	}

		nstallation.DeviceToken = _token;

		//端末情報をデータストアに登録
		//この下2行を記載します////////
		System.DateTime now = System.DateTime.UtcNow;
		installation["login"] = now;
		////////////////////////////////
		installation.SaveAsync ((NCMBException saveError) => {		//更新実行
		if (saveError != null) {
			//対処可能なエラー
			if (saveError.ErrorMessage.Equals ("Duplication Error")) {
				//過去に登録したデバイストークンと衝突。アプリの再インストール後などに発生
				updateExistedInstallation (installation, path);
			} else {	                
				//想定外のエラー
				OnRegistration (saveError.ErrorMessage);
			}
		} else {
			OnRegistration ("");
		}
	});
}
```
あとはプロジェクトをビルドします。

# ダッシュボードから絞り込みプッシュ通知を配信する

ビルド後、アプリを起動してinstallationクラスを確認してください。deviceTokenフィールドにトークンがloginフィールドにタイムスタンプが入っているのをそれぞれご確認ください
![スクリーンショット 2016-02-27 14.31.29.png](https://qiita-image-store.s3.amazonaws.com/0/55227/a2c54cc6-1c3b-3c1a-8040-40e29eaf5d81.png "スクリーンショット 2016-02-27 14.31.29.png")

またもう一回、アプリを落として再度、アプリを起動してloginフィールドが更新されていることをご確認ください

![スクリーンショット 2016-02-27 18.44.55.png](https://qiita-image-store.s3.amazonaws.com/0/55227/165d9c50-139f-dd65-45f0-4c23176e2554.png "スクリーンショット 2016-02-27 18.44.55.png")


ダッシュボードから絞り込みのプッシュ通知を配信します。
配信に関しては
[ダッシュボードからプッシュ通知を配信する](http://mb.cloud.nifty.com/doc/current/push/basic_usage_unity.html#ダッシュボードからプッシュ通知を配信する)
をお読みください。


ダッシュボードから絞り込み配信は下記ドキュメントをお読みください
[ダッシュボードでの絞り込み](http://mb.cloud.nifty.com/doc/current/push/filter_unity.html#ダッシュボードでの絞り込み)

今回、16:00を境に「大きい」、「小さい」で絞り込んだところ下記のようになりました

「16:00より大きいで絞り込んだ時」、1端末だけ配信する端末があると表示されています。

![スクリーンショット 2016-02-27 16.31.12.png](https://qiita-image-store.s3.amazonaws.com/0/55227/8a34b649-5095-a337-64a7-34118ac06bad.png "スクリーンショット 2016-02-27 16.31.12.png")

「16:00より小さいで絞り込んだ時」、1端末も配信する端末がないと表示されています。

![スクリーンショット 2016-02-27 16.30.57.png](https://qiita-image-store.s3.amazonaws.com/0/55227/23001c55-836c-91df-6a8d-86611ad184a1.png "スクリーンショット 2016-02-27 16.30.57.png")


どうやら正確に絞り込めているようです。
実際に配信したら、大きい場合はちゃんとどきました。