본문 바로가기
Android 개발/Firebase Analytics Message RemoteConfig

Firebase Cloud Messaging 총정리 # push message

by Developer88 2019. 11. 7.
반응형

오늘은 푸쉬메시지라고 불렸던,

Firebase Cloud Messaging, 줄여서 FCM에 대해서 정리해 보겠습니다.

 

1. FCM의 개념

B라는 사람에게 어떠한 메세지를 전달하는 데 있어서 아래와 같은 두가지 경우를 먼저 생각해 보겠습니다.

첫번째는, A가 B에게 개인적인 메세지를 전달하기 위해서, 앱을 사용하고,

서비스를 하는 회사의 서버를 거쳐서 B에게 가는 것 이구요.

두번째는, 앱에서 사용자에게 무엇인가 홍보하기 위해서,

서비스 회사의 서버에서 B에게 메세지를 보내는 것 인데요.

 

1. A->서버->B

2. 서버 ->B

 

그런데, 메세지를 실시간으로 전달받게 하려면,

B는 서버에 계속 접속해 있어야 합니다.

이것은 실제로 구현한다면, 배터리나 네트워크 사용때문에 문제가 되겠지요.

 

그래서 이 중간에 구글의 클라우드 서버(혹은 Firebase의 서버)가 끼어들어서 문제를 해결해 줍니다.

왜냐하면 안드로이드 OS를 개발한 구글의 클라우드 서버는

배터리나 네트워크 사용도 적은 상태에서,

사용자에게 실시간으로 무언가를 보내고 받는 것이 가능한 서버이기 때문입니다.

 

모든 앱들은 이렇게 구글의 클라우드 서버를 경유해서

실시간으로 B에게 메세지를 보내고 있습니다.

 

1. A->서버-> 구글 클라우드 ->B

2. 서버-> 구글 클라우드 ->B

 

저같은 개인 개발자들의 경우를 생각해 보면,

앱에서 무언가 홍보를 하고 싶을 때

서버 없이, 구글 클라우드 콘솔에서 바로 B로 보낼 수 있는데요.

 

3. 구글 클라우드 콘솔 ->B

 

오늘은 3번의 과정을 중심으로 정리해 보려고 하는데요.

하나씩 알아보도록 하겠습니다.

 

 

2. FCM구현

2-1. FCM구현

FCM을 구현한 앱은 실행되면 유니크한 토큰을 받는데요.

그 토큰을 받아서 앱을 서비스하는 회사의 서버에 저장해 놓았다가,

해당 유저에게 무언가를 보낼 때 식별자로 사용하여서, 

구글 클라우드를 통해 실시간 메세징을 하게 됩니다.

 

결국 실시간으로 무언가를 보내고 받기 위해서,

구글 클라우드 서버를 거쳐야 하고,

보내고 받는 식별자로 유저의 id나 이런것을 제공할 수는 없으므로,

FCM의 유니크한 토큰을 저장하고, id로 사용하는 것 이지요.

 

중요한 것은 토큰을 받는다는 것이고,

이것을 다시 서버로 올려서 활용할 수도 있고,

따로 서버를 사용하지 않는 경우는 이러한 토큰이 있다 정도만 알고 있으면 되겠습니다.

그럼 이제 라이브러리 설치부터 하나씩 구현해 보도록 하겠습니다.

 

2-2. FCM 라이브러리 implementation

가장 먼저 할 것은 라이브러리의 Dependency를 선언하는 것 인데요.

이 글에서 다루지는 않지만, Firebase Console에 앱이 등록되어 있어야 합니다.

그리고 아래의 implementation이 앱레벨의 build.gradle에 추가해 줍니다.

 

implementation 'com.google.firebase:firebase-messaging:20.0.0'

 

2-3. Service 클래스 생성

FCM서비스에서는  메세지를 받아 필요한 액션을 할 수 있는

Service클래스가 필요합니다.

이 Service는 FirebaseMessagingService를 상속받아야 하구요.

 

A. Service 생성

아래와 같이 FirebaseMessagingService를 생성해 줍니다.

onMessageReceived메소드는 이름에서 알 수 있듯이, 메세지를 받았을 때 호출되는 메소드 입니다.

이 부분은 아래에서 다시 보도록 하겠습니다.

 

 

B. Manifest 설정

FCM을 사용하기 위해서는 Manifest 파일도 수정해 주어야 하는데요.

앱이 foreground에 있을 때도 메시지를 핸들링 하려면,

intent-filter에 아래와 같이 MESSAGING_EVENT를 추가해 주어야 합니다.

 

 

 

        <service

            android:name=".service.FCMTestService"

            android:exported="false">

            <intent-filter>

                <action android:name="com.google.firebase.MESSAGING_EVENT" />

            </intent-filter>

        </service>

 
그리고 OS8이후부터 대응하도록 되어있는 알람채널도 Metadata를 이용해서 대응할 수 있는데요.
value값에 아이디 값을 넣어주면 됩니다 .
이외에도, 아래와 같이 meta-data값으로 notification_icon과 color도 설정해 줄 수 있습니다.
 
<meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="알람채널 아이디 값" />
<meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_alarm" />
<meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/noti_color" />
 

2-4. 토큰 발급 및 Topic 구독

서비스를 생성하고 앱을 실행시키면,

가장 먼저 하는 것은 구글클라우드와 연결해서 FCM의 토큰을 얻어오는 일 입니다.

이 토큰은 앱이 지워지게 되면 같이 사라졌다가,

다시 앱 설치시 재 발급 되는 것입니다.

 

A. 발급된 토큰

이 글에서는 다루지 않지만, 

만약 앱의 서버에 토큰을 저장했다가 구글 클라우드 서버에 

메시지를 보내면서 사용해야 할 경우에는,

토큰이 생성되는 시점에 토큰을 받아서 서버에 올리는 것이 필요한데요.

 

이러한 경우를 위해서 구글에서는 메소드를 제공해 주고 있습니다.

토큰을 새롭게 발급받으면 호출되는 onNewToken이라는 메소드에서 실행해주면 됩니다.

 

 

 

구글의 Firebase에는 해당 기기의 토큰값이 다 알아서 올라가 있구요.

이 글에서는 Firebase콘솔(웹사이트)에서 메세지를 보내는 것만 할 것이므로,

위의 메소드를 구현할 필요는 없습니다.

새 토큰이 발행될 때 로깅하는 용도로만 우선 쓰겠습니다.

 

 

B. 토큰 값 읽기

단순히 토큰 값을 앱을 실행하는 시점에

알았다가 사용하고 싶다면, Application.class같은 위치에,

아래와 같이 getInstanceId메소드에 OnComplete리스너를 달아준 다음,

onComplete메소드에서 전달해주는 result값을 토큰으로 받아오면 됩니다.

 

 

 

 

C. 구독하기

특정한 Topic에 구독시킨 다음,

필요할 때 그 그룹에게만 메세지를 보낼 수도 있는데요.

아래와 같이 subscribeToTopic()메소드를 이용해서 특정토픽에 구독시킬 수 있습니다.

 

 

 

2-5. Service에서 메세지 받기 구현

FCM은 두가지의 메세지로 구성되는데요.

Title과 body로 구성된 Notification Message와,

Key-value값으로 구성된 Data Message 입니다.

Data메세지는 선택적으로 보낼 수 있습니다.

먼저 Notification Message부터 구현해 보도록 하겠습니다.

 

A. Notification messages

노티메세지는 서비스의 onMessageReceived에서 구현하면 되는데요.

title과 body값을 받아서 notification을 해주면 됩니다.

(notification에 관한 글은 아래글을 참고해주세요. 여기서는 다루지 않겠습니다)

 

>> 안드로이드 Notification 구현하기 feat. Big View

 

 

 

 

B. Data messages

단순히 key-value값을 보내주므로 이렇게 받은 값을,

WorkManager를 이용해 나중에 사용한다든가 할 수 있을텐데요.

여기서는 key-value값만 받아보도록 하겠습니다.

 

 

공식문서에서는, 10초 미만 정도의 과업만 Service에서 수행하고,

그 이상이 될 것 같은 일은 WorkManager에게 넘기도록 추천하고 있습니다.

 

 

3. 메세지 보내기

위에서 클라이언트에서는 받을 준비가 다 되었기 때문에,

이제 Firebase 콘솔로 들어가서 메세지를 보내도록 하겠습니다.

 

3-1. Firebase콘솔에서 메세지 보내기

Firebase콘솔에서 좌측 하단에 보면 Cloud Messaging이 있구요.

여기를 사용하면 우측과 같이 UI도 쉽게 되어 있어서 어렵지 않게 할 수 있습니다.

 

 

 

 

우측의 테스트 메시지 전송을 누르면 아래와 같은 화면이 나오는데요.

위에서 얻었던 토큰 값을 여기에서 사용해 주면 됩니다.

 

그리고, 위에서 구독했던 Topic에 등록되어 있는 사용자에게 보내기 위해서 주제를 아래와 같이 선택할 수도 있습니다.

 

 

4. 주의할 점들

첫번째, 주의할 점은 Google Playstore가 설치되어 있는 기기에서만

이 서비스가 가능하다는 점 입니다.

우리나라같은 경우 특별히 Google Playstore가 설치되지 않은 기기는 

찾기 어려울 것 같구요.

중국같이 특별한 경우에는 설치가 되어있지 않을 수도 있으니,

그런경우에는 다른 방식으로 접근해야 할 것 같습니다.

 

두번째는, Background제한 리스트에 포함된 앱이라면 FCM메세지를 못 받을수도 있다고 하는군요.

앱 관리를 잘하지 않으면 블랙리스트에 넣어 버리겠다는 것인데요.

Android vital에게 잘못된 행동이 많이 보고되면, 유저에게 해당앱을 Background제한 리스트에 넣기를 추천한다고 하는데요.

조심해야 할 것 같습니다.

참고로 Background제한에 걸렸는지는 isBackgroundRestricted(). 로 알 수 있다고 하는군요.

 

728x90

댓글