【Kotlin/Android】Firebase Cloud Messagingでリモートプッシュ通知の実装方法!

この記事からわかること

  • Android Studio/Kotlin通知機能実装方法
  • Firebase Cloud Messagingプッシュリモート通知を実装するには?
  • テスト配信の流れ
  • 届かない場合の対処

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Androidアプリの通知機能

【Kotlin/Android Studio】通知の実装方法!アプリ内からリクエスト(ローカル通知)

ローカル通知

ローカル通知とはオフラインで実行される通知機能のことを指します。デバイス内からプッシュ通知リクエストを送信し、デバイス内で処理されて通知が届くような仕組みになっています。

ローカル通知は事前準備などは必要なく、Kotlinのコードを記述するだけで実装することができます。

通知リクエストを送信するタイミングはアプリ内からしか操作できません。リマインダーやアラーム機能など自分でセットして使用するプッシュ通知などはこのローカル通知を使用して実装されています。

リモート通知

リモート通知とはオンラインで実行される通知機能のことを指します。ローカル通知とは異なり、プッシュ通知リクエストをオンライン上から送信し、デバイス内で処理されて通知が届くような仕組みになっています。

【SwiftUI】通知機能の実装方法!ローカル通知が届いている要素

そのためにGoogleが運営するモバイルサービスであるFirebaseの「Firebase Cloud Messaging」を利用します。無料で使えるので登録しておいてください。

おすすめ記事:Firebaseとは?登録方法や使い方、料金とサービスの種類

Firebase Cloud Messaging

公式リファレンス:Firebase Cloud Messaging

Firebase Cloud Messaging(FCM)はFirebaseが提供しているサービスの1つでアプリに対してメッセージを通知で送信できるクラスプラットフォームメッセージソリューションです。

メッセージは最大4000バイトのペイロードまで送信可能になっており、アプリ外だけでなく、アプリ内にもメッセージを送ることができ、ユーザーに対して様々なタイミングで情報を共有することが可能になります。

メッセージはFirebaseプロジェクトのWebページからGUIベースで構築、配信が可能になっています。

リモート通知機能を実装する方法

FCMを利用したリモートプッシュ通知機能を実装するためにはAndroid側で設定することが色々あります。

流れ

  1. パーミッションの追加
  2. 通知許可ダイアログの表示
  3. 通知チャンネルの作成
  4. プロジェクトの作成と組み込み
  5. gradleにSDK追加
  6. サービス(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」の画面に移動し、「最初のキャンペーンを作成」をクリックします。

【Swift/Firebase】リモートプッシュ通知の実装方法!Cloud Messagingの使い方

配信できる通知は以下の2種類に分かれているので今回は上側の通知を配信してみます。

【Swift/Firebase】リモートプッシュ通知の実装方法!Cloud Messagingの使い方

通知のタイトル」と「通知テキスト」を入力します。

【Swift/Firebase】リモートプッシュ通知の実装方法!Cloud Messagingの使い方

ターゲットには登録しているAndroidアプリを選択します。(画像はiOSになってしまっていますがAndroidを登録していれば表示されます)

【Swift/Firebase】リモートプッシュ通知の実装方法!Cloud Messagingの使い方

スケージュール設定は通知を配信したい日時を指定します。

【Swift/Firebase】リモートプッシュ通知の実装方法!Cloud Messagingの使い方

最後に確認して問題がなければ「公開」をクリックすると通知が配信されます。現在としても多少のラグ(5分くらい)はあるので少し待ってみてください。

【Swift/Firebase】リモートプッシュ通知の実装方法!Cloud Messagingの使い方

今回は実機にインストールされているアプリに対して通知を配信しましたがシミュレーターなどにテストとして通知を配信したい場合は以下の記事を参考にしてみてください。

アプリがアクティブ状態でも通知を表示させたい場合

【Kotlin/Android Studio】通知の実装方法!アプリ内からリクエスト(ローカル通知)

アプリが起動している場合でも通知を上部に表示するヘッドアップ通知を実装したい場合は以下の記事を参考にしてください。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index