0Pricing
Android Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Firebaseのセットアップ
  2. Firebase Authentication
  3. Cloud Firestoreの基本
  4. Cloud Messagingでプッシュ通知
← Android Academyに戻る