Android での一般的な実装方法

Android アプリへプッシュ通知を実装し、プッシュトークンを得るための実装方法をご紹介します。

Android では時期によって組み込み方が大きく異なりますが、ここでは2018年2月現在主流となっている Firebase SDK を使用した方法をご紹介します。

Firebase Cloud Messaging との接続設定

アプリに Firebase との接続設定を加えます。

google-services.json の追加

Android Studio の Project ウィンドウを[Project Files]モードに切り替え、Firebase 登録時にダウンロードした google-services.json ファイルを app フォルダに移動します。

build.gradle の編集

次に、build.gradleを編集します。ここで編集する build.gradle はプロジェクト全体設定とアプリの2カ所あります。Project ウィンドウを[Android]に切り替えると、Gradle Scripts という項目がありますが、ここで Project と書かれた方がプロジェクト全体の設定、 Module: app と書かれた方がアプリの設定となります。

まず、プロジェクト全体設定の方を以下のように編集します。

1
2
3
4
5
6
7
8
buildscript {
    // (中略)
    dependencies {
        // 以下の行を追加してください
        classpath 'com.google.gms:google-services:3.1.1' // google-services plugin
    }
}
// (以下略)

Android Studio 3.0 未満をお使いの場合は、以下の追加も必要です。

1
2
3
4
5
6
7
8
9
allprojects {
    // (中略)
    repositories {
        // (中略)
        maven {
            url "https://maven.google.com" // Google's Maven repository
        }
    }
}

次に、アプリの設定を編集します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apply plugin: 'com.android.application'

android {
    // (中略)
}

dependencies {
    // 以下の行を追加してください
    compile 'com.google.firebase:firebase-messaging:11.8.0' // Firebase Cloud Messaging
}

// 最後の行に以下を追加してください。
apply plugin: 'com.google.gms.google-services'

トークン受信用サービスの追加

アプリの起動時やトークンの変更時に変更を受信するサービスを追加します。FirebaseInstanceIdService を継承したサービスを作成します。トークンの受信時に onTokenRefresh が呼ばれますのでこの中でサーバーへの登録処理を行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package jp.co.fenrir.pushsample;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

public class InstanceIdService extends FirebaseInstanceIdService {

    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();

        String token = FirebaseInstanceId.getInstance().getToken();

        // TODO token をサーバーへ送信します
    }
}

AndroidManifest.xml には以下のように記述して登録します。

1
2
3
4
5
<service android:name=".InstanceIdService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

プッシュメッセージ受信サービスの作成

FCM での通知は「通知メッセージ」と「データメッセージ」の2種類あります。

「通知メッセージ」を使用した場合、アプリがバックグラウンドにある場合は FCM の SDK により端末の通知領域に自動で表示されます。簡単に扱える一方、フォアグラウンド時に表示されない・細かいカスタマイズが効かないといったデメリットがあります。

「データメッセージ」では、通知をトリガーにプログラムを動作させることができ、表示させる通知内容をカスタマイズすることができます。

データメッセージおよび、フォアグラウンド時に受信した通知メッセージはメッセージ受信サービスに送信されます。この関係を表にすると以下のようになります。

アプリの状態 通知メッセージ データメッセージ 両方含まれるメッセージ
フォアグラウンド メッセージ受信サービスに着信 メッセージ受信サービスに着信 メッセージ受信サービスに着信
バックグラウンド 通知領域に表示 メッセージ受信サービスに着信 通知領域に表示(インテントにデータが含まれる)

メッセージ受信サービスは FirebaseMessagingService を継承したサービスを作成することで作成できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package jp.co.fenrir.pushsample;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import java.util.Map;

public class MessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        // 通知メッセージ(notification)の内容
        RemoteMessage.Notification notification = remoteMessage.getNotification();

        // データメッセージ(data)の内容
        Map<String, String> data = remoteMessage.getData();
        
        // TODO: ここに通知を受けてする動作を記述します
    }
}

AndroidManifest.xmlには以下のように記述して登録します。

1
2
3
4
5
6
<service
    android:name=".MessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

ご不明な点はありませんか?

機能の詳細、導入のご検討、お見積もり依頼などは、お気軽にお問い合わせください。
担当者から追ってご連絡いたします。

お問い合わせはこちら