サーバー構築不要!スマートフォンアプリ向けの新クラウド

トップ >ドキュメント >プッシュ通知(Android):基本的な使い方

プッシュ通知(Android)

ドキュメント内検索

基本的な使い方

概要

このページでは、プッシュ通知の基本的な使い方について説明していきます。

設定の流れ

ニフティクラウド mobile backendのプッシュ通知機能は、
Googleが提供しているFirebase Cloud Messaging(以下、FCM)と連携することで、通知の配信を行っています。

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

Androidアプリでプッシュ通知を受信するまでの設定は以下のような流れとなっています。

  1. FCMプロジェクトの作成とAPIキーの取得
  2. ニフティクラウド mobile backendでの設定
  3. アプリでの設定

FCMプロジェクトの作成とAPIキーの取得

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

ニフティクラウド mobile backendでの設定

次に、ニフティクラウド mobile backendでプッシュ通知の設定を行います。

プッシュ通知の有効化

左メニューのアプリ設定から、プッシュ通知の項目を選択してください。
プッシュ通知の許可設定を行う部分があるので、「許可する」に変更して変更を保存してください。

プッシュ通知の有効化

FCMで作成したAPIキーの追加

FCMで取得したAPIキー(サーバーキー)を設定し、変更を保存してください。

APIキーの追加

以上の設定で、ニフティクラウド mobile backendとFCMを連携することができました。
ここからは、アプリ側でプッシュ通知を受信するための実装を行っていきます。

アプリでの設定

アプリ側では、以下のような設定を行います。

  • 必要なライブラリのインストール
  • AndroidManifestの編集
  • 端末をニフティクラウド mobile backendに登録する処理の実装

なお、ニフティクラウド mobile backendのAndroid SDKは
インストールと初期化が済んでいるものとして説明しますので、
未実施の場合はクイックスタートをご覧ください。

ライブラリのインストール

プッシュ通知をmobile backendで送受信するためには、以下のライブラリが必要です。

  • Google Play Services SDK
    • プッシュ通知を受信するために必要です
  • Support Library
    • 通知を表示させるために必要です

これらのライブラリは以下の手順でインストールします

  • SDK Managerで必要なライブラリをインストールする
    • Android Support Library
    • Android Support Repository(Android Studioの場合)
    • Google Play Services
  • アプリケーションモジュールのbuild.gradleファイルを編集する
    • dependenciesに追加
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.google.android.gms:play-services:8.1.0'
    compile files('libs/NCMB.jar')
}

詳細な手順については、Googleが提供しているドキュメントをご覧ください

Android Manifestの編集

AndroidManifest.xmlにて、利用するパーミッションの宣言と
レシーバー、サービスの登録を行います。

まずは、manifestタグの要素として以下のパーミッションの利用を宣言してください。
android.permission.VIBRATEが不要な場合は削除しても構いません。
パッケージ名は、各自のプロジェクトのものに適宜変更してください。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="パッケージ名.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="パッケージ名.permission.C2D_MESSAGE" />

次に、applicationタグの要素としてreceiverとserviceの登録を行います。

  • receiverの登録
    • パッケージ名は適宜変更してください
<receiver
    android:name="com.nifty.cloud.mb.core.NCMBGcmReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
        <category android:name="パッケージ名"/>
    </intent-filter>
</receiver>

  • serviceの登録
<service
    android:name="com.nifty.cloud.mb.core.NCMBGcmListenerService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
    </intent-filter>
</service>

  • meta-dataの設定

v2より以下の項目がAndroidManifestで設定可能となりました。
プッシュ通知タップ時に起動するActivityの設定は必須の設定となります。

<!-- プッシュ通知タップ時に起動するActivityの設定 -->
<meta-data android:name="openPushStartActivity" android:value=".MainActivity"/>

<!-- 通知エリアに表示されるアイコンの設定 -->
<meta-data android:name="smallIcon" android:resource="@drawable/icon"/>

<!-- 通知エリアにプッシュ通知を複数表示する設定 0:最新のみ表示 , 1:複数表示 -->
<meta-data android:name="notificationOverlap" android:value="0"/>

<!-- カスタムダイアログプッシュを利用する場合のみ背景画像の設定 -->
<meta-data android:name="dialogPushBackgroundImage" android:resource="@drawable/balloon"/>

配信端末情報の登録

FCMでは、プッシュ通知の配信端末を一意に識別するRegistration IDを利用し、
各端末への配信を行っています。

