FCM Push 알림
FCM은 앱의 키값을 식별하여 특정 스마트폰에 데이터를 전달할 수 있다. 앱의 고유한 키 값은 Firebase에 앱을 등록하면 생성된다. 사용자가 이 앱을 설치하고 알람설정에 동의하면 기기의 FCM token을 얻을 수 있다.
작업 프로세스
- Manifest 수정
- 서비스 등록
- 권한 설정
- Token 생성
- 앱이 처음으로 실행되면 자동으로 발급된다.
- 앱이 새 기기에서 복원 될 때, 사용자가 앱을 제거/재설치할 때, 사용자가 앱 데이터를 지울 때 토큰이 변경될 수 있다.
FirebaseMessagingService
를 상속받아onNewToken()
을 오버라이딩 해야한다.- 새 토큰이 생성될 때마다
onNewToken()
콜백이 실행된다.
- 새 토큰이 생성될 때마다
/** * Called if the FCM registration token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the * FCM registration token is initially generated so this is where you would retrieve the token. */ override fun onNewToken(token: String) { Log.d(TAG, "Refreshed token: $token") // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendRegistrationToServer(token) }
- 앱이 처음으로 실행되면 자동으로 발급된다.
- 현재 토큰 가져오기
- 현재 토큰을 검색해야 하는 경우
FirebaseMessaging.getInstance().getToken()
을 호출한다.
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> if (!task.isSuccessful) { Log.w(TAG, "Fetching FCM registration token failed", task.exception) return@OnCompleteListener } // Get new FCM registration token val token = task.result // Log and toast val msg = getString(R.string.msg_token_fmt, token) Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() })
- 현재 토큰을 검색해야 하는 경우
- 메세지 수신
FirebaseMessagingService
를 상속받은 서비스 에서onMessageReceived()
콜백을 오버라이딩 해야한다.
Notification를 받는 경우, Foreground/Background에 따라 다르게 동작한다.override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
- 안드로이드 알림 생성(Data를 받는 경우)
private fun sendNotification(title: String, text: String, requestId: Int){ val intent = Intent(this, CardRequestActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP and Intent.FLAG_ACTIVITY_NEW_TASK } val pendingIntent = PendingIntent.getActivity(this, 0, intent, FLAG_MUTABLE) val channelId = getString(R.string.notification_channel_id) val channelName = getString(R.string.default_notification_channel_name) val defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) val notificationBuilder = NotificationCompat.Builder(this, channelId) .setAutoCancel(true) .setSound(defaultSound) .setContentText(text) .setContentTitle(title) .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.bling) // create notification channel val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH) notificationManager.createNotificationChannel(channel) notificationManager.notify(0, notificationBuilder.build()) } }
PendingIntent
를 생성해서 연결될 페이지를 지정하면 된다.
'Programming > 플랫폼' 카테고리의 다른 글
[Android] 웹 뷰 - 앱 간 통신 (2) | 2023.11.09 |
---|---|
Web on Android - 안드로이드에서 웹 컨텐츠를 사용하는 방식 (0) | 2023.09.02 |
Android12 Pending Intent, Foreground Service 변경사항 (0) | 2023.04.17 |
[Andriod] Webview 안에서 Push Notification으로 페이지 로드하기 (0) | 2023.03.06 |
[Android] 웹 뷰 로딩 오류 (0) | 2023.03.04 |