/AndroidPayloadApp

[Android] Nifty cloud mobile backend Payload Push Sample App

Primary LanguageJava

【Android】プッシュ通知からデータを取得してみよう!(ペイロード)

2016/10/20作成

画像1

概要

  • ニフティクラウドmobile backendの『プッシュ通知』機能とプッシュ通知を受信する際、プッシュ通知の『ペイロードデータを取得する』機能を実装したサンプルプロジェクトです
  • 簡単な操作ですぐに ニフティクラウドmobile backendの機能を体験いただけます★☆
  • このサンプルはAndroid 4以降に対応しています

ニフティクラウドmobile backendって何??

スマートフォンアプリのバックエンド機能(プッシュ通知・データストア・会員管理・ファイルストア・SNS連携・位置情報検索・スクリプト)が開発不要、しかも基本無料(注1)で使えるクラウドサービス!

詳しくはこちらをご覧ください

画像2

動作環境

  • Android Studio ver. 2.1.2
  • Android 6.0
  • このサンプルアプリは、プッシュ通知を受信する必要があるため実機ビルドが必要です

※上記内容で動作確認をしています

プッシュ通知の仕組み

  • ニフティクラウドmobile backendのプッシュ通知は、各プラットフォームが提供している通知サービスを利用しています
  • Androidの通知サービス FCM(Firebase Cloud Messaging)

画像a1

※ FCMはGCM(Google Cloud Messaging)の新バージョンです。既にGCMにてプロジェクトの作成・GCMの有効化設定を終えている場合は、継続してご利用いただくことが可能です。新規でGCMをご利用いただくことはできませんので、あらかじめご了承ください。

  • 上図のように、アプリ(Android Studio)・サーバー(ニフティクラウドmobile backend)・通知サービス(FCM/GCM)の間でやり取りを行うため、認証が必要になります
  • 認証に必要なプッシュ通知のAPIキーおよびSenderIDは手順にて説明します。

手順

0.プッシュ通知機能を使うための準備

ニフティクラウド mobile backendと連携させるためのAPIキーを取得する必要があります。 以下のドキュメントを参考に、FCMプロジェクトの作成とAPIキーの取得を行ってください。

mobile backendとFCMの連携に必要な設定

  • 上記リンクから会員登録(無料)をします
  • 登録後、ログインをすると下図のように「アプリの新規作成」画面が出ますので、アプリを作成します

画像3

  • アプリ作成されると下図のような画面になります
  • この2種類のAPIキー(アプリケーションキーとクライアントキー)は先ほどインポートしたAndroidStudioで作成するAndroidアプリにニフティクラウドmobile backendの紐付けるため、あとで使います

画像4

  • アプリ設定開いてプッシュ通知の設定をします
    • 「プッシュ通知の許可」で「許可する」選択、「保存する」をクリックします
    • 「Androidプッシュ通知」の「APIキー」には、FCMでプロジェクト作成時に発行された「サーバーキー」を記入し、「保存する」をクリックします

画像6

2. GitHubからサンプルプロジェクトのダウンロード

  • プロジェクトのGithubページから「Clone or download」>「Download ZIP」をクリックします
  • プロジェクトを解凍します

3. AndroidStudioでアプリを起動

  • AndroidStudioを開き、Open an existing Android Projectを選択し、解凍したプロジェクトを選択します。

画像7

  • プロジェクトを開きます。MainActivity.javaファイルを開きます。

画像8

4. APIキーの設定

