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 と書かれた方がアプリの設定となります。

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

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

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

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

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

 1apply plugin: 'com.android.application'
 2
 3android {
 4    // (中略)
 5}
 6
 7dependencies {
 8    // 以下の行を追加してください
 9    compile 'com.google.firebase:firebase-messaging:11.8.0' // Firebase Cloud Messaging
10}
11
12// 最後の行に以下を追加してください。
13apply plugin: 'com.google.gms.google-services'

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

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

 1package jp.co.fenrir.pushsample;
 2
 3import com.google.firebase.iid.FirebaseInstanceId;
 4import com.google.firebase.iid.FirebaseInstanceIdService;
 5
 6public class InstanceIdService extends FirebaseInstanceIdService {
 7
 8    @Override
 9    public void onTokenRefresh() {
10        super.onTokenRefresh();
11
12        String token = FirebaseInstanceId.getInstance().getToken();
13
14        // TODO token をサーバーへ送信します
15    }
16}

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

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

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

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

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

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

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

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

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

 1package jp.co.fenrir.pushsample;
 2
 3import com.google.firebase.messaging.FirebaseMessagingService;
 4import com.google.firebase.messaging.RemoteMessage;
 5
 6import java.util.Map;
 7
 8public class MessagingService extends FirebaseMessagingService {
 9
10    @Override
11    public void onMessageReceived(RemoteMessage remoteMessage) {
12        super.onMessageReceived(remoteMessage);
13
14        // 通知メッセージ(notification)の内容
15        RemoteMessage.Notification notification = remoteMessage.getNotification();
16
17        // データメッセージ(data)の内容
18        Map<String, String> data = remoteMessage.getData();
19        
20        // TODO: ここに通知を受けてする動作を記述します
21    }
22}

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

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

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

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

お問い合わせはこちら