안드로이드 스튜디오

안드로이드 개발 유지 일지 09.09(FCM 푸쉬메시지 관련)

hojung 2021. 9. 9.
728x90
반응형

오랜만에 할 일이 생겼다. 안드로이드 푸쉬 메시지를 bigText형식으로 바꾸어 알림을 보내는 것이었는데 

학교 어플리케이션 자체를 내가 만든 것이 아니라 구조를 파악하는 것이 제 1할일 이었다. 그러다 src 폴더에 java로 쓰여져 있는 파일을 발견했다. 

 

FMC 기반 푸쉬 알림 

이 곳이 Fmc 기반 푸쉬 알림을 컨트롤하는 페이지인 것을 파악했고 FMC 기반 메시지에 대해서 공부를 시작했다. 

이 코드에선는 파이어베이스에서 보내는 메시지를 getdata() 함수를 통해서 받고 있었는데 

getdata() 형식 

찾아보니 파이어베이스 기반 푸쉬 메시지를 보내는 방법에는 총 3가지 방법이 있었다. 


1. notification 방식 

공식 문서에 존재하는 notification 방식 

notification 방식의 가장 큰 특징은 메시지를 보낼 때 키 값을 자신이 설정할 수 없다는 것이었다. 파이어베이스에서 정해준 기본 키 값을 무조건 사용해야하므로 위에 있는 title, body와 같은 키 값은 수정할 수 없다. 어찌보면 따로 수정할 필요가 없어서 간단하지만 보낼 수 있는 정보의 유형이 정해져 있어 제한적이라는 단점이 있었다. 

 


2. data 방식

공식 문서에 존재하는 data방식 

data 방식은 기본적으로 서버에서 보내는 푸쉬 메시지 키 값을 정해주어야한다. 위의 코드를 보면 알 수 있듯이 notification 형식에서는 title, body로 존재하는 키 값들이 nick, body, room으로 바뀐 것을 알 수 있다. 이것은 보낼 수 있는 정보의 유형이 다양해질 수 있다는 장점이 있다. 우리 어플리케이션에서도 getdata()의 방식으로 정보를 받아오는 것을 보면 data방식으로 정보를 받아온다는 것을 확인할 수 있었다. 


3. notification + data방식 

공식 문서에 존재하는 notification + data방식

이 경우에는 한 layer가 더 존재하므로 어플리케이션이 백그라운드 상태인지 포그라운드 상태인지에 따라 달라지게 데이터를 처리하는 방식이 달라지게 된다. 백그라운드 상태인 경우에는 알림 페이로드가 알림 목록에 수신되며 사용자가 알림을 탭한 경우에만 데이터 페이로드를 처리한다. 

포그라운드 상태인 경우에는 앱에서 페이로드가 둘 다 제공되는 메시지 객체를 수신한다. 

 

이 뜻은 백그라운드 상태인 경우에는 알림의 수신 여부만을 알려준다는 듯하다. 


메시지 수신

onMessageReceived 함수 

메시지의 수신은 기본적으로 onMessageReceived라는 camel_case로 작성된 함수에서 실행된다. 파라미터를 보면 RemoteMessage 객체를 받는 것을 확인할 수 있다. 만약 RemoteMessage객체가 도착하면 onMessageReceived함수가 실행되는데 이 때 RemoteMessage가 어떤 형식으로 쓰여졌는 지에 따라 데이터를 받아오는 방식이 달라진다. 

 

1. notification 방식 

getNotification으로 메시지를 수신

당연한 말이지만 getNotification()함수로 notification 방식의 RemoteMessage를 수신받는다. 

 

2. data방식 

getdata방식으로 메시지를 수신

당연한 말 2이지만 getdata() 함수로 data 방식의 RemoteMessage를 수신 받는다. 

 

둘다 존재하는 경우라면 두 개의 함수를 모두 사용하여 메시지를 수신하면 된다.!

 


3. 메시지를 bigText형식으로 받는 법 자바 ver.

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setStyle(new NotificationCompat.BigTextStyle()
                    .bigText(emailObject.getSubjectAndSnippet()))
            .build();

자바에서는 NotificationCompat이라는 객체를 new키워드를 통해 만들어주고 BigTextStyle에 bigtext에서 푸쉬 메시지의 정보 부분을 불러오는 함수를 호출하면 bigText 방식으로 호출이 된다. 

번들에 메시지 객체 정보 저장

우리는 remoteMessage.getdata()함수를 통해 정보를 받아온 map data를 기준으로 번들 b에다가 정보를 putString()함수를 통해서 넣어주었다. 따라서 b에서 getString("키")을 통해 정보를 불러오면 된다. 

setContentText(b.getString("msg_extra"))
BigText style로 설정해준 모습


4. 메시지를 bigText형식으로 받는 법 Kotlin ver.

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setStyle(NotificationCompat.BigTextStyle()
                    .bigText(emailObject.getSubjectAndSnippet()))
            .build()

bigTextStyle의 알림

참고로 BigText style 알림은 256dp의 크기 제한이 있다. 다른 사람들은 왜 모든 push메시지의 내용이 나오지않지?? 라는 의문을 해결하는데 많은 시간이 들지 않기를 바라며.. 

원래 안드로이드 푸쉬 메시지는 64dp의 크기 제한을

갖는데 BigText Style로 지정하면 256dp로 크기 제한이 풀린다.  

알림 상세보기

실제 알림은 이거였다... 다 안나온다 너무 길면!

 

 

728x90
반응형

댓글