Android で GCM から FCM に乗り換える
通勤時の電車で普段はあまり見ることのない子供たちを見かけ
ああ、今年も夏がやってきたんだなと感じました。
こんにちは、にいたかです。
今回は Android で実装するプッシュ通知まわりの話をしたいと思います。
アプリでプッシュ通知の機能を実装するため Google が提供している GoogleCloudMessaging(以下、GCM) を使っていたのですが Google I/O 2016 で発表された FirebaseCloudMessaging(以下、FCM) がいいらしいので早速使ってみることにしました。
特に実装面で、どれぐらいの変更が必要なんだろうというところが気になったので、変更前と変更後で diff をとって確認してみたいと思います。
FCM とは
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.
以下、雑な訳です。
Firebase Cloud Messaging (FCM) は GCM の新しいバージョンだよ。GCM の信頼性や構造は引き継いでるし、さらに新しい機能も追加されてるんだぜ!詳しくは FAQ を見てほしい。… GCM ユーザは新しい FCM の恩恵が受けられるように FCM に移行することを強く勧めるよ。
と、強く勧められたので移行することにします!
前提として GCM のプロジェクトは Set up a GCM Client App on Android の手順で作ります。
移行時にすること
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
-
TAG
- Android
- AWS
- Bitrise
- CodePipeline
- Firebase
- HTML
- iOS
- IoT
- JavaScript
- KPI
- Linux
- Mac
- Memcached
- MGRe
- MGReのゆるガチエンジニアブログ
- MySQL
- PHP
- PICK UP
- PR
- Python
- Ruby
- Ruby on Rails
- SEO
- Swift
- TIPS
- UI/UX
- VirtualBox
- Wantedly
- Windows
- アクセス解析
- イベントレポート
- エンジニアブログ
- ガジェット
- カスタマーサクセス
- サーバ技術
- サービス
- セキュリティ
- セミナー・展示会
- テクノロジー
- デザイン
- プレスリリース
- マーケティング施策
- マネジメント
- ラボ
- リーンスタートアップ
- 企画
- 会社紹介
- 会社紹介資料
- 勉強会
- 実績紹介
- 拡張性
- 採用
- 日常
- 書籍紹介
- 歓迎会
- 社内イベント
- 社員インタビュー
- 社長ブログ
- 視察
- 開発環境