본문 바로가기

major/Android

[Android] FCM Push 알림 기능 구현하기

안드로이드 어플에서 원격으로 푸쉬알림을 보내려면 Firebase Cloud Messaging(줄여서 FCM)을 이용해야 합니다.

Firebase 설정부터 Android 코드, 방법까지 정리해봤습니다.

 

1. Firebase 프로젝트 설정

Firebase에서 새로운 프로젝트를 생성합니다.

프로젝트의 대쉬보드에 들어가면 다음과 같은 화면이 보입니다.

앱에 Firebase를 추가하여 시작하기에서 안드로이드 아이콘을 클릭해주세요.

Firebase

Android 패키지 이름을 넣어줍니다.

안드로이드 패키지 이름은, 자신의 프로젝트에서 아래 빨간색 네모가 쳐져있는 부분의 이름을 말합니다.

안드로이드 패키지 이름

디버그 서명 인증서는 선택사항이어서 넣어주지 않았습니다. 테스트만 할거라서 괜찮습니다.

Firebase 설정

그리고 나서 google-services.json파일을 프로젝트 안에 넣어줘야합니다.

Firebase 설정

아래 그림에서 첫번째 빨간색을 클릭해서 Project로 전환하고, 프로젝트>app>src 폴더 안에 파일을 넣어주세요.

안드로이드 스튜디오 캡쳐

이제 build.gradle 파일을 변경해야합니다.

Firebase에서 설명을 읽고 추가해주세요.

Firebase 설정

아래는 제 프로젝트의 build.gradle을 캡쳐한 화면입니다.

빨간색으로 표시한 부분이 추가한 소스코드입니다.

build.gralde (Module:app) 파일
build.gradle (Project:FCMtest) 파일

이렇게 하고나서 프로젝트를 build하고 run해줍니다.

앱이 실행되고 나면 Firebase로 돌아가서 다음을 누릅니다.

그러면 조금있다가 아래와 같이 설치가 확인되었다는 화면이 뜹니다.

Firebase 설정

이러면 Firebase 프로젝트 설정이 끝이 났습니다.

2. 프로젝트에 FCM 설정

이전까지는 어플에서 Firebase를 사용하기 위한 설정이었습니다.

이제는 Firebase Cloud Messaging 설정을 해아합니다.

build.gradle (Module:app)의 dependencies에 아래의 코드를 추가합니다.

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

build.gradle (Module.app)

Sync now를 했을때 문제가 없다면 FCM을 사용하기 위한 설정이 완료되었습니다.

Firebase의 최신 버전이 다르다면 gradle 에러가 있을 수 있습니다. 그때는 에러메시지를 잘 읽고 최신버전으로 바꾸면 Sync 됩니다.

3. 코드 추가

MyFirebaseMessagingService라는 이름으로 새로운 Java Class를 생성합니다.

그리고 AndroidManifest.xml의 <application>태그 안에 다음 코드를 추가합니다.

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

AndroidManifest.xml 파일

그리고 나서 MyFirebaseMessagingService.jav 코드 안에 다음 코드를 추가합니다.

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import androidx.core.app.NotificationCompat;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage != null && remoteMessage.getData().size() > 0) {
            sendNotification(remoteMessage);
        }
    }

    private void sendNotification(RemoteMessage remoteMessage) {

        String title = remoteMessage.getData().get("title");
        String message = remoteMessage.getData().get("message");

        final String CHANNEL_ID = "ChannerID";
        NotificationManager mManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            final String CHANNEL_NAME = "ChannerName";
            final String CHANNEL_DESCRIPTION = "ChannerDescription";
            final int importance = NotificationManager.IMPORTANCE_HIGH;

            // add in API level 26
            NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance);
            mChannel.setDescription(CHANNEL_DESCRIPTION);
            mChannel.enableLights(true);
            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]{100, 200, 100, 200});
            mChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            mManager.createNotificationChannel(mChannel);
        }

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
        builder.setSmallIcon(R.drawable.ic_launcher_background);
        builder.setAutoCancel(true);
        builder.setDefaults(Notification.DEFAULT_ALL);
        builder.setWhen(System.currentTimeMillis());
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setContentTitle(title);
        builder.setContentText(message);
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            builder.setContentTitle(title);
            builder.setVibrate(new long[]{500, 500});
        }
        mManager.notify(0, builder.build());
    }

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
    }
}

 

이렇게 하면 코드 변경은 끝입니다.

프로젝트를 RUN하고 가상머신에서 실행시킨상태로 이제 테스트를 하겠습니다.

4. 테스트

Firebase콘솔에 가서 성장>Cloud Messaging으로 가서 Send your first message를 클릭합니다.

Cloud Messaging

보내고 싶은 메시지를 적고,

타겟으로 자신의 앱을 선택합니다.

앱 선택하기

그리고 게시하면 아래와 같이 푸쉬 알림이 간 것을 확인할 수 있습니다.

실행 화면

FCM 구현이라는 큰 산을 하나 넘었습니다.

저도 맨처음에 구현할 때는 다른분의 포스팅을 보고 구현했는데, 변한게 많은 것 같아서 한번 정리해봤습니다.


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D