そのため、FCMからRegistration IDを取得したあとで、
データストアに配信端末情報として登録する必要があります。
以下の端末情報の登録処理を、プッシュ通知を受信するアクティビティのonCreateメソッド内に記入してください。
「YOUR_SENDER_ID」の部分には、FCMでプロジェクト作成時に発行されたSender ID(送信者ID)を設定します。

//端末情報を扱うNCMBInstallationのインスタンスを作成
final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();

//FCMからRegistrationIdを取得
installation.getRegistrationIdInBackground("YOUR_SENDER_ID", new DoneCallback() {
    @Override
    public void done(NCMBException e) {
        if (e == null) {
            //端末情報をデータストアに登録
            installation.saveInBackground(new DoneCallback() {
                @Override
                public void done(NCMBException saveErr) {
                    if (saveErr != null) {
                        //端末情報登録時のエラー処理
                    }
                }
            });
        } else {
            //RegistrationId取得時のエラー処理
        }
    }
});

アプリの再インストールを考慮する場合

アプリが再インストールされた場合などに、
前回のインストール時に保存された端末情報がデータスト上に残ったままの場合が考えられます。
その場合、端末情報の登録でRegistration IDの重複エラーが発生するため、
エラーが発生したときの処理を実装する必要があります。

final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();

//FCMからRegistrationIdを取得しinstallationに設定する
installation.getRegistrationIdInBackground("YOUR_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取得失敗
        }
    }
});

端末情報の更新を行うupdateInstallationメソッドでは
同じRegistration IDの端末情報を取得して、更新を行っています。

public static void updateInstallation(final NCMBInstallation installation) {

    //installationクラスを検索するクエリの作成
    NCMBQuery<NCMBInstallation> query = NCMBInstallation.getQuery();

    //同じRegistration IDをdeviceTokenフィールドに持つ端末情報を検索する
    query.whereEqualTo("deviceToken", installation.getDeviceToken());

    //データストアの検索を実行
    query.findInBackground(new FindCallback<NCMBInstallation>() {
        @Override
        public void done(List<NCMBInstallation> results, NCMBException e) {

            //検索された端末情報のobjectIdを設定
            installation.setObjectId(results.get(0).getObjectId());

            //端末情報を更新する
            installation.saveInBackground();
        }
    });
}

以上でアプリ側での設定は完了です。
アプリをAndroid端末で実行し、端末情報がデータストアに登録されるか確認してください。

プッシュ通知をアプリから送信する

ダッシュボードだけでなく、アプリからも他の端末へプッシュ通知を送信することができます。
deliveryTime未設定の場合は即時配信設定になります。

プッシュ通知の設定を行う
  • iOS端末へのプッシュ通知を行う場合は、バッジの増加フラグや、着信音の設定などが可能です。
private void sendPush() throws JSONException {
    NCMBPush push = new NCMBPush();
     push.setBadgeIncrementFlag(true);
     push.setSound("default");
     push.setCategory("CATEGORY001");
     push.setTarget(new JSONArray("[ios]"));
     push.setMessage("send push!");
     push.sendInBackground(new DoneCallback() {
         @Override
         public void done(NCMBException e) {
             if (e != null) {
                 // エラー処理
             } else {
                 // プッシュ通知登録後の処理
             }
         }
     });
}

  • Android端末へのプッシュ通知を行う場合は、タイトルや起動画面、ダイアログプッシュ通知の有効フラグを設定できます。
private void sendPush() throws JSONException {
    NCMBPush push = new NCMBPush();
    push.setAction("com.sample.pushsample.RECEIVE_PUSH");
    push.setTitle("test title");
    push.setMessage("send push!");
    push.setTarget(new JSONArray("[android]"));
    push.setDialog(true);
    push.sendInBackground(new DoneCallback() {
        @Override
        public void done(NCMBException e) {
            if (e != null) {
                // エラー処理
            } else {
                // プッシュ通知登録後の操作
            }
        }
    });
}

プッシュ通知のスケジューリング

プッシュ通知の配信時刻を指定することができます。

Date date = new Date();
date.setTime(date.getTime() + 60 * 60 * 3 * 1000);//3時間後に設定

NCMBPush push = new NCMBPush();
push.setMessage("test Push Notification");
push.setDeliveryTime(date);
push.sendInBackground();

配信端末の絞り込み