画像9

  • それぞれYOUR_APPLICATION_KEYYOUR_CLIENT_KEYの部分を書き換えます
  • このとき、ダブルクォーテーション(")を消さないように注意してください!

5. AndroidのSender IDキーの設定

  • MainActivity.javaを編集します

画像10

  • ANDROID_SENDER_IDの部分を、FCMでプロジェクト作成時に発行された「送信者ID (Sender ID)」に書き換えます
  • このとき、ダブルクォーテーション(")を消さないように注意してください!

6. 動作確認

  • AndroidStudioからビルドする。

  • 「プロジェクト場所」\app\build\outputs\apk\ ***.apk ファイルが生成される

  • インストールしたアプリを起動します

  • プッシュ通知の許可を求めるアラートが出たら、必ず許可してください!アプリを起動します。

画像11

画像12

7.プッシュ通知を送って、データを取得しましょう

  • まずはアプリを__起動した状態__でプッシュ通知を送ってみましょう!
  • ニフティクラウドmobile backendのダッシュボードで「プッシュ通知」>「+新しいプッシュ通知」をクリックします
  • プッシュ通知のフォームが開かれます
  • タイトル、メッセージ、JSON、URL(他も後ほど試してみてください)を入力してプッシュ通知を作成します

画像13

  • 対象端末が存在していることを確認します。
  • プッシュ通知を作成しましょう。

画像14

  • 端末を確認しましょう!
  • 少し待つとプッシュ通知が届きます
  • 通知が来て、タブすると、ペイロードを受信し、画面に表示します
  • ペイロードデータの見方については「解説」をご覧ください

画像15

解説

  • 下記2点について解説します
  • ペイロードデータについて
  • サンプルプロジェクトに実装済みの内容

ペイロードデータについて

  • ニフティクラウドmobile backendのダッシュボードで入力した内容は以下のようなJSONデータとして、Android端末に届きます
{
    "com.nifty.PushId" : "********",
    "com.nifty.Data" : "{key : value}",
    "com.nifty.RichUrl" : "http://mb.cloud.nifty.com/"
}
  • Androidのプッシュ通知の仕様により、ダッシュボードで「JSON」に入力したデータはそのまま com.nifty.Data に追加されて設定されます
  • ダッシュボードで「URL」に設定した場合、 com.nifty.RichUrlとして設定されます
  • 他にはプッシュ通知のIDは com.nifty.PushId に設定されます

サンプルプロジェクトに実装済みの内容

SDKのインポートと初期設定

ロジック

  • activity_main.xmlでデザインを作成し、MainActivity.javaにロジックを書いています
  • installationクラス(端末情報)が保存される処理は以下のように記述されます
  • アプリを再インストールした時に、端末のデバイストークンが重複した場合の処理を考慮した実装となっています。
//**************** APIキーの設定とSDKの初期化 **********************
 NCMB.initialize(this, "YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY");
 final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();

 //GCMからRegistrationIdを取得しinstallationに設定する
 installation.getRegistrationIdInBackground("ANDROID_SENDER_ID", new DoneCallback() {
     @Override
     public void done(NCMBException e) {
         if (e == null) {
             installation.saveInBackground(new DoneCallback() {
                 @Override
                 public void done(NCMBException e) {
                     if (e == null) {
                         //保存成功
                     } else if (NCMBException.DUPLICATE_VALUE.equals(e.getCode())) {
                         //保存失敗 : registrationID重複
                         updateInstallation(installation);
                     } else {
                         //保存失敗 : その他
                     }
                 }
             });
         } else {
             //ID取得失敗
         }
     }
 });
  • ペイロードを実装するために、カスタムサービスを実装する必要があります。詳細の実装はこちらに参照ください。

  • AndroidManifest.xmlのサービスを定義している部分を書き換えます。

<service
    android:name="com.nifty.cloud.mb.core.CustomGcmListenerService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
    </intent-filter>
</service>
  • CustomGcmListenerService.java を作成します。以下のように実装されます。
public class CustomGcmListenerService extends NCMBGcmListenerService {

    private static final String TAG = "GcmService";
    private static final int REQUEST_RESULT = 0;

    @Override
    public void onMessageReceived(String from, Bundle data) {
        //ペイロードデータの取得
        if (data.containsKey("com.nifty.Data")) {
            try {
                JSONObject json = new JSONObject(data.getString("com.nifty.Data"));
            } catch (JSONException e) {
                //エラー処理
            }
        } else if (data.containsKey("com.nifty.PushId")) {
            String pushid = data.getString("com.nifty.PushId");
            Log.d(TAG, pushid);
        } else if (data.containsKey("com.nifty.RichUrl")) {
            String url = data.getString("com.nifty.RichUrl");
            Log.d(TAG, url);
        }

        //デフォルトの通知
        super.onMessageReceived(from, data);
    }
}
  • 画面にデータを表示するために以下のようにMainActivity.javaonResumeメソッドにて実装します。
public void onResume() {
        super.onResume();
        //**************** ペイロード、リッチプッシュを処理する ***************
        Intent intent = getIntent();

        //プッシュ通知IDを表示
        _pushId = (TextView) findViewById(R.id.txtPushid);
        String pushid = intent.getStringExtra("com.nifty.PushId");
        _pushId.setText(pushid);

        //RichURLを表示
        _richurl = (TextView) findViewById(R.id.txtRichurl);
        String richurl = intent.getStringExtra("com.nifty.RichUrl");
        _richurl.setText(richurl);

        //プッシュ通知のペイロードを表示
        if (intent.getStringExtra("com.nifty.Data") != null) {
            try {
                JSONObject json = new JSONObject(intent.getStringExtra("com.nifty.Data"));
                if (json != null) {
                    ListView lv = (ListView) findViewById(R.id.lsJson);
                    lv.setAdapter(new ListAdapter(this, json));
                }
            } catch (JSONException e) {
                //エラー処理
            }
        }
        intent.removeExtra("com.nifty.RichUrl");
    }

参考