yamaday0u Blog Written by yamaday0u

【Android】Firebaseでプッシュ通知を受け取るアプリの実装例

Android Firebase

こんにちは、やまだゆうです。

今回はFirebase Cloud Messaging (FCM)を使って、プッシュ通知を受けるAndroidアプリを作ります。

この記事の内容

  1. Android Studioでプロジェクトを作る
  2. AndroidプロジェクトにFirebaseを追加する
  3. アプリにFirebase SDKを追加する
  4. アプリマニフェストを編集する
  5. アプリがフォアグラウンドにいるときの処理を追加する
  6. Firebaseのトークンを取得する
  7. Postmanを使って通知を送れるようにする
  8. 動作確認

ゴール

Postmanから送信したプッシュ通知をアプリで受け取れるようになることです。

スポンサーリンク

Android Studioでプロジェクトを作る

まずはAndroidアプリのプロジェクトをAndroid Studioで作成します。

最近Jetpack Composeでアプリを作る経験をしたので、引き続きJetpack Composeのテンプレートを利用します。

Empty Compose Activityで作成します

AndroidプロジェクトにFirebaseを追加する

続いてFirebaseの機能をAndroidアプリで使えるようにするために、作成したAndroidプロジェクトにFirebaseを追加します。

Android プロジェクトに Firebase を追加する | Firebase for Android」では次の2つの追加方法が紹介されています。

  1. Firebase コンソールを使用して Firebase を追加する
  2. Firebase Assistant を使用して Firebase を追加する

今回は推奨されている1番目の方法でFirebaseを追加します。

まず、Firebase コンソールでプロジェクトを作成します。

プロジェクトを作成したら、プロジェクトの概要ページに表示されているAndroidアイコンをクリックします。

「アプリの登録」で自身のAndroidアプリのパッケージ名を入力します。

次にgoogle-services.jsonファイルをダウンロードして、Androidプロジェクトのappディレクトリ直下に配置します

google-services.jsonファイルの値に Firebase SDK からアクセスできるようにするために、2つのgradleファイルにGoogle サービスのプラグイン(google-services)を追加します。

plugins {
  id 'com.android.application' version '7.2.2' apply false
  // ...

  // the Google services Gradle plugin for Firebase
  id("com.google.gms.google-services") version "4.3.15" apply false
}
plugins {
  id("com.android.application")

  // the Google services Gradle plugin for Firebase
  id("com.google.gms.google-services")
}

スポンサーリンク

アプリにFirebase SDKを追加する

FCMの依存関係をgradleファイルに追加します。
公式で推奨されているBoMを使って依存関係のバージョン管理をします。

dependencies {
  // ...

  // Firebase (FCM)
  // Firebase Android BoM (https://firebase.google.com/docs/android/learn-more?hl=ja#bom)
  implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
  implementation "com.google.firebase:firebase-messaging-ktx"
}

上記のコードではバージョン32.3.1のFirebaseのBoMを使って、firebase-messaging-ktxの依存関係を追加しています。

アプリマニフェストを編集する

アプリがフォアグラウンドで実行しているときにFirebaseからのプッシュ通知を受け取るために、マニフェストファイルに以下を追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.yamaday0u.push_notification_practice">

    <application>

        <activity>
            <!-- ... -->
        </activity>

        <service
            android:name=".service.MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    </application>

</manifest>

スポンサーリンク

アプリがフォアグラウンドにいるときの処理を追加する

アプリがフォアグラウンドにいるときの処理を追加します。
今回はサンプルなので、受け取ったプッシュ通知の内容をログに出力する実装に留めます。

package com.yamaday0u.push_notification_practice.service

import android.util.Log
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage


class MyFirebaseMessagingService: FirebaseMessagingService() {
    private val tag: String = "DEBUG"

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        Log.d(tag, "From: ${remoteMessage.from}")

