Android

GCM 2.0からFCMに移行する(AWS SNS対応版)

投稿日:

はじめに

あけましておめでとうございます! カイザーです!
今年よろしくお願いします!
さて、GCMが2019年4月に終了となります。1年前から非推奨となり、FCMへの移行が促されていますが、まだ移行できていない方もいるのではないでしょうか?
公式ガイドラインは、GCM3.0からの移行について記載されていますが、GCM2.0からの移行については記載されていません。
GCM2.0の特徴は、BroadcastRecieverを使った実装が行われていることす。もし、このような実装がされている場合、公式ガイドライン通りにはいきません。
今回は、GCM2.0から飛び級でFCMに移行する方法を説明します!

FCM移行で大事なポイント

FCM移行で大事なポイントは下記になります。

  • FCM移行するときは、必ずGCMのGCPプロジェクトを引き継ぐ形で、プロジェクトを新規作成する。
  • 既存のFirebaseプロジェクトに引き継ぐことはできない。
  • サーバサイド、Androidアプリサイドの移行は別々でも良い

まず1つ目。これを行わないと、GCMトークンとFCMトークンの互換性が失われます。引き継がずにプロジェクトを新規作成してしまうと、新しいアプリにはプッシュ通知が届かなくなってしまいます。
また、この状態でサーバに登録しているAPIキーを差し替えてしまうと、古いアプリにプッシュ通知が届かなくなってしまいます。

2つ目は、既存のFirebaseプロジェクトにもサーバーキーが割り当てられている理由により、不可能です。
そのため、新しくFirebaseプロジェクトを、GCPから引き継ぐ形で作成する必要があります。
ただし、既存のFirebaseプロジェクトと共存させることも可能です。この点についても説明して行きます。

3つ目ですが、GCMとFCMは互換性があるため、別々に対応できるということです。つまり、ダウンタイムなしに移行できます。
なお、AWS SNS側のFCM移行は対応しており、AWS SNSでGCM向けのメッセージをPublishすると、FCMのエンドポイントに送信されます。

これらを踏まえて、プロジェクトの引き継ぎから実装の修正までを説明します。

Firebaseプロジェクトへの引き継ぎ

FCM対応するには、まずFirebaseプロジェクトが必要になります。GCP上でGCMが設定されているGoogleアカウントにログインした状態で、Firebaseコンソールにアクセスします。
「プロジェクトの新規作成」を選択し、「プロジェクト名」右側の「▼」をクリックすると、引き継ぎ元GCPプロジェクトを選択できるので、引き継ぎたいGCMが設定されている物を選択します。

Firebaseの初期設定

新規作成の場合と同様、Firebaseの初期設定が必要になります。新しくAndroidアプリを追加しましょう。
Firebaseを初めて使用するプロジェクトの場合は、Android StudioのFirebase Assistantを使用してセットアップします。
既にFirebaseを組み込み済みのアプリの場合は、Firebaseのプロジェクトページからアプリを追加することになりますが、途中でダウンロードできるgoogle-services.jsonが使えませんので、最終ステップの疎通確認はスキップします。

依存ライブラリの変更

アプリレベルのbuild.gradleのうち、dependenciesを下記のように変更します。

“com.google.android.gms:play-services-gcm”を使用している場合

代わりに、”com.google.firebase:firebase-messaging”を使用しましょう。

“com.google.android.gms:play-services”を使用している場合

ライブラリのバージョンアップした上で、必要なサービスのみ追加することをオススメします。
その場合は、GCMの代わりに”com.google.firebase:firebase-messaging”を指定するのみになります。

非推奨ですが、どうしてもバージョンアップできない場合は、古いFirebaseライブラリを使用することで一時的に対応可能な場合もあります。
その場合は、”com.google.firebase:firebase-messaging”を追加の上、バージョンは使用しているPlay Servicesのバージョンと合わせてください。
また、”com.google.firebase:firebase-core”もバージョン違いでエラーとなる場合は、そちらもバージョンを合わせてください。

実装の変更

既存のFirebaseとの共存

既存のFirebaseと共存させる場合は、FCM用Firebaseの初期化処理を実装します。

アプリID、ウェブ APIキーは、それぞれFirebaseプロジェクトの設定から取得してください。

メッセージ受信用BroadcastRecieverの廃止

GCM2.0では、下記のようなBroadcastReceiverを自前で定義していました。

FCMではBroadcastReceiverは自前で定義する必要がありませんので、削除します。
AndroidManifest.xml上では、下記を削除します。

代わりに「FirebaseMessagingService」を継承したクラスを作成し、これまでのGcmBroadcastReceiver#onReceive()に実装した内容を移植します。
ついでに、Kotlinにしました。

AndroidManifestは下記を追記します。

