[안드로이드&&Firebase] Node.js 웹 서버를 사용해 FCM 푸시알람 전송 방법(2)

2020. 11. 2. 22:24개발/[Kotlin] 안드로이드 개발

반응형

안녕하세요.

전 시간에 Android와 Firebase를 연결하는 방법에 대해 포스팅 했습니다.

오늘은 수동으로 푸시알람을 보내는 방법을 알아보겠습니다

안드로이드 스튜디오를 켜서 MyFirebaseMessagingService를 만듭니다.

추가로 manifests에 <application> </application> 사이에 아래 코드를 추가합니다.

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

manifest에 Internet, access, use_full 3줄을 추가합니다.

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT"/>

MyFirebaseMessagingService에 들어가서  다음코드를 넣습니다.

 class MyFirebaseMessagingService : FirebaseMessagingService() {

 private val TAG = "FirebaseService"

 // 파이어베이스 서비스의 토큰을 가져온다
 override fun onNewToken(token: String?) {
 Log.d(TAG, "new Token: $token")
 }

 // 새로운 FCM 메시지가 있을 때 메세지를 받는다
 override fun onMessageReceived(remoteMessage: RemoteMessage) {
 Log.d(TAG, "From: " + remoteMessage.from)
 
 // 앱이 포어그라운드 상태에서 Notificiation을 받는 경우
 if(remoteMessage.notification != null) {
   sendNotification(remoteMessage.notification?.body, remoteMessage.notification?.title)
 }
 }

 // FCM 메시지를 보내는 메시지
 private fun sendNotification(body: String?, title: String?) {
 val intent = Intent(this, MainActivity::class.java).apply {
 flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
 putExtra("Notification", body)
 putExtra("Notification",title)
 }

 var pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
 val notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
   
 // 푸시알람 부가설정
 var notificationBuilder = NotificationCompat.Builder(this,"Notification")
 .setSmallIcon(R.mipmap.ic_launcher)
 .setContentTitle(title)
 .setContentText(body)
 .setAutoCancel(true)
 .setSound(notificationSound)
 .setContentIntent(pendingIntent)

  val notificationManager = NotificationManagerCompat.from(this)
 notificationManager.notify(0, notificationBuilder.build())
 }

 }

자 이제 하나씩 알아 보겠습니다.

onNewToken 메서드는 휴대폰에 앱을 최초 실행시 나타나는 토큰입니다. 만약에 토큰을 까먹었거나 하면 어떻게할까요? 네 지웠다가 까시면 됩니다. 그러면 Logcat에 들어가서 new Token을 검색하시면 나와요 ! 

이게 왜 필요하느냐? 좀 있다 보실게요

onMessageReceived 메서드는 휴대폰이 앱을 킨 상태(foreground)에서 이 메서드를 거쳐서 작동합니다.

remoteMessage를 멤버변수로 하여  노티를 전달받아 null이아니게 되면 notification의 body와 title을 sendNotification함수로 전달합니다. 

참고로 문열림 알림 < title 현관문이 열렸습니다 body 입니다.

Task 내에 해당 속성이 적용된 activity 부터 top activity 까지 모두 제거한뒤 해당 activity 를 활성화 하여 top 이 되도록 합니다.

인텐트를 사용하여 Notification인 키를 활용해 body와 title을 putExtra하고 PendingIntent를 사용하여 Notification으로 작업을 수행할 때 인텐트가 실행되도록 합니다.

PendingIntent란?

 

인텐트를 포함하는 인텐트, 사용하는 목적은 현재 앱이 아닌 외부의 앱(노티피케이션, 알람 등)이 현재 내가 개발한 앱을 열 수 있도록 허락할 수 있는 인텐트이며, 그 펜딩 인텐트 안에는 실제 데이터를 갖고, 열 액티비티를 저장한 인텐트를 갖고 있는 것과 같습니다.

즉 알림메시지가 와서 클릭하면 외부에서 그 앱을 열게끔 해줍니다.

 

또 RingtoneManager를 사용하여 현재 기본 벨소리를 가져옵니다.

위 소스는 NotificationCompat.Builder의 속성들을 notificationBuilder에 대입하는 것인데요

주로 사용하는 속성들을 살펴볼까요?

  • setSmallIcon : 아이콘입니다 
  • setTicker : 알림이 뜰때 잠깐 표시되는 Text입니다.
  • setWhen : 알림이 표시되는 시간입니다.
  • setNumber : 미확인 알림의 개수입니다.
  • setContentTitle : 상단바 알림 제목입니다
  • setContentText : 상단바 알림 내용입니다.
  • setDefaults : 기본 설정입니다.
  • setContentIntent : 실행할 작업이 담긴 PendingIntent입니다
  • setAutoCancel : 터치하면 자동으로 지워지도록 설정하는 것입니다.
  • setPriority : 우선순위입니다. 다음 포스팅 때 웹서버 푸시를 위해선 high로 설정해야 합니다.
  • setOngoing : 진행중알림 입니다.
  • addAction : 알림에서 바로 어떤 활동을 할지 선택하는 것입니다.
  • setSound : 원하는 알람 소리를 설정합니다.

다음은 NotificationManagerCompat을 해당 서비스로 부터 얻어와서 아까 설정한 notificationBuilder를 포함해 알람을 전송해줍니다.

자 이제 컴파일 후 어떻게 알림이 오는지 보겠습니다.

 

파이어베이스에 Cloud Messaging을 들어가서 알림의 제목에 테스트, 테스트1을 작성하고 오른쪽에 테스트 메시지 전송을 클릭합니다.

그러면 아까 new Token으로 얻은 토큰값이 여기서 필요하게 됩니다!!

토큰을 추가하고 테스트를 누릅니다.

성공적으로 푸시알람이 도착한 것을 볼 수 있습니다 ! 

네 이번에는 수동적으로 푸시알람을 보내는법 fcm의 기본 안드로이드 코드를 알아보았는데요.

제가 알기로 SDK 버전마다 조금씩 다르다고 합니다 . 저는 minSdkVersion을 26으로 하고 Android Q에서 실습해보았습니다 ^^

다음 시간에는 웹서버 구축 1단계를 시작해보도록 하겠습니다. 저도 열심히 공부해서 올께요. 그럼 감사합니다 ~

반응형