Pa K'ode

[안드로이드] 앱 내에서 알림 수신받기 (feat. FCM) 본문

안드로이드

[안드로이드] 앱 내에서 알림 수신받기 (feat. FCM)

Paku 2021. 12. 27. 15:42

안녕하세요, 안드로이드 개발자 파쿠입니다.

간만에 시간이 나서 두번쨰 포스트를 작성하게 되었는데요, 주제를 고민하다 

많은 앱들에서 사용되는 FCM을 통한 앱 푸쉬에 대해서 다뤄볼까 합니다.

 

(FCM은 Firebase Cloud Messaging 의 약자입니다)

 

FCM을 연동 및 사용하려면 Firebase에 앱 등록이 필수로 되어있는 상태여야 합니다. 

해당 방법에 대해선 구글에서 자세히 설명하고있으니 링크로 대체하고 넘어가도록 하겠습니다. :)

https://firebase.google.com/docs/android/setup

 

Android 프로젝트에 Firebase 추가  |  Firebase Documentation

의견 보내기 Android 프로젝트에 Firebase 추가 기본 요건 Android 프로젝트가 준비되지 않았다면 빠른 시작 샘플 중 하나를 다운로드하여 Firebase 제품을 사용해 볼 수 있습니다. 다음 옵션 중 하나를

firebase.google.com

 

해당 글은 앱이 수신받는 방법에 관해 작성되었음을 미리 알려드립니다. (송신x)

 

0)  왜 서버에서 클라이언트가 아닌 굳이 FCM을 통한 통신을 하는가

 

FCM을 통한 개발도중 해당 궁금증이 생겨서 찾아보게되었습니다. 

궁금하지 않으신 분들은 1번 항목으로!

 

해당 이유를 설명하는 FCM의 구조는 다음과 같습니다 :

 

출처 ) https://docs.microsoft.com/ko-kr/xamarin/android/data-cloud/google-messaging/firebase-cloud-messaging

 

해당 그림에서 알수있듯이, 서버 또는 클라이언트 에서 오는 메세지를 모두 FCM을 거쳐 통신을 하게됩니다.

 

FCM을 사용하는 네트워크 트래픽 절감, 배터리 사용량 절감, 등 여러가지 이유가 있지만

가장 현실적이고 중요한 이유 한가지만 정의하지면

 

플랫폼 별로 일관화를 하기 위함입니다

플랫폼이란 IOS,Android , Web 등 각 환경별로 푸쉬 알림 서비스를 설정 및 개발 해야하는걸 개선하기 위함입니다. (APNS등)

FCM은 교차 플랫폼 메시지 솔루션이기 떄문에 어느 플팻폼에도 종속되지않고 Push 서비스를 사용할수있습니다.

 

1.Gradle에 종속성 추가

 

Gradle Scripts내 app수준의 모듈 내에 해당 종속성을 추가해 줍니다.

기본적으로 기타 Firebase 종속성들이 선언되어있고 google service가 Plugin에 추가된 상태여야 합니다. 

 

implementation platform('com.google.firebase:firebase-bom:28.4.2')
implementation 'com.google.firebase:firebase-messaging:23.0.0'

 

동기화 후, 송신되는 서버의 환경에 따라 App Manifest에 해당 속성을 추가할지 선택합니다.

일반적인 환경에서는 추가하도록 합시다.

그리고 앱 푸쉬 서비스는 인터넷 연결도 필요하기 떄문에  인터넷 퍼미션도 추가해 줍니다.

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

 

<service
    android:name=".network.service.FirebaseCloudMessageService"
    android:exported="false">
    <intent-filter>
         <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

 

name 필드에 FirebaseCloudMessageService 파일이 없어서 빨간줄이 들어올텐데요, 만들어주도록 합시다.

 

2. FirebaseMessagingService 콜백 추가

 

굳이  파일 이름까지 똑같이 하실필요는 없습니다. 다만 해당 클라스가 FirebaseMessagingService를 상속받고 있어야합니다.

생성하셨다면 두가지를 Override 하셔야 하는데요, onNewToken 와 onMessageReceived 입니다

 

onNewToken 메서드는 FCM으로 부터 만들어진 푸쉬 콜백을 관리하며 

onMessageReceived 메서드는 FCM으로 부터 온 메세지 처리에 관한 함수입니다. 

 

백문이 불여일견이라고 아래 작성한  예제 코드를 참조 하도록 하겠습니다. 

 

