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

トップ >ドキュメント >SDKガイド(Android):プッシュ通知

SDKガイド(Android)

プッシュ通知

このドキュメントは更新されていません。
こちらから最新版をご覧ください。

Android端末へのプッシュ通知について

アプリにプッシュ通知機能を組み込むための準備として、以下の2つが必要です。

  • ダッシュボードでGCM/APNsと連携するための設定
  • アプリ側でプッシュ通知を受信する処理を用意

GCMと連携するためのAPIキーの取得方法については、GCMとの連携に必要な準備をご覧ください。
ダッシュボードの設定については、ダッシュボードの使いかた:プッシュ通知をご覧ください。
このページでは、SDKを使ったプッシュ通知の送受信について説明します。

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

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

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

プッシュ通知を受信する

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

  • Android Support Library
  • Google Play Services SDK

事前にSDK Managerでのインストールを行い、build.gradleを以下の用に変更してください。

dependencies {
    compile 'com.android.support:appcompat-v7:23.0.1'    //プッシュ通知用に追加
    compile 'com.google.android.gms:play-services:8.1.0' //プッシュ通知用に追加
    compile 'com.google.code.gson:gson:2.3.1'
    compile files('libs/NCMB.jar')
}

AndroidManifest.xmlの設定

プッシュ通知を利用するためAndroidManifest.xmlの<application>の前に以下を記載してください。
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の登録
<receiver
    android:name="com.google.android.gms.gcm.GcmReceiver"
    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で設定項目を追加できるようになりました。
<application>の後に以下を記載してください。
プッシュ通知タップ時に起動するActivityの設定は必須の設定となります。

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

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

<!-- 通知エリアに表示されるアイコンカラーの設定 -->
<meta-data android:name="smallIconColor" android:value="@color/カラー名"/>

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

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

配信端末情報の登録

プッシュ通知を行う端末を、配信端末情報として登録します。
以下の端末情報の登録処理を、プッシュ通知を受信するアクティビティのonCreateメソッド内に記入してください。
senderIdには、GCMサービスの利用開始時にgoogleのconsoleサイトに記載されるProject Numberを設定します。

また、AndroidManifestのmeta-dataに
デフォルトで動作するアクティビティを指定しておく必要があります。

final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();
//GCMからRegistrationIdを取得
installation.getRegistrationIdInBackground("senderId", new DoneCallback() {
    @Override
    public void done(NCMBException e) {
        if (e == null) {
            //ID取得成功
            try {
                //mBaaSに端末情報を保存
                installation.save();
            } catch (NCMBException saveError) {
                //保存失敗
            }
        } else {
            //ID取得失敗
        }
    }
});

channelsが指定されたプッシュ通知を受信する

Android端末へのプッシュ通知でchannelsを使用する場合は、
通知タップ時に起動するアクティビティ(必要であればicon)を設定します。
※v2よりNCMBInstallationクラス内の実装になります

  • channelsの登録
//※v2よりサーバーへのchannels保存処理が必要になりました
//Ch1がchannelsに指定されたプッシュ通知を受信した際に、MainActivityが起動し指定したアイコンが通知エリアに表示されるように設定しています
try {
    NCMBInstallation.subscribe("Ch1", MainActivity.class, R.drawable.ch1);
    NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();
    JSONArray channels = new JSONArray();
    channels.put("Ch1");
    installation.setChannels(channels);
    installation.save();
} catch (Exception e) {
    //エラー処理
}

  • channelsの取得
NCMBInstallation.getSubscriptions();

  • channelsの削除
//※v2よりサーバーへのchannels削除処理が必要になりました
try {
    NCMBInstallation.unsubscribe("Ch1");
    NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();
    JSONArray channels = new JSONArray();
    installation.setChannels(channels);
    installation.save();
} catch (Exception e) {
    //エラー処理
}

受信時の動作のカスタマイズ

Androidでは、カスタムサービスを作成して、プッシュ通知受信時の動作をカスタマイズできます。
実装はNCMBGcmListenerServiceを継承しonMessageReceivedメソッドをOverrideします。

  • AndroidManifest.xmlで必要な設定