setSearchConditionメソッドでクエリを設定することにより、
プッシュ通知を配信する端末を絞り込むことができます。
端末情報をmobile backendに登録する時に任意の値を設定可能ですので、
Installationクラスの既存フィールド以外でも絞り込み条件を設定することができます。
以下の例はchannelsに"Ch1"が設定されている端末に向けてプッシュ通知を送信しています。

private void testPushWithSearchCondition(){
    NCMBPush push = new NCMBPush();
    NCMBQuery<NCMBInstallation> query = new NCMBQuery<>("installation");
    query.whereEqualTo("channels", "Ch1");
    push.setSearchCondition(query);
    push.setMessage("test SearchCondition");
    push.sendInBackground();
}

ダッシュボードからプッシュ通知を配信する

ここからは、ダッシュボードからプッシュ通知を配信する方法を説明します。

プッシュ通知を送信する

ダッシュボード左側メニューのプッシュ通知をクリックし、プッシュ通知の画面を開きます。

新しいプッシュ通知ボタンをクリックすると、プッシュ通知作成画面が表示されます。
このページで新たなプッシュ通知を作成できます。タイトル、メッセージ、JSONデータを記入してくだい。
※iOS宛プッシュ通知の設定は、iOS8未満は合計256バイトまで、iOS8以降は合計2Kバイトまでがサポート対象となります。
新規プッシュ通知作成

配信日時の指定を行います。以下の例では、作成されたプッシュ通知が即時に配信される設定になっています。

プッシュ通知送信日時を指定する場合は、配信日時の欄で日時を選択し、希望する日時を指定してください。

配信期限の指定では電源が切れているなどの事情により通知を受け取れなかった端末への再送信期間を設定できます。デフォルトの設定では再送信できる期間が10日間となっていますが1~28日間、1~24時間の間で、期間を指定できます。

また、配信時間を日時で指定する場合は、日時の指定画面が表示されます。

次に、配信を行うプラットフォームを選択してください。AndroidとiOSの両方にプッシュ通知を送信することも可能です。
Androidを選択した場合は、以下のようにアクション設定と、ダイアログ表示の設定画面が表示されます。
Android独自設定

iOSを選択した場合は、以下のようなiOS端末へのプッシュ通知を行うための設定画面が開きます。
iOS独自設定

最後に「プッシュ通知を作成する」ボタンをクリックすると、プッシュ通知が作成されます。

プッシュ通知でJSONデータを取得する

プッシュ通知にはJSON形式で任意のデータを含めることができるので、
プッシュ通知を受信した時に、そのデータを受け取って処理を行うことができます。

カスタムサービスを用意

SDKが用意しているNCMBGcmListenerServiceを継承して、
カスタムサービスを作成してください。

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>

JSONデータの取得を実装

CustomGcmListenerServiceクラスでonMessageReceivedメソッドをオーバーライドして、
プッシュ通知に含まれているJSONデータを取得します。
ペイロードからJSONデータを取得する場合は、
com.nifty.DataキーからJSONオブジェクトを作成してください。

@Override
public void onMessageReceived(String from, Bundle data) {
    //ペイロードデータの取得
    if (data.containsKey("com.nifty.Data")) {
        try {
            JSONObject json = new JSONObject(data.getString("com.nifty.Data"));
            Iterator keys = json.keys();
            while (keys.hasNext()) {
                String key = (String) keys.next();
                String value = json.getString(key);
                Log.d("tag", "key: " + key);
                Log.d("tag", "value: " + value);
            }
        } catch (JSONException e) {
            //エラー処理
        }
    }

    //デフォルトの通知が必要なければコメントアウトする
    super.onMessageReceived(from, data);
}

ペイロードの内容について

Android端末へのプッシュ通知では、以下のペイロードが受信されます。
v2よりパラメータ名に変更がありますのでご注意ください

パラメータ名 説明 データ型
com.nifty.PushId プッシュ通知ID 文字列
com.nifty.Data ユーザー設定値 オブジェクト
title タイトル 文字列
message メッセージ 文字列
action アクション 文字列
com.nifty.Channel チャネル 文字列
com.nifty.Dialog ダイアログ 1(固定)
com.nifty.RichUrl リッチプッシュ通知用URL 文字列







お探しの内容が見つからなかった場合はユーザーコミュニティ もご活用ください。(回答保証はいたしかねます)
なお、 Expertプラン以上のお客様はテクニカルサポートにてご質問を承らせて頂きます。

推奨画面サイズ1024×768px以上

ページの先頭へ