public class FirebaseCloudMessageService extends FirebaseMessagingService {
    
    @Override
    public void onNewToken(@NonNull String token) {
    super.onNewToken(token)
 	// TODO: Implement this method to send token to your app server.
	// FCM 이 아닌 서버간 토큰 연동 작업 실행
    }

    @Override
    public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
    	super.onMessageReceived(remoteMessage)
        //수신 된 메세지 처리
    }
}

 

onNewToken()은 클라우드 서버에 등록되었을 때 호출되고,

파라미터로 전달된 token이 앱을 구분하기 위한 고유한 키가 됩니다.

onMessageReceived()는 클라우드 서버에서 메시지를 전송하면 자동으로 호출되고,

해당 메서드안에서 메시지를 처리하여 아래 예제와 같이 사용할수도 있습니다.

 

remoteMessage는 getData(), getNotification()등의 메서드를 호출해서 메시지에 대한 정보를 얻을 수 있는데,

서버에서 어디에 내용을 담았냐에 따라 선택하면 된다. 해당 예시에선

getNotification()의 , getBody()로 내용을 얻어와 처리했다.

 

private void sendNotification(String messageBody) {
 	//알림 클릭시 실행될 액티비티 (PendingIntent)
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        String channelId = getString(R.string.default_notification_channel_id);
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_ic_notification)
                        .setContentTitle(getString(R.string.fcm_message))
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
              
	//노티 메니저로 알림 팝업 띄우기
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    	// 오래오 버전 이상부터 channelId 값이 필수가 됨
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(channelId,
                    "Channel human readable title",
                    NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

 

3. 등록된 토큰 처리

 

FCM에 등록된 토큰을 가져오려면 FirebaseMessaging.getInstance().getToken 으로 불러올수 있다. 

해당 토큰은 테스트할때 필요하니 로그로 찍어두도록 하자

onSuccess 메소드는 토큰생성에 성공하였을떄 호출된다.

onComplete 메소드는 실패하거나 성공시에 호출된다. 둘다 쓸 필요는없고 필요한걸 사용하면 된다.

 

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
    	public void onSuccess(String token) {
        	log.d("MessageToken",token);
    	}
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "토큰 생성 실패", task.getException());
            return;
          }
          // 새로운 토큰 생성 성공 시
          String token = task.getResult();
		  log.d("MessageToken",token);
        }
    });

 

* 해당 파트는 등록된 토큰에대해 특별한 처리가 필요없다면 스킵해도 된다. 

필자와 같은 경우엔 Sendbird라는 메세징 서비스를 사용하면서 FCM연동 작업을 했는데 이떄

FCM에 등록된 토큰을 샌드버드 서버에 등록시켜줄 필요가 있었다.

 

//람다식 
FirebaseMessaging.getInstance().getToken().addOnSuccessListener(token -> {
	SendBird.registerPushTokenForCurrentUser(token,true, (pushTokenRegistrationStatus, e) -> {
	if (e != null) {
		e.printStackTrace();
    }
    });
});

 

마찬가지로 onNewToken메소드가 호출될떄에도 SendBird 서버도 갱신시켜줘야 한다.

 

 

4. 푸쉬 알림 테스트

 

마무리 테스트 단계입니다. 파이어 베이스에 등록된 앱으로 들어간 후, 좌측하단, 참여 탭 내에 Cloud Messaging 로 들어갑니다.

 

 

 

해당 화면으로 진입했다면 Send Your First Message 버튼 클릭 후 테스트 메세지를 만들어 줍니다.

타이틀과 내용만 작성 후 우측에 테스트 메세지 보내기 전송을 누른후,

 

 

3번 작업에서 가져온 토큰을

FCM 등록 토큰 추가 라고 써있는 필드에 붙혀놓고 테스트 버튼을 눌러 완료해줍시다.

 

해당 글은 본문 을 참조하였습니다.

본문: https://firebase.google.com/docs/cloud-messaging/android/client?hl=ko#register_your_app_with_firebase 

 

Android에서 Firebase 클라우드 메시징 클라이언트 앱 설정  |  Firebase Documentation

의견 보내기 Android에서 Firebase 클라우드 메시징 클라이언트 앱 설정 Firebase 클라우드 메시징 Android 클라이언트 앱을 만들려면 FirebaseMessaging API와 Gradle이 있는 Android 스튜디오 1.4 이상을 사용하세

firebase.google.com

Comments