        remoteMessage.notification?.let {
            Log.d(tag, "Notification - title: ${it.title}")
            Log.d(tag, "Notification - body : ${it.body}")
        } ?: Log.d(tag, "No Notification")
        
        if (remoteMessage.data.isNotEmpty()) {
            Log.d(tag, "Data: ${remoteMessage.data}")
        } else {
            Log.d(tag, "No Data")
        }
        
    }

    override fun onNewToken(token: String) {
        Log.d(tag, "Refreshed token: $token")
    }
}

実際のアプリでは、ここからNotificationなどを使って通知内容をアプリに表示します。

Firebaseのトークンを取得する

先ほど追加したFirebase SDKを使って、アプリを起動したときにFirebaseのトークンを取得できるようにします。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        getFirebaseToken()
        // ...
    }
}

// ...

private fun getFirebaseToken() {
    FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
        if (!task.isSuccessful) {
            return@OnCompleteListener
        }
        val token = task.result
        Log.d("DEBUG", "token: $token")
    })
}

スポンサーリンク

Postmanを使って通知を送れるようにする

Firebaseにプッシュ通知のリクエストを送る方法は、大きく分けて2つのパターンが用意されています。

  • Firebase Admin SDKを使う方法
  • FCM サーバープロトコル

参考:サーバーオプションの選択 | Firebase Cloud Messaging

今回はサーバーを作らずにPostmanでお手軽にプッシュ通知を送りたいので、FCM サーバープロトコルを使う方法を採用します。

FCM HTTP v1 APIを使います

FCM サーバープロトコルにもいくつか種類が用意されています。これまた推奨されているFCM HTTP v1 APIを使います。

FCM HTTP v1 APIではFirebaseへのプッシュ通知のリクエストにアクセストークンが必要になります。

とてもお手軽だったという理由から、以下の記事を参考にしGoogle Developers OAuth 2.0 Playgroundでアクセストークンを取得することにします。

Testing FCM Push Notification (HTTP v1) through OAuth 2.0 Playground/Postman/Terminal — Part 2 | by Apoorv Garg | Medium

Google Developers OAuth 2.0 Playgroundでアクセストークンを取得する

まず、Google Developers OAuth 2.0 Playground にアクセスします。

Step 1 としてスコープ選択をします。Firebase Cloud Messageing API v1 のhttps://www.googleapis.com/auth/cloud-platform のスコープを選択します。

「Authorize APIs」をクリックします。

Googleアカウントでの認証を求められるので許可します。

認証後はStep 2に画面が表示されます。「Exchange authorization code for tokens」という青いボタンをクリックするとアクセストークンが取得できます。

このアクセストークンのコピーを取っておいてください。

動作確認

アプリを起動する

アプリを起動して、Android Studioに出力されたログからトークンをコピーしましょう。

Firebaseのトークンをコピーする

Firebaseにプッシュ通知をリクエストする

Postmanに設定を入れましょう。

AuthorizationタブでTypeをBearer Tokenを指定し、Tokenにアクセストークンを入力します。

リクエストパスのproject IDにはFirebaseプロジェクトで確認できるプロジェクト IDを入力します。

プロジェクト IDを確認できる場所

つづいてBodyタブに移動して、プッシュ通知で送る内容を入力します。

rawのJSON形式で入力します
{
   "message":{
      "token":"取得したFirebaseのトークン",
      "notification":{
        "title":"FCM Message",
        "body":"This is an FCM notification message by yamaday0u!"
      },
      "data": {
        "story_id": "story_12345"
    }
   }
}

プッシュ通知を送ろう!

いよいよプッシュ通知を送ります。Postmanでリクエストを実行してください。

以下のようにアプリがバックグラウンドのとき、フォアグラウンドのときにリクエストを送るとプッシュ通知を受け取れれば成功です!

アプリがバックグラウンドの場合
アプリがフォアグラウンドの場合

参考資料

yamaday0uを応援お願いします!あなたの1クリックが励みになります。
>> にほんブログ村