<!--登録したserviceのandroid:nameを"パッケージ名.MyCustomService"に変更します-->
<service
    android:name="パッケージ名.MyCustomService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
    </intent-filter>
</service>

  • カスタムサービスを作成
public class MyCustomService extends NCMBGcmListenerService {

    @Override
    public void onMessageReceived(String from, Bundle data) {
        //プッシュ通知受信時の挙動をカスタマイズ


        //デフォルトの通知を実行する場合はsuper.onMessageReceivedを実行する
        //super.onMessageReceived(from, data);
    }
}

Notificationの設定のみ修正

NotificationCompat.Builderの設定のみを書き換える事も出来ます。
その場合はnotificationSettingsメソッドをOverrideします。

@Override
public NotificationCompat.Builder notificationSettings(Bundle data){
    //NotificationCompat.Builderの設定を行いreturnする
}

デフォルトのNotificationCompat.Builderについては以下が設定されています。

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(icon)//通知エリアのアイコンを設定(AndroidManifestで設定したiconを設定)
        .setColor(smallIconColor)//通知エリアのアイコンカラーを設定(AndroidManifestで設定したiconカラーを設定)
        .setContentTitle(title)//data内のtitleの値を設定
        .setContentText(message)//data内のmessageの値を設定
        .setAutoCancel(true)//通知をタップ時に自動で削除する
        .setSound(defaultSoundUri)//端末のデフォルトサウンド
        .setContentIntent(pendingIntent);//通知をタップした際に起動するActivity(AndroidManifestで設定したActivityを起動する)

ペイロードデータの取得

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

  • カスタムサービスを修正
@Override
public void onMessageReceived(String from, Bundle data) {
    //ペイロードデータの取得
    String action = data.getString("action");
    String channel = data.getString("com.nifty.Channel");
    Log.d("tag", "action:" + action);
    Log.d("tag", "channel:" + channel);
    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);
}

リッチプッシュ通知を行う

リッチプッシュ通知とは、プッシュ通知配信時に指定したWebページを受信後に開くものです。
リッチプッシュ通知を表示するためには、ActivityのonResumeメソッドで、richPushHandlerを利用します。

@Override
public void onResume() {
    super.onResume();
    NCMBPush.richPushHandler(this, getIntent());
    //リッチプッシュを再表示させたくない場合はintentからURLを削除します
    getIntent().removeExtra("com.nifty.RichUrl");
}

ダイアログ表示を行う:(1)カスタムサービス作成

Android端末への配信時にダイアログ表示を有効にすることで、プッシュ通知画面をカスタマイズすることができます。
SDKからプッシュ通知を送信する際にダイアログ表示を有効にする場合は、setDialogメソッドを利用します。
※v2よりアクションの設定が必須ではなくなりました

push.setDialog(true);

まずは、ダイアログプッシュ通知を表示するためのアクティビティとカスタムサービスを作成します。
AndroidManifest.xmlに、以下のような定義が必要です。

<activity
    android:name="com.nifty.cloud.mb.core.NCMBDialogActivity"
    android:excludeFromRecents="true"
    android:launchMode="singleInstance"
    android:noHistory="true"
    android:theme="@android:style/Theme.Wallpaper.NoTitleBar">
</activity>

カスタムサービス内にダイアログを表示するための処理を記述していきます。
カスタムサービスの作成方法は前述の「受信時の動作のカスタマイズ」を参照してください。

ダイアログ表示を行う:(2)ダイアログプッシュ通知の設定

カスタムサービスクラス内で、
NCMBDialogPushConfigulationクラスのインスタンスを作成し、
ダイアログのタイプを選択してください。

//NCMBDialogPushConfigurationクラスのインスタンスを作成
NCMBDialogPushConfiguration dialogPushConfiguration = new NCMBDialogPushConfiguration();


/*** 4つのダイアログタイプから1つを設定する ****/

//ダイアログを設定しないタイプ
dialogPushConfiguration.setDisplayType(NCMBDialogPushConfiguration.DIALOG_DISPLAY_NONE);

//標準的なダイアログを表示するタイプ
dialogPushConfiguration.setDisplayType(NCMBDialogPushConfiguration.DIALOG_DISPLAY_DIALOG);

