Androidアプリでプッシュ通知連携した時の設定関連について
IT技術
はじめに
作業の中でWebシステム内のトリガーを条件に、Androidのアプリでプッシュ通知をしたい、ということがありました。
そのためにAWSのAmazonSNSとFirebaseを連携設定する感じでした。
要件としてはこんな感じです。
- AndroidアプリはFirebaseと連携している
- そのFirebase情報をAWSのAmazonSNSに連携する
- AmazonSNSからプッシュ通知を送信する
これらを対応していった時の流れを書いていきたいと思います。
Androidアプリの情報確認
まずは対象のAndroidアプリの証明書キーを取得してメモしておきます。
SHA-1の情報が必要になります。
以下は証明書情報の取得結果の例です。
1Store: /Users/xxxx/.android/debug.keystore
2Alias: AndroidDebugKey
3MD5:aaaaaaaaaa
4SHA1: bbbbbbbbbbbb
5SHA-256: ccccccccccccc
Firebaseの設定
次にFirebaseの設定をします。
まずはFirebaseプロジェクトを準備し、CloudMessagingに対象のアプリを登録します。
【登録する内容】
- アプリのパッケージ名
- メモしておいたアプリの証明書キー
登録するとそのFirebaseのページで「google-services.json」がダウンロード出来るので取ってきます。
Firebase内で登録したアプリの設定画面に行くと、サーバーキーの文字列があるので、それをメモしておきます。
Androidアプリ内の組み込み
次にダウンロードしてきたjsonをAndroidアプリ内に組み込みます。
Androidアプリモジュールのルートディレクトリに配置します。
build.gradleにFirebaseSDKを追加して連携させます。
次にプッシュ通知が受け取れるメソッドを作成します。
今までの設定が済んでいれば「FirebaseMessagingService」というクラスが使えるはずなので、このクラスを継承した任意のクラスを作成します。
1public class PushMessagingService extends FirebaseMessagingService {
この作成したクラス内で「onNewToken」メソッドをオーバーライドして使用することで端末のデバイストークンを取得できるようになります。
1@Override
2public void onNewToken(@NonNull String token) {
3 // token情報をログに出力
4 Log.d(TAG, "push: onNewToken: " + token);
5}
同じクラス内で「onMessageRecived」メソッドをオーバーライドすることで、後述するAmazonSNSからプッシュ通知のメッセージ情報が取得できるようになります。
1@Override
2public void onMessageReceived(RemoteMessage remoteMessage) {
3 // 必要な処理を記載していく
4}
ひとまず対象のAndroid端末にプッシュ通知を送信するため、デバイストークンを取得します。
上記メソッドを組み込んだアプリを起動して、ログとかに出してみます。
以下はログ出力結果の表示例です。
1D/MainActivity: push:端末のデバイストークン:cI38・・・・・・・・・
AmazonSNSの設定
次にAWSのAmazonSNSの設定画面にいきます。
設定画面からAmazonSNSのプラットフォームアプリケーションを作成します。
任意のアプリケーション名を入れ、プッシュ通知プラットフォームを「Firebase Cloud Messaging(FCM)」に設定します。
そのあと、APIキーにメモしてたFirebaseのサーバーキーを入力します。
そうすると、さっきの一覧に作成したプラットフォームアプリケーションが追加されます。
これでFirebaseとAmazonSNSが紐づいた形になります。
Androidアプリにプッシュ通知を送信してみる
前述のメソッドより、送信対象の端末からデバイストークンを取得しておきます。
取得したデバイストークンをプラットフォームアプリケーションに登録します。
今回は動作確認したいので、AWSの画面入力からプッシュ通知を送信する感じで。
アプリケーションエンドポイント作成画面の「デバイストークン」の項目に値を入力して作成します。
登録すると端末ごとのARN(Amazon Resource Name)が設定されます。
AWS画面のARNごとにリンクができているので、そこから直接プッシュ通知が送信できます。
画面から送る時は以下のような感じでjson文字列が出来ます。
(文字列の先頭は「GCM」)
ひとまず、以下のパラメータを送るようにお試し。
- body:メッセージ本文1
- title:たいとる1
- sound:default_1
メッセージ発行すると対象の端末にメッセージが届きます。
ひとまずgetData()メソッドをログで確認。
1@Override
2public void onMessageReceived(RemoteMessage remoteMessage) {
3 if (remoteMessage.getData().size() > 0) {
4 Log.d(TAG, "Message data payload: " + remoteMessage.getData());
5}
【送信したjson】
1{"GCM":"{\"data\":{\"body\":\"メッセージ本文 1\",\"title\":\"たいとる 1\",\"sound\":\"default_1\"}}"}
【getData()の中身】
1D/PushMessagingService: Message data payload: {body=メッセージ本文 1, sound=default_1, title=たいとる 1}
プッシュ通知の表示設定
Androidアプリ内にプッシュ通知にするためのメッセージは受け取れたので、これをもとにNotificationManagerに設定して、プッシュ通知の表示を実際にしてみます。
1String channelId = "123";
2Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
3NotificationCompat.Builder notificationBuilder =
4 new NotificationCompat.Builder(this, channelId)
5 .setSmallIcon(com.google.firebase.messaging.R.drawable.gcm_icon2)
6 .setContentTitle(title)
7 .setContentText(message)
8 .setAutoCancel(true)
9 .setSound(defaultSoundUri);
この設定をして、改めてメッセージ発行してみます。
すると対象の端末の画面にプッシュ通知が表示されます。
これで、AWSのAmasonSNSとFirebaseに登録してあるアプリと連携して、プッシュ通知をすることが出来るようになりました。
実際の現場で起こりがちなこと
実際の作業現場では、開発環境、テスト環境、本番環境など、作業できる環境が分けられてることが多いかと思います。
起こりがちなのが、開発環境ではプッシュ通知受け取れたので、テスト環境に移して実行してみたらプッシュ通知が来なかった、みたいなことです。
AmazonSNSのプラットフォームはテスト環境設定だが、アプリのほうが開発環境だった、とか環境設定の不一致が起こりやすいので、それぞれの環境で各設定の再確認はしっかりとすることが大事になります。
設定周りは最初だけなので、出来るだけ分かりやすいメモは必要になります。
また、バージョンの違いとかで必要なメソッドが変わったりするので、
組み込む時はアプリ開発の最初が望ましいです。
後から入れようとするとライブラリ周りで他の機能との共存が難しくなったりするので。
実際のアプリ動作を意識する
ここまでで、AmazonSNS画面からプッシュ通知が送れるようになりましたが、実際にアプリ使うときにその画面から手で送信することはほぼ無いかと思います。
別途AWSと連携するライブラリがあるので、それをシステムに組み込んで送信する感じになります。
例えば利用するアプリで、ログインする時にデバイストークン情報を取得し、その値をAWSに送って、その値をもとデバイス登録をしておく、とか。
その辺りはまたWeb側の構成とかいろいろと長くなってしまうので今回はプッシュ通知設定そのものメインとしてここまでとします。
やってみた感想
設定して手元のローカル環境で動作確認するのは動きが分かって面白かったかなと。
ただ、実際に開発環境に乗せて実際のパラメータを入れてやってみた時は思った以上に動かなかったりしてハマったりも。
特に多かったのは少し前の説明でも書いたようにテスト環境に移行してから動かなくなった、とか。
なので、環境に関するメモは大事だなと。
一つ一つの設定は難しくはないものの、複数のシステムが絡んでくるとかなりややこしくなるので、設定時や動作確認時には、あとで見返しても分かるような資料作りも大切だなと思いました。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
元ファストフード店長代理のJava系ITエンジニア。 Webサイト系の開発や運用をいくらか経験し、 現在はAndroidアプリ開発を主に担当したり。 休みの日はゲームとか風景写真撮りに行ったりとかマラソンしたりとか。