なお、GCM2.0の実装では、下記考慮によりBroadcastRecieverからサービス起動を行なっていたと思いますが、そちらもそれぞれ修正する必要があります。

Android 6以降のDozeモード対応

Dozeモード対応のため、ServiceをWakefulStartしていた箇所は、WakefulStartなしにそのままサービスを起動することができます。
FirebaseMessagingService自体が、受信メッセージの優先度が高い場合のみ、自動的にDozeモードを抜けるようになっているためです。
AWS SNSでFCMに優先度の高いメッセージを配信するには、下記のように「priority」キーを追加し、「high」を設定します。

Android 8でのバックグラウンド制限対応

GCM時代から引き続き対応が必要になります。これは基本的には既存対応で良いですが、GCM 2.0の実装の場合、IntentServiceをforegroundStartしていることもあると思います。
しかし、FirebaseMessagingServiceではIntentが引数で渡らなくなったため、これを機に「JobScheduler」に移行することをオススメします。
ただし、API Level 21以上から使用可能であるため、20以下をサポートするには「FirebaseJobDispatcher」を使用することをオススメします。

Registration ID受信用のBroadcastReceieverの廃止

こちらも同じように実装を差し替えます。
既存のRegistration ID受信用レシーバを削除します。AndroidManifest.xmlでは下記を削除します。

実装は、FCMのライブラリのバージョンが、17.1.0以上かどうかで変わります。

FCMのバージョンが17.1.0以上の場合

先ほど作成した「MyFcmListenerService」クラスに、下記を追加します。

FCMのバージョンが17.0.0以下の場合

最新バージョンを使用することがベストですが、止むを得ず旧バージョンを使用する場合は、非推奨ですが下記のように実装します。
まず、FirebaseInstanceIdServiceを継承したサービスクラスを作成します。

次に、AndroidManifestでサービス登録します。

 

トークン取得処理の変更

FCMからトークンを取得するように実装変更します。

FCMのバージョンが17.1.0以上の場合

非同期で取得します。

複数のFirebaseプロジェクトを共存させている場合は、下記のようにします。

FCMのバージョンが17.0.0以下の場合

同期で取得します。

複数のFirebaseプロジェクトを共存させている場合は、下記のようにします。

AWS SNS側の対応

GCPプロジェクトの引き継ぎを行ったので、実は対応すべき設定はありません。AWS SNSは既にFCMのエンドポイントに接続しているためです。
引き続き以前のサーバーキーを使用することができますが、新しいサーバーキーに移行することが推奨されているため、必要に応じてこちらも移行しておきましょう。
新しいサーバーキーは、Firebaseの設定画面の「クラウドメッセージング」から取得できます。

さいごに

今後、モバイルアプリ向けのGoogleサービスが、さらにFirebaseに移行されることが考えられます。
既に、モバイルアプリ向けGoogleアナリティクスSDKは、Firebase向けGoogleアナリティクスSDKに移行する必要があります。
Android開発者としては、今後のFirebase移行の動向をキャッチアップして行きたいと思います。

おすすめ書籍

Kotlinスタートブック -新しいAndroidプログラミング Kotlinイン・アクション 速習 Kotlin: Javaより簡単!新Android開発言語を今すぐマスター 速習シリーズ

blog-page_footer_336




blog-page_footer_336




-Android
-, , , ,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Kotlinでクラスのネストについて

1 はじめに2 クラスのネスト3 内部クラス3.1 Javaコードとの比較4 さいごに5 おすすめ書籍 はじめに こんにちは。引き続きKotlinの基本文法で、今回はクラスのネストについてです。 Ja ...

GoogleMap Clusterのカスタマイズ

1 はじめに2 クラスタ内のアイテムクラス3 クラスタをレンダリングするクラス4 クラスタの色を設定する5 クラスタ化の最小個数を設定する6 クラスタのクリックイベントを拾う7 さいごに はじめに 最 ...

AndroidでWebViewを使用するときに気をつけたいポイント追加4選!

1 はじめに2 Cookie2.1 Cookieを設定する2.2 Cookieを取得する3 ハンドリングの効かないページ遷移3.1 POSTでのページ遷移3.2 PDFなど、WebViewで開くことの ...

KotlinでAndroidの双方向DataBindingを利用する

1 はじめに2 MVVMアーキテクチャ2.1 Model2.2 View2.3 ViewModel3 KotlinでAndroid DataBindingを設定4 説明用のサンプルアプリについて5 a ...

[Androidアニメーション]Shared Elements遷移

1 はじめに2 Shared Elements遷移とは3 layout xml4 Activity遷移5 その他6 さいごに はじめに 最近、雨が多いですね。そんな時は家にこもって、プログラミングをす ...

フォロー

blog-page_side_responsive

2019年1月
 12345
6789101112
13141516171819
20212223242526
2728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。