//背景画像を設定するタイプ
dialogPushConfiguration.setDisplayType(NCMBDialogPushConfiguration.DIALOG_DISPLAY_BACKGROUND);

//オリジナルのレイアウトを設定するタイプ
dialogPushConfiguration.setDisplayType(NCMBDialogPushConfiguration.DIALOG_DISPLAY_ORIGINAL);

各タイプの表示例は以下のようになります。
ダイアログプッシュの例

背景画像を設定する場合は背景画像をプロジェクト内のres/drawableフォルダ内に画像を用意し、
以下の処理をAndroidManifestに記載します。
※v2より画像の書き出しの設定は必要なくなりました

<!-- ダイアログプッシュの背景画像の設定 -->
<meta-data android:name="dialogPushBackgroundImage" android:resource="@drawable/balloon"/>

オリジナルのレイアウトを用意する場合は、
プロジェクト内のres/layoutフォルダ内にncmb_notification_dialog.xmlを用意してください。
レイアウトファイル内では、各要素に以下のような名前を使って下さい。

  • 題名(textView):ncmb_dialog_subject_id
  • メッセージ(textView):ncmb_dialog_message_id
  • 閉じるボタン(Button):ncmb_button_close
  • 表示ボタン(Button):ncmb_button_open

以下のコードは、layout.xml内で閉じるボタンが定義されている場所です。上に書いた名前を、「android:id=名前」の形式で指定します。

<Button android:id="@+id/ncmb_button_close"
    android:textColor="#0000ff"
    android:height="40dp"
    android:textSize="16sp"
    android:layout_height="wrap_content"
    android:layout_width="0dip"
    android:layout_weight="1"
    android:text="閉じる"
    android:background="@drawable/fr_dialog_shape_button_corners"
/>

ダイアログ表示を行う:(3)DialogPushHandlerの呼び出し

最後に、カスタムサービスの中でDialogPushHandlerを呼び出すことにより、
ダイアログプッシュ通知が表示されるようになります。

NCMBPush.dialogPushHandler(context, intent, dialogPushConfiguration);

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

ダッシュボードだけでなく、アプリからも他の端末へプッシュ通知を送信することができます。
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();
}

プッシュ通知の開封通知

プッシュ通知の開封通知を登録しておくことで、
ダッシュボードからプッシュ通知の開封率を閲覧することができます。

プッシュ通知を受信したときに起動するActivityのonCreateメソッドに
以下のようにNCMBAnalytics.trackAppOpened(intent)メソッドを追加することで、開封通知を登録できます。
※v2よりNCMBPushクラスでの実装となります。

NCMBPush.trackAppOpened(intent);

アプリの再インストールを考慮した端末情報の登録

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

以下はエラー処理を実装したサンプルコードとなります。

final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();
        //GCMからRegistrationIdを取得しinstallationに設定する
installation.getRegistrationIdInBackground("senderId", new DoneCallback() {
    @Override
    public void done(NCMBException e) {
        if (e == null) {
            //ID取得成功
            try {
                //mBaaSに端末情報を保存
                installation.save();
            } catch (NCMBException saveError) {
                if (NCMBException.DUPLICATE_VALUE.equals(saveError.getCode())) {
                    // レジストレーションIDの重複エラー
                    // ユーザーによるローカルデータ削除や、アプリ再インストールがされた場合に発生。
                    // 以下、クラウド側に既登録の情報からローカルデータを復旧する処理。
                    NCMBQuery<NCMBInstallation> query = new NCMBQuery<>("installation");
                    query.whereEqualTo("deviceToken", installation.getDeviceToken());
                    try {
                        NCMBInstallation prevInstallation = query.find().get(0);
                        String objectId = prevInstallation.getObjectId();
                        installation.setObjectId(objectId);
                        installation.save();
                    } catch (NCMBException le2) {
                        //更新失敗
                        error = le2;
                    }
                } else {
                    //保存失敗
                    error = saveError;
                }
            }
        } else {
            //ID取得失敗
            error = e;
        }
        TestCompletion = true;
    }
});







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

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

ページの先頭へ