Foggy day

[Android] Fcm 수신 및 notification 호출 본문

Android

[Android] Fcm 수신 및 notification 호출

jinhan38 2024. 1. 23. 15:46

 

안드로이드 fcm을 수신하는 방법을 간략히 정리했습니다. 

 

 

1. 파이어베이스

2. Android 코드 구현

 

 

1. 파이어베이스

Fcm을 수신하기 위해서는 파이어베이스에 등록 작업을 해야 합니다. 사진은 생략하고 처리 해야 할 항목만 나열하겠습니다.

- 프로젝트 생성 

- google-services.json 파일 다운로드 및 프로젝트에 추가 

- 안드로이드 앱 추가 

- 앱을 추가한 후에 프로젝트 설정 -> 일반 -> Sha 인증서 추가
  sha1 키 발급 방법 https://jinhan38.com/14 

 

Android(안드로이드) - How to get debug/release SHA-1

Sha key is needed when we use api like google and kakao and so on. So, this article is about how to get debug/release SHA-1. First, get debug sha-1. It is very easy. double click "signingReport" If you find Tasks tab, follow below. 1. Android Studio -> Pre

jinhan38.com

 

 

 

 

2. Android 코드 구현

 

먼저 gradle에서 라이브러리를 추가해야 합니다.

- build.gradle(Project: android)

    dependencies {
        classpath 'com.android.tools.build:gradle:7.3.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // fcm 위해 추가
        classpath 'com.google.gms:google-services:4.3.8'
    }

 

- build.gradle(Module: android)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

// fcm 위해 추가
apply plugin: 'com.google.gms.google-services'

android{
	 ...
}

dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

    // fcm 위해 추가
    implementation 'com.google.firebase:firebase-messaging:23.4.0'

}

 

 

라이브러리 추가를 완료 했다면  manifest에서 권한과 channel을 등록해줘야 합니다. 

INTERNET고 POST_NOTIFICATIONS 권한을 추가해주고, 메타데이터로 notificatino_channel_id를 등록해 줍니다. 

value에는 channelId를 넣어주면 되는데 원하는 값을 넣어주세요.

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!--인터넷 권한-->
    <uses-permission android:name="android.permission.INTERNET" />

    <!--푸시 알림 권한-->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />


    <application
    	...

        <!-- FCM 사용을 위한 Firebase 설정 추가, value에는 channelId를 넣어야 한다.
        background에서 notification을 호출 할 때 channel이름이 동일하지 않으면 pop up이 안 나온다. -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="myNotification" />

    </application>
</manifest>

 

 

 

권한 처리가 완료 됐다면 FirebaseApp 클래스를 초기화하고, notification을 띄울 코드를 작성하겠습니다.

initFcm 함수의 FirebaseMessaging.getInstance().token.addOnCompleteListener 코드를 사용해서 디바이스의 fcm token을 확인할 수 있습니다. 

showNotification 함수를 사용해서 알림을 띄울 수 있습니다. 

pendingIntent를 생성할 때 100이라는 값을 넣었는데, 여기에는 requestCode가 들어갑니다. 원하는 값을 넣어서 intent 처리를 하면 됩니다. 

마지막줄의 notificationManager.notify 함수를 호출할 때 1이라는 값을 넣었습니다. 이는 notification의 id 입니다. 필요에 따라서 값을 설정해서 로직을 구현하면 됩니다. 

object FcmUtil {

    private const val TAG = "FcmUtil"

    fun initFcm(context: Context) {
        FirebaseApp.initializeApp(context)
        FirebaseMessaging.getInstance().token.addOnCompleteListener {
            Log.d(TAG, "initFcm: token : ${it.result}")
        }
    }

    fun showNotification(context: Context, title: String, body: String) {
        val pendingIntent = PendingIntent.getActivity(
            context,
            100,
            Intent(context, MainActivity::class.java),
            PendingIntent.FLAG_IMMUTABLE
        )
        val notification: Notification?
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            notification =
                NotificationCompat.Builder(context, "mwc")
                    .setContentIntent(pendingIntent)
                    .setAutoCancel(true)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .build()
        } else {
            notification =
                NotificationCompat.Builder(context)
                    .setContentIntent(pendingIntent)
                    .setAutoCancel(true)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .build()
        }

        val notificationManager =
            context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.notify(1, notification)
    }


}

 

MainActivity에서 초기화를 호출하겠습니다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        FcmUtil.initFcm(this)
    }

 

 

 

초기화와 알림을 띄울 준비까지 됐다면, 마지막으로 fcm을 수신할 service클래스를 만들겠습니다. 

푸시메세지를 수신하면 onMessageReceived 함수에 진입합니다. 

서버에서 푸시메세지를 보낼 때 Notification과 Message를 보낼 수 있습니다. Remotemessage 클래스의 notification에는 서버에서 보내는 Notification에 대한 정보가 있고, data에는 Message의 정보가 담겨 있습니다. 

수신한 데이터들을 활용해서 notification을 띄워주세요. 

class MyFirebaseMessagingService : FirebaseMessagingService() {

    companion object {
        private const val TAG = "MyFirebaseMessagingServ"
    }

    override fun onMessageReceived(message: RemoteMessage) {
        super.onMessageReceived(message)
        val title = message.notification!!.title.toString()
        val body = message.notification!!.body.toString()
        val data = message.data
        Log.d(TAG, "onMessageReceived: title = $title, body = $body, data = $data")
        
        FcmUtil.showNotification(
            context = applicationContext,
            title = title,
            body = body
        )
    }

    override fun onNewToken(token: String) {
        super.onNewToken(token)
        Log.d(TAG, "onNewToken() called with: token = $token")
    }
}

 

 

FirebaseMessagingService 클래스를 만들었으면 manifest에 service를 추가해야 합니다. 

    <application
    	...

        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />

        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="mwc" />

        <!-- FirebaseMessagingService 등록 -->
        <service
            android:name=".fcm.MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="false"
            android:permission="TODO">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
        <!---->

    </application>