【Kotlin/Android】Firebase Cloud Messagingでリモートプッシュ通知の実装方法!
この記事からわかること
- Android Studio/Kotlinで通知機能の実装方法
- Firebase Cloud Messagingでプッシュリモート通知を実装するには?
- テスト配信の流れ
- 届かない場合の対処法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
- Android:13
Androidアプリの通知機能
ローカル通知
ローカル通知とはオフラインで実行される通知機能のことを指します。デバイス内からプッシュ通知リクエストを送信し、デバイス内で処理されて通知が届くような仕組みになっています。
ローカル通知は事前準備などは必要なく、Kotlinのコードを記述するだけで実装することができます。
通知リクエストを送信するタイミングはアプリ内からしか操作できません。リマインダーやアラーム機能など自分でセットして使用するプッシュ通知などはこのローカル通知を使用して実装されています。
リモート通知
リモート通知とはオンラインで実行される通知機能のことを指します。ローカル通知とは異なり、プッシュ通知リクエストをオンライン上から送信し、デバイス内で処理されて通知が届くような仕組みになっています。
そのためにGoogleが運営するモバイルサービスであるFirebaseの「Firebase Cloud Messaging」を利用します。無料で使えるので登録しておいてください。
おすすめ記事:Firebaseとは?登録方法や使い方、料金とサービスの種類
Firebase Cloud Messaging
公式リファレンス:Firebase Cloud Messaging
Firebase Cloud Messaging(FCM)はFirebaseが提供しているサービスの1つでアプリに対してメッセージを通知で送信できるクラスプラットフォームメッセージソリューションです。
メッセージは最大4000バイトのペイロードまで送信可能になっており、アプリ外だけでなく、アプリ内にもメッセージを送ることができ、ユーザーに対して様々なタイミングで情報を共有することが可能になります。
メッセージはFirebaseプロジェクトのWebページからGUIベースで構築、配信が可能になっています。
リモート通知機能を実装する方法
FCMを利用したリモートプッシュ通知機能を実装するためにはAndroid側で設定することが色々あります。
流れ
- パーミッションの追加
- 通知許可ダイアログの表示
- 通知チャンネルの作成
- プロジェクトの作成と組み込み
- gradleにSDK追加
- サービス(FirebaseMessagingService)の追加
「1.パーミッションの追加、2.許可ダイアログ、3.通知チャンネルの作成」などローカル通知とやることが一緒の部分は割愛しておりますので、そこら辺は以下の記事を参考にしてください。
プロジェクトの作成と組み込み
Firebaseのプロジェクトを作成しプロジェクトにAndroidアプリを追加しておいてください。すでにAndroidアプリを追加していた場合は「google-services.json」が更新されているので変更しておく必要があります。ここらへんの詳細な流れは以下の記事を参考にしてください。
【Android Studio】Firebaseの導入方法!Firebase Analytics/Google Analytics
gradleにSDK追加
続いて「build.gradle」にFirebase Cloud MessagingのFirebase SDK(Software Development Kit)を追加していきます。追加するのは以下の2つです。
dependencies {
// 〜〜〜〜〜〜〜〜〜〜
// Firebase Cloud Messaging
implementation 'com.google.firebase:firebase-messaging-ktx:23.0.6'
}
サービス(FirebaseMessagingService)の追加
公式リファレンス:Android で Firebase Cloud Messaging クライアント アプリを設定する
FirebaseMessagingService
を継承した独自のサービスを用意します。このサービスがリモート通知を発火する命令を受け取り、通知を構築、実際に端末に通知を発火する役割を持ちます。
class MyFirebaseMessagingService: FirebaseMessagingService() {
override fun onNewToken(p0: String) {
super.onNewToken(p0)
}
override fun onMessageReceived(p0: RemoteMessage) {
super.onMessageReceived(p0)
// 3.通知チャンネルの作成
createNotificationChannel()
// 通知を発行
sendNotify(p0)
}
private fun sendNotify(remoteMessage: RemoteMessage) {
// 通知タップ時でアプリを起動する画面を定義
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
val pendingIntent = PendingIntent.getActivity(this, REQUEST_CODE, intent,
PendingIntent.FLAG_IMMUTABLE)
// 通知オブジェクトの作成
val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setColor(resources.getColor(R.color.black, null))
.setContentTitle(remoteMessage.notification?.title)
.setContentText(remoteMessage.notification?.body)
.setShowWhen(true)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 通知の発行
notificationManager.notify(REQUEST_CODE, notificationBuilder.build())
}
// 3.通知チャンネルの作成
private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelName = "Firebase Cloud Message"
val descriptionText = "チャンネルの説明"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(CHANNEL_ID, channelName, importance).apply {
description = descriptionText
setShowBadge(true)
lockscreenVisibility = Notification.VISIBILITY_PUBLIC
}
// チャンネルをシステムに登録
val notificationManager: NotificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
companion object {
val CHANNEL_ID = "CHANNEL_ID"
val REQUEST_CODE = 0
}
}
「AndroidManifest.kt」にサービスを追加しておきます。
<activity
android:name=".View.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".Service.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
これでAndroid側の準備は完了で、あとはFirebaseから通知を発行すれば実際に通知が届くようになります。
リモートプッシュ通知配信
これで全てのセットアップが完了したので実際にリモートプッシュ通知をアプリに配信してみます。Firebaseにアクセスして「Cloud Messaging」の画面に移動し、「最初のキャンペーンを作成」をクリックします。
配信できる通知は以下の2種類に分かれているので今回は上側の通知を配信してみます。
「通知のタイトル」と「通知テキスト」を入力します。
ターゲットには登録しているAndroidアプリを選択します。(画像はiOSになってしまっていますがAndroidを登録していれば表示されます)
スケージュール設定は通知を配信したい日時を指定します。
最後に確認して問題がなければ「公開」をクリックすると通知が配信されます。現在としても多少のラグ(5分くらい)はあるので少し待ってみてください。
今回は実機にインストールされているアプリに対して通知を配信しましたがシミュレーターなどにテストとして通知を配信したい場合は以下の記事を参考にしてみてください。
アプリがアクティブ状態でも通知を表示させたい場合
アプリが起動している場合でも通知を上部に表示するヘッドアップ通知を実装したい場合は以下の記事を参考にしてください。
おすすめ記事:ヘッドアップ通知を表示する
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。