Cloud Messagingでプッシュ通知
FCM通知を送受信します。
「Cloud Messagingでプッシュ通知」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
Cloud Messagingとは
Firebase Cloud Messaging (FCM)は、アプリが閉じているときでも、アプリにプッシュ通知やデータメッセージを配信します。
流れはシンプルです。
- アプリをインストールするたびに、一意の登録トークンが発行されます。
- サーバー(またはFirebaseコンソール)から、そのトークン(またはトピック)にメッセージを送信します。
- FCMがデバイスにメッセージを届け、デバイスが表示または処理します。
Messagingの依存関係を追加する
FCMはfirebase-messagingライブラリに含まれており、先ほど設定したBoMによってバージョンが管理されます。
BoMが設定されている場合、バージョン番号を指定する必要はありません。
// app/build.gradle.kts
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-messaging")
}通知の権限
Android 13 (API 33)以降では、通知を投稿するために実行時権限POST_NOTIFICATIONSが必要です。
マニフェストで宣言したうえで、実行時に権限を要求します。許可されていない場合、通知は何も表示されずに破棄されます。
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />権限を要求する
Activity Result APIを使用して、実行時にPOST_NOTIFICATIONSを要求します。API 33以降でのみ要求してください。それより前のバージョンでは暗黙的に許可されます。
import android.Manifest
import android.os.Build
import androidx.activity.result.contract.ActivityResultContracts
val requestPermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
println(if (granted) "Notifications allowed" else "Notifications denied")
}
fun askNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}登録トークン
インストールごとに、そのインストールを配信先として識別する一意のFCMトークンが発行されます。Firebase.messaging.tokenで取得できます。
特定のデバイスにプッシュ通知を送れるよう、このトークンをバックエンドに送信します。トークンは変わることがあるため、常に最新のものを正式な値として扱ってください。
import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await
suspend fun currentToken(): String {
return Firebase.messaging.token.await()
}Messagingサービス
メッセージを受信するには、FirebaseMessagingServiceを継承します。受信したペイロードを処理するにはonMessageReceivedを、トークンが更新されたときに対応するにはonNewTokenをオーバーライドします。
FCMのintent filterを指定して、マニフェストにサービスを登録します。
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class MyFcmService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
// Upload the fresh token to your backend
sendTokenToServer(token)
}
override fun onMessageReceived(message: RemoteMessage) {
val title = message.notification?.title ?: "New message"
val body = message.notification?.body ?: ""
showNotification(title, body)
}
private fun sendTokenToServer(token: String) { /* ... */ }
private fun showNotification(title: String, body: String) { /* ... */ }
}サービスを登録する
Androidがサービスにメッセージを届けられるよう、マニフェストでサービスを宣言します。MESSAGING_EVENTのintent filterが必要です。
<!-- AndroidManifest.xml inside <application> -->
<service
android:name=".MyFcmService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>通知メッセージとデータメッセージ
FCMメッセージには2種類あります。
- 通知メッセージ — アプリがバックグラウンドにあるとき、FCMが通知を自動的に通知領域へ表示します。
onMessageReceivedが呼び出されるのは、アプリがフォアグラウンドにあるときだけです。 - データメッセージ — 常にキーと値のマップとして
onMessageReceivedに渡されるため、処理方法を自由に制御できます。
カスタムフィールドはmessage.dataから読み取ります。
import com.google.firebase.messaging.RemoteMessage
fun handle(message: RemoteMessage) {
val type = message.data["type"] // your custom field
val itemId = message.data["itemId"]
when (type) {
"chat" -> openChat(itemId)
"promo" -> openPromo(itemId)
}
}
fun openChat(id: String?) {}
fun openPromo(id: String?) {}通知チャンネルを作成する
Android 8以降では、すべての通知にチャンネルが必要です。起動時に一度作成してください。システムはチャンネルを使って、音、重要度、ユーザーがチャンネルごとに設定した内容を管理します。
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
fun createChannel(context: Context) {
val channel = NotificationChannel(
"messages",
"Messages",
NotificationManager.IMPORTANCE_HIGH
)
val manager = context.getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}通知を表示する
NotificationCompat.BuilderでチャンネルIDに関連付けた通知を作成し、NotificationManagerCompatで投稿します。
API 33以降では、ユーザーがPOST_NOTIFICATIONSを許可している場合にのみ表示されることに注意してください。
import android.content.Context
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
fun showNotification(context: Context, title: String, body: String) {
val notification = NotificationCompat.Builder(context, "messages")
.setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.build()
NotificationManagerCompat.from(context).notify(1, notification)
}トピックを購読する
個々のトークンを管理する代わりに、トピックへ一斉配信できます。クライアントがトピック名を購読し、サーバーが購読中の全員に1つのメッセージを送信します。
news、sports、all-usersのお知らせなどに便利です。
import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await
suspend fun subscribeToNews() {
Firebase.messaging.subscribeToTopic("news").await()
}
suspend fun unsubscribeFromNews() {
Firebase.messaging.unsubscribeFromTopic("news").await()
}理解度チェック
アプリがバックグラウンドにあり、FCMから純粋な通知メッセージを受信したとします。何が起こりますか。
まとめ:Cloud Messaging
これでプッシュ通知を使ってユーザーに情報を届けられるようになりました。
firebase-messagingを追加し、API 33以降ではPOST_NOTIFICATIONSを要求します。- インストールごとにFCMトークンが発行されるため、サーバーにアップロードします。
FirebaseMessagingServiceを継承し、onMessageReceived/onNewTokenをオーバーライドします。- 通知メッセージとデータメッセージの違いを理解します。
- 通知チャンネルを作成し、
NotificationCompatで通知を作成するか、トピックを使って一斉配信します。
これでFirebaseの3つの機能、Auth、Firestore、Messagingを学びました。Androidアプリの完全なバックエンドとして利用できます。
よくある質問
「Cloud Messagingでプッシュ通知」レッスンは無料ですか?
はい。「Cloud Messagingでプッシュ通知」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「Cloud Messagingでプッシュ通知」で何を学びますか?
FCM通知を送受信します。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Cloud Messagingでプッシュ通知」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Firebaseのセットアップ
- Firebase Authentication
- Cloud Firestoreの基本
- Cloud Messagingでプッシュ通知