Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@Moris_Mk-II

[Android] NCMBプッシュ通知を実装する際の注意点

More than 1 year has passed since last update.

NCMBのプッシュ通知を実装しました。
公式チュートリアルの情報量が少なく、ハマりポイントが多いです。
備忘録としてハマった点をざっくり挙げます。
導入手順はリンクを参照してください。

ライブラリの導入

今回はNCMBの導入は済んでいるものとして、プッシュ機能に必要な情報だけ記述しようと思います。NCMB自体の導入方法は公式チュートリアルを参照してください。

Firebaseとの連携

新規にプッシュ通知機能を実装する場合はGCM(GoogleCloudMessaging)の新しいバージョンであるFCM(FirebaseCloudMessaging)を利用することになります。Firebase導入手順は、
1. Firebase Consoleにて自分のプロジェクトを登録
2. Firebaseの設定ファイルをダウンロード
3. プロジェクトにimport
という感じになります。

ハマりポイント

  • 設定ファイルはgoogle_service.jsonというファイルになるのですが、このファイルの格納位置はapp/直下でなければなりません。格納した後はbuild.gradle(Project)のclasspathで指定してあげましょう。
    -階層
    スクリーンショット 2016-12-18 15.45.26.png
    -build.gradle(Project)
    スクリーンショット 2016-12-18 15.51.57.png

  • build.gradleでFirebaseをコンパイルさせるのですが、play-servicesfirebaseのバージョンを合わせないとエラーを吐きます
    スクリーンショット 2016-12-18 16.02.57.png
    これでFirebaseの導入は完了です。

Manifestの定義

次に、プッシュ通知を受け取るためにManifestを編集しましょう。プッシュ通知に対するパーミッションとmeta情報の追加、レシーバーとサービスの指定をしています。
ざっくりしか挙げないので詳細は公式チュートリアル(Push通知)を参照してください。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="プロジェクトパッケージ">

    <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
        android:name="com.nifty.cloud.mb.core.NCMBApplicationController"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.DarkActionBar">

        <!-- プッシュ通知タップ時に起動するActivityの設定(必須) -->
        <meta-data android:name="openPushStartActivity" android:value="任意のActivity"/>
        <!-- 通知エリアに表示されるアイコンの設定(option) -->
        <meta-data android:name="smallIcon" android:resource="任意の画像データ"/>
        <!-- 通知エリアにプッシュ通知を複数表示する設定 0:最新のみ表示 , 1:複数表示(option) -->
        <meta-data android:name="notificationOverlap" android:value="1"/>

        <!--PushNotificationReceiver-->
        <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>
        <!--PushNotificationService-->
        <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>

        <activity
            android:name=".PushTestActivity"
            android:label="@string/app_name">
        </activity>
    </application>
</manifest>

ハマりポイント

  • Firebase連携のハマりポイントに挙げているので大丈夫だとは思いますが、ここで指定しているレシーバーとサービスはplay-services内のクラスを継承しているので、build.gradleできちんとplay-servicesもしくはplay-services-gcmをコンパイルしていないと動作してくれません。僕はここでかなりハマりました。

コーディング

コードではFCMに端末のIDを登録すればいいだけです。サンプルコードのほぼ丸写しです。SENDER IDはFCM連携に必要な設定を参照してください。

PushTestActivity.java
public class PushTestActivity extends Activity {

    //NCMB DBのappKeyとclientKey
    private final static String APP_KEY = "API KEY";
    private final static String CLIENT_KEY = "CLIENT KEY";
    //Firebase senderID
    private final static String SENDER_ID = "SENDER ID";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_push_test);

        //NCMBの初期化
        NCMB.initialize(this.getApplicationContext(), APP_KEY, CLIENT_KEY);

        //FCMに端末IDを登録
        final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();
        installation.getRegistrationIdInBackground(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) {
                                //保存成功
                                Log.d(CLASS_TAG, "登録成功");
                            } else if (NCMBException.DUPLICATE_VALUE.equals(e.getCode())) {
                                updateInstallation(installation);
                            } else {
                                Log.d(CLASS_TAG, "保存失敗");
                            }
                        }
                    });
                } else {
                    Log.d(CLASS_TAG, "取得失敗");
                }
            }
        });
    }

    public static void updateInstallation(final NCMBInstallation installation) {
        NCMBQuery<NCMBInstallation> query = NCMBInstallation.getQuery();
        query.whereEqualTo("deviceToken", installation.getDeviceToken());
        query.findInBackground(new FindCallback<NCMBInstallation>() {
            @Override
            public void done(List<NCMBInstallation> list, NCMBException e) {
                installation.setObjectId(list.get(0).getObjectId());
                installation.saveInBackground();
            }
        });
    }
}

DB上のInstallationクラスにデバイストークンが登録されていることを確認したら、ダッシュボード上でプッシュ通知の送信をしてみましょう。多分届くはずです。送信方法は公式チュートリアル(Push通知)の下の方に書いてあります。

まとめ

Firebaseと連携してNCMB PushNotificationを実装する文献は見当たらなかったのまとめてみました。全部説明すると長くなるのでリンクに頼っているところが大きいですが、注意すべき点は挙げられたと思います。
おかしな所や追加すべき点がありましたらご教授願います。

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Moris_Mk-II
好きな役満はシーサンプータ

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?