Foggy day
[Android] Fcm 수신 및 notification 호출 본문
안드로이드 fcm을 수신하는 방법을 간략히 정리했습니다.
1. 파이어베이스
2. Android 코드 구현
1. 파이어베이스
Fcm을 수신하기 위해서는 파이어베이스에 등록 작업을 해야 합니다. 사진은 생략하고 처리 해야 할 항목만 나열하겠습니다.
- 프로젝트 생성
- google-services.json 파일 다운로드 및 프로젝트에 추가
- 안드로이드 앱 추가
- 앱을 추가한 후에 프로젝트 설정 -> 일반 -> Sha 인증서 추가
sha1 키 발급 방법 https://jinhan38.com/14
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>
'Android' 카테고리의 다른 글
[Android] Overlay View 그리기 (2) | 2024.03.12 |
---|---|
[Android] Audio 음성 녹음 기능 구현 (0) | 2024.01.23 |
[Android] Syntax highlighting has been temporarily turned of because of an internal error (0) | 2023.11.15 |
[Android] PACKAGE_USAGE_STATS 권한 획득 (0) | 2023.09.26 |
[Android] SYSTEM_ALERT_WINDOW 권한 획득 (0) | 2023.09.26 |