Android で GCM から FCM に乗り換える

Android で GCM から FCM に乗り換える

通勤時の電車で普段はあまり見ることのない子供たちを見かけ
ああ、今年も夏がやってきたんだなと感じました。

こんにちは、にいたかです。
今回は Android で実装するプッシュ通知まわりの話をしたいと思います。

アプリでプッシュ通知の機能を実装するため Google が提供している GoogleCloudMessaging(以下、GCM) を使っていたのですが Google I/O 2016 で発表された FirebaseCloudMessaging(以下、FCM) がいいらしいので早速使ってみることにしました。

特に実装面で、どれぐらいの変更が必要なんだろうというところが気になったので、変更前と変更後で diff をとって確認してみたいと思います。

FCM とは

image00

Firebase Cloud Messaging (FCM) is the new version of GCM. It inherits the reliable and scalable GCM infrastructure, plus new features! See the FAQ to learn more. If you are integrating messaging in a new app, start with FCM. GCM users are strongly recommended to upgrade to FCM, in order to benefit from new FCM features today and in the future.

Migrate a GCM Client App for Android to Firebase Cloud Messaging | Cloud Messaging | Google Developers

以下、雑な訳です。

Firebase Cloud Messaging (FCM) は GCM の新しいバージョンだよ。GCM の信頼性や構造は引き継いでるし、さらに新しい機能も追加されてるんだぜ!詳しくは FAQ を見てほしい。… GCM ユーザは新しい FCM の恩恵が受けられるように FCM に移行することを強く勧めるよ。

と、強く勧められたので移行することにします!
前提として GCM のプロジェクトは Set up a GCM Client App on Android の手順で作ります。

移行時にすること

N825_kurayamidePCwotukau_TP_V
1. Firebase console にプロジェクトの追加
2. build.gradle などの各種変更

変更箇所については以下 diff で。

build.gradle

@@ -6,7 +6,7 @@ buildscript {
     }
     dependencies {
         classpath 'com.android.tools.build:gradle:2.1.2'
-        classpath 'com.google.gms:google-services:2.0.0-alpha6'
+        classpath 'com.google.gms:google-services:3.0.0'

         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files

app/build.gradle

@@ -1,5 +1,4 @@
 apply plugin: 'com.android.application'
-apply plugin: 'com.google.gms.google-services'

 android {
     compileSdkVersion 23
@@ -24,5 +23,7 @@ dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
     testCompile 'junit:junit:4.12'
     compile 'com.android.support:appcompat-v7:23.4.0'
-    compile 'com.google.android.gms:play-services-gcm:8.3.0'
+    compile 'com.google.firebase:firebase-messaging:9.0.0'
 }
+
+apply plugin: 'com.google.gms.google-services'

AndroidManifest.xml

@@ -3,7 +3,6 @@
     package="jp.co.lanches.hoge.sample">

     <!-- [START add] -->
-    <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
     <!-- [END add] -->

@@ -22,21 +21,11 @@
         </activity>

         <!-- [START add] -->
-        <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="jp.co.lanches.hoge.sample" />
-            </intent-filter>
-        </receiver>
-
         <service
             android:name=".service.GCMListenerService"
             android:exported="false">
             <intent-filter>
-                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
+                <action android:name="com.google.firebase.MESSAGING_EVENT" />
             </intent-filter>
         </service>

@@ -44,7 +33,7 @@
             android:name=".service.GCMInstanceIDListenerService"
             android:exported="false">
             <intent-filter>
-                <action android:name="com.google.android.gms.iid.InstanceID" />
+                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
             </intent-filter>
         </service>

service/GCMInstanceIDListenerService.java

@@ -1,10 +1,11 @@
 package jp.co.lanches.hoge.sample.service;

-import android.content.Intent;
+import android.util.Log;

-import com.google.android.gms.iid.InstanceIDListenerService;
+import com.google.firebase.iid.FirebaseInstanceId;
+import com.google.firebase.iid.FirebaseInstanceIdService;

-public class GCMInstanceIDListenerService extends InstanceIDListenerService {
+public class GCMInstanceIDListenerService extends FirebaseInstanceIdService {

     public static final String TAG = "InstanceIDLS";

@@ -13,7 +14,7 @@ public class GCMInstanceIDListenerService extends InstanceIDListenerService {
      */
     @Override
     public void onTokenRefresh() {
-        Intent intent = new Intent(this, GCMRegistrationIntentService.class);
-        startService(intent);
+        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
+        Log.d(TAG, "Refreshed token: " + refreshedToken);
     }
 }

service/GCMListenerService.java

@@ -6,23 +6,27 @@ import android.content.Context;
 import android.content.Intent;
 import android.media.RingtoneManager;
 import android.net.Uri;
-import android.os.Bundle;
 import android.support.v4.app.NotificationCompat;
 import android.util.Log;

-import com.google.android.gms.gcm.GcmListenerService;
+import com.google.firebase.messaging.FirebaseMessagingService;
+import com.google.firebase.messaging.RemoteMessage;
+
+import java.util.Map;

 import jp.co.lanches.hoge.sample.MainActivity;
 import jp.co.lanches.hoge.sample.R;

-public class GCMListenerService extends GcmListenerService {
+public class GCMListenerService extends FirebaseMessagingService {

     private static final String TAG = "ListenerService";

     @Override
-    public void onMessageReceived(String from, Bundle data) {
-        String message = data.getString("message");
-        sendNotification(message);
+    public void onMessageReceived(RemoteMessage message) {
+        String from = message.getFrom();
+        Map data = message.getData();
+        String dataMessage = data.get("message").toString();
+        sendNotification(dataMessage);
     }

     private void sendNotification(String message) {

service/GCMRegistrationIntentService.java

@@ -2,12 +2,6 @@ package jp.co.lanches.hoge.sample.service;

 import android.app.IntentService;
 import android.content.Intent;
-import android.util.Log;
-
-import com.google.android.gms.gcm.GoogleCloudMessaging;
-import com.google.android.gms.iid.InstanceID;
-
-import jp.co.lanches.hoge.sample.R;

 public class GCMRegistrationIntentService extends IntentService {

@@ -18,14 +12,5 @@ public class GCMRegistrationIntentService extends IntentService {

     @Override
     protected void onHandleIntent(Intent intent) {
-        try {
-            InstanceID instanceID = InstanceID.getInstance(this);
-            String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
-                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
-
-            Log.i(TAG, "Registration token: " + token);
-        } catch (Exception e) {
-            Log.i(TAG, "Failed to complete token refresh", e);
-        }
     }
 }

最後の service/GCMRegistrationIntentService.java は AndroidManifest.xml に残っているので onHandleIntent() 内のコードを消しただけです。

にいたかはこう思いました

こうして差分を見ると、コードの量が大幅に削減されてますね。GCM の頃からそれほどコード量は多くはありませんでしたが、さらに削減されたようです。「君たちは、書くべきコードに集中すればいいんだよ!」と言われているみたいですね。なんだかオラ元気がわいてきたっぞ!

それでは、よい Android ライフを!

TAG

  • このエントリーをはてなブックマークに追加
admin
管理者 admin admin