[FCM] #1. 소개 및 메시지

[FCM] #2. Firebase 프로젝트 생성 및 Android 앱 FCM 설정

[FCM] #3. Firebase 메시지 전송

[FCM] #4. Android 메시지 처리


이번에는 Android에서 단순 메시지가 아닌 아이콘이나 이미지 메시지를 어떻게 처리하는지 알아본다. 

우선 안드로이드 관련 코드들은 제외하고, 메시지 관련된 부분만 설명한다. 


푸시 메시지는 FirebaseMessagingService 클래스를 상속받아 onMessageReceived 메소드를 오버라이딩 해서 커스텀하게 처리한다.

onMessageReceived 메소드에서 메시지 알림 처리를 하면 앱이 포그라운드, 백그라운드 상관없이 푸시 메시지가 도착한다. 

코드 관련 정보는 #2. Firebase 프로젝트 생성 및 Android 앱 FCM 설정 부분에 있다.

@Override public void onMessageReceived(RemoteMessage remoteMessage) { // ... // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }

푸시 메시지 중 큰 아이콘 메시지, 이미지 메시지 등은 onMessageReceived 메서드에서 처리한다.

remoteMessage는 송신자 정보와 데이터 메시지 정보를 가지고 있다. 

보통 데이터 메시지 안에 제목, 내용, 이미지 정보등을 포함하여 맞춤형 알림 처리를 한다.


이전 HTTP API 기준으로 아이콘 메시지, 이미지 메시지 처리를 해보자.


아이콘 메시지

메시지 정보

아래는 FCM 접속 서버에 발송하는 데이터 메시지 정보이다.

여기서 데이터 메시지는 커스텀하게 key,value를 설정할 수 있다. [FCM] #1. 소개 및 메시지 참고

{
  "data":
    {
      "title":"😃제목😃",
      "body":"😃내용😃",
      "largeIcon":"https://t1.daumcdn.net/news/201902/13/ZDNetKorea/20190213133354225nmeh.jpg"
  },
  "to":"사용자 토큰"
}

onMessageReceived 

Oreo 버전 이상부터는 NotificationChannel 정보를 추가해준다. (추가하지 않으면 메시지 수신 안함)
largeIcon에 링크가 아닌 데이터 자체 정보를 데이터 메시지에 넣을 수 있으나 FCM 전체 페이로드가 4KB까지 지원하므로 권장하지는 않는다. (이미지 메시지도 마찬가지...)

private void onMessageReceived(RemoteMessage remoteMessage){
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 , intent,
                PendingIntent.FLAG_ONE_SHOT);

        String channelId = "one-channel";
        String channelName = "My Channel One1";
        String channelDescription = "My Channel One Description";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
            notificationChannel.setDescription("channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.GREEN);
            notificationChannel.enableVibration(true);
            notificationChannel.setVibrationPattern(new long[]{100, 200, 100, 200});
            notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            notificationManager.createNotificationChannel(notificationChannel);
        }

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId)
                .setSmallIcon(R.mipmap.ic_launcher)
                 //제목
                .setContentTitle(remoteMessage.getData().get("title"))
                 //내용
                .setContentText(remoteMessage.getData().get("body"))
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        try {
            URL url = new URL(remoteMessage.getData().get("largeIcon"));
            //아이콘 처리 
            bigIcon = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            notificationBuilder.setLargeIcon(bigIcon);
        } catch (IOException e) {
            e.printStackTrace();
        }

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

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

결과

이미지 메시지

메시지 정보

이미지 정보도 아이콘과 동일한 이미지로 테스트 해본다. 
{
  "data":
    {
      "title":"😃제목😃",
      "body":"😃내용😃",
      "imgUrl":"https://t1.daumcdn.net/news/201902/13/ZDNetKorea/20190213133354225nmeh.jpg"
  },
  "to":"사용자 토큰"
}

onMessageReceived 

푸시 메시지에 이미지를 적용하기 위해서는 setStyle()에 NotificationCompat.BigPictureStyle() 을 넣어서 사용한다. 
수신된 이미지 메시지는 펼쳐진 상태와 줄여진 상태에서 제목과 내용을 표현하는 방법이 다르다. 

펼쳐진 상태


 제목

 NotificationCompat.Builder.setContentTitle()

 내용

 NotificationCompat.Builder.setContentText()

 줄여진 상태


 제목

 NotificationCompat.BigPictureStyle().setBigContentTitle()

 내용

 NotificationCompat.BigPictureStyle()..setSummaryText()

private void onMessageReceived(RemoteMessage remoteMessage){
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 , intent,
                PendingIntent.FLAG_ONE_SHOT);

        String channelId = "one-channel";
        String channelName = "My Channel One1";
        String channelDescription = "My Channel One Description";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
            notificationChannel.setDescription("channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.GREEN);
            notificationChannel.enableVibration(true);
            notificationChannel.setVibrationPattern(new long[]{100, 200, 100, 200});
            notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            notificationManager.createNotificationChannel(notificationChannel);
        }

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(remoteMessage.getData().get("title"))
                .setContentText(remoteMessage.getData().get("body"))
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        try {
            URL url = new URL(remoteMessage.getData().get("imgUrl"));
            //이미지 처리 
            bigPicture = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            notificationBuilder.setStyle(
                    new NotificationCompat.BigPictureStyle()
                            .bigPicture(bigPicture)
                            .setBigContentTitle(remoteMessage.getData().get("title"))
                            .setSummaryText(remoteMessage.getData().get("body")));
        } catch (IOException e) {
            e.printStackTrace();
        }

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

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

결과



아이콘과 이미지를 같이 처리하면 아래와 같은 결과를 얻을 수 있다. 


마치며

지금까지 푸시 메시지 발신, 수신을 확인하기 위해서 Firebase 프로젝스 생성 및 설정, AndroidStudio로 앱 생성 및 설정 작업, 메시지 전송 작업을 하였다. 
푸시 메시지에 수신 처리은 그렇게 어렵지 않다. 
사용자에게 메시지를 어떻게 발송할지에 대한 니즈에 따라 메시지를 발송하는 담당하는 앱서버에서 작업이 달라진다. 
(대량 메시지 발송, 특정 앱의 키워드에 대한 알림 수신, 주문을 했을 때 주문 및 배송상태에 대한 수신, 게임 설치 중이나 설치 완료에 대한 수신 등등)



Posted by 사용자 피랑이

댓글을 달아 주세요

[FCM] #1. 소개 및 메시지

[FCM] #2. Firebase 프로젝트 생성 및 Android 앱 FCM 설정

[FCM] #3. Firebase 메시지 전송

[FCM] #4. Android 메시지 처리




일반적인 FCM(Firebase Cloud Message) 발송은 앱 서버에서 FCM 서버로 메시지 요청을 보내고, FCM 서버에서는 다시 클라이언트 기기 앱에 메시지를 보낸다. 


#2에서는 FCM 서버에서 클라이언트 기기로 수신되도록 세팅을 하였다. 

이번 #3에서는 앱 서버에서 FCM 서버로 메시지 요청을 보내는 방법에 대해서 알아본다. 


FCM 서버로 전송하는 방법으로는 크게 3가지 구분된다. 


1. Firebase Admin SDK 이용

2. HTTP V1 API 이용

3. 기존 HTTP API 이용


각 전송 방법 별로 가능한 수신 분류에 대해 정리하였다. 

 

단일 기기

멀티캐스트

(여러 기기)

기기 그룹 

주제 구독 

 Firebase Admin SDK

O

X

X

 HTTP V1 API

O

X

O

 기존 HTTP API

O

O

O

추가로 #2에서 Android Studio에서 기기 그룹이나 주제 구독에 대한 처리를 하지 않았으므로 단일 기기로만 발송테스트를 진행한다. 


Firebase Admin SDK로 발송 

Firebase Admin SDK를 사용하면 자체 백엔드 서비스를 Firebase 클라우드 메시징(FCM)과 통합할 수 있습니다. 
Admin FCM API는 Firebase 서버 인증을 처리하는 동시에 메시지 보내기와 주제 구독 관리를 지원합니다.

위 소개글에 보면 주로 백엔드 관리툴에서 테스트 형태로 사용할 수 있다는 의미인거 같다.  사실 3가지 방법 중 가장 심플한 방법으로 백엔드 관리툴에 붙여도 된다. 

환경설정 및 초기화

Admin SDK를 사용하려면, 아래 3가지 방법 중 하나를 사용해야 한다. 
- projectId Firebase 앱 옵션을 명시적으로 지정합니다.

서비스 계정 사용자 인증 정보로 SDK를 초기화합니다.

- GCLOUD_PROJECT 환경 변수를 설정합니다.

우리는 서비스 계정 사용자 인증 정보로 SDK 초기화 사용한다. 


먼저 사용해야할 비공개 키를 발급받는다.


Firebase 콘솔에서 설정>서비스계정에 들어가면 새 비공개 키 생성 이라는 버튼이 보인다. 


문구에서도 나와 있듯이 공개 저장소에는 넣지 말자.

추가로 json 파일은 내용을 열어서 확인해 보면 좋다. 

프로젝트 관련 비밀키 및 환경 정보들이 들이있다. 


각자 자바 프로젝트 생성하자.

다운로드를 받은 json 파일을 넣자. 

본인은 기본 클래스패스인 resource에 넣었다. 


종속성도 처리하자. 본인은 maven을 사용하므로 pom.xml에 종속성을 추가하였다. 


  com.google.firebase
  firebase-admin
  6.4.0

이제 SDK 초기화 코드를 넣어 보자.

InputStream serviceAccount = null;
FirebaseOptions options = null;
try {
    ClassPathResource resource = new ClassPathResource("fcmmsg.json");
    serviceAccount = resource.getInputStream();
    options = new FirebaseOptions.Builder()
        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
        .build();
    FirebaseApp.initializeApp(options, "fcmmgs");
} catch (FileNotFoundException e) {
    logger.error("Firebase ServiceAccountKey FileNotFoundException" + e.getMessage());
} catch (IOException e) {
    logger.error("FirebaseOptions IOException" + e.getMessage());
}

이것으로 Admin SDK 설정 및 초기화가 완료 되었다. 

추가 정보는 https://firebase.google.com/docs/admin/setup?authuser=0#initialize_the_sdk 여기를 참조하자. 

전송

개별 기기로 전송하는 부분을 추가한다.  
Notification notification = new Notification("타이틀","내용");

Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setToken("기기토큰정보")
.setNotification(notification)
.build();

String response = null;
try {
    response = FirebaseMessaging.getInstance(FirebaseApp.getInstance("fcmmsg")).send(message );
} catch (FirebaseMessagingException e) {
    logger.error("Firebase FirebaseMessagingException" + e.getMessage());
    e.printStackTrace();
}

추가 정보는 https://firebase.google.com/docs/cloud-messaging/admin/send-messages?authuser=0 여기를 참조하자.


에뮬레이터로 확인해 보면 메시지가 온 것을 확인할 수 있다. 

HTTP V1 API 발송

기존 HTTP API 보다 액세스 토큰을 통한 보안 향상, 확장성 강화, 메시지 맞춤설정 등 장점이 많다.
HTTP API는 발송하는 서버키 값이 고정인데 반해 HTTP V1은 발송하는 서버키 값을 엑세스 토큰으로 받아서 사용하는 부분이 다르다. 
하지만 멀티캐스트 메시징을 지원하지 않아 아직까지는 기존 HTTP API를 많이 사용한다. 

환경설정 및 초기화

본인은 http 플로그인을 okhttp를 사용하기 위에 종속성을 추가하였다. 


 com.squareup.okhttp3
 okhttp
 3.9.1

HTTP V1 API를 사용하기 위해 초기화 코드를 넣는다. 

GoogleCredential googleCredential = null;
InputStream serviceAccount = null;
String SCOPES = "https://www.googleapis.com/auth/firebase.messaging";
try {
    ClassPathResource resource = new ClassPathResource("fcmmsg.json");
    serviceAccount = resource.getInputStream();
    googleCredential = GoogleCredential
            .fromStream(serviceAccount)
            .createScoped(Arrays.asList(SCOPES));
} catch (IOException e) {
    e.printStackTrace();
}
알림 메시지 구조
아래 정보는 알림메시지 샘플데이터다. 
기존 HTTP 알림메시지와는 조금 다르다. 
{
  "message": {
    "token": "bk3RNwTe3H0:CI2k_...",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}
//com.google.gson 사용
JsonObject jsonObj = new JsonObject();
jsonObj.addProperty("token", "토큰정보");
JsonObject notification = new JsonObject();
notification.addProperty("body", "\uD83D\uDE03바디V1");
notification.addProperty("title", "\uD83D\uDE03타이틀V1");
jsonObj.add("notification", notification);
JsonObject message = new JsonObject();
message.add("message", jsonObj);

전송

요청할 URL은 아래와 같다. 
https://fcm.googleapis.com/v1/projects/프로젝트ID/messages:send
Firebase 콘솔로 들어가서 프로젝트 ID는 설정>일반 메뉴에서 볼 수 있다. 


전송 코드를 추가한다. 

추가 정보는 https://firebase.google.com/docs/cloud-messaging/migrate-v1?authuser=0 여기를 참조하자.


final MediaType mediaType = MediaType.parse("application/json");
OkHttpClient httpClient = new OkHttpClient();
try {

    Request request = new Request.Builder().url("https://fcm.googleapis.com/v1/projects/fcmmsg/messages:send")
        .addHeader("Content-Type", "application/json; UTF-8")
        .addHeader("Authorization", "Bearer " + googleCredential.getAccessToken())
        .post(RequestBody.create(mediaType, message.toString())).build();
    Response response = httpClient.newCall(request).execute();
    logger.info("Successfully sent message: " + response);
} catch (IOException e) {
    logger.error("Error in sending message to FCM server " + e);
}

에뮬레이터로 확인해 보면 메시지가 온 것을 확인할 수 있다. 

기존 HTTP API 발송

아직 많이 사용하고 있는 방식이다. 

메시지 가공 및 발송


//메시지 가공
JsonObject jsonObj = new JsonObject();
//token
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree("등록토큰");
jsonObj.add("to", jsonElement);
//Notification
JsonObject notification = new JsonObject();
notification.addProperty("title", "\uD83D\uDE03타이틀HTTP");
notification.addProperty("body", "\uD83D\uDE03바디HTTP");
jsonObj.add("notification", notification);

/*발송*/
final MediaType mediaType = MediaType.parse("application/json");
OkHttpClient httpClient = new OkHttpClient();
try {
    Request request = new Request.Builder().url("https://fcm.googleapis.com/fcm/send")
        .addHeader("Content-Type", "application/json; UTF-8")
        .addHeader("Authorization", "key=" + "서버키값")
        .post(RequestBody.create(mediaType, jsonObj.toString())).build();
    Response response = httpClient.newCall(request).execute();
    String res = response.body().string();
    logger.info("notification response " + res);
} catch (IOException e) {
    logger.info("Error in sending message to FCM server " + e);
}
등록토큰은 기기 토큰 값을 넣어준다.

서버키값은 Firebase 콘솔에 가서 설정>클라우드 메시징에 가면 정보가 있다. 

알림메시지 구조

to는 기기 토큰, 기기 그룹 토큰, 주제가 들어갈수 있다. 

멀티 캐스트로 발송하려면 to를 사용하지 않고 registration_ids를 사용한다. 

{
  "to": "",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available."
  },
  "data": {
    "story_id": "story_12345"
  }
}

에뮬레이터로 확인해 보면 메시지가 온 것을 확인할 수 있다. 

마치며

여러기기에 메시지를 전송하는 멀티캐스트는 기존 HTTP API만 가능하다. 
보안이나 확장성이 강화된 HTTP V1 API가 있지만
아직까지는 기기 그룹이나 주제 구독 보다는 멀티캐스트를 많이 사용하므로 기존 HTTP API가 주로 사용된다.  


다음 주제는 안드로이드 메시지 처리에 대해서 알아본다. 


Posted by 사용자 피랑이

댓글을 달아 주세요

  1. 김동용 2019.08.28 16:59  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 작성하신 글 잘 읽어보았습니다.
    작성자님의 글을보고 따라하고있었는데요 서버키 json 파일 다운받은 후부터 설명하신게 이해하기 힘듭니다..(뭔가 중간에 생략되어있는것 같구..ㅠㅠ 그리고 혹시 모든 작업을 안드로이드 스튜디오에서 작업하신건가요?? 만약 그렇다면 maven과 pom.xml은 어떻게 사용하신건지...)
    혹시 실례가 안된다면 조금 더 자세하게 설명해 주실수 있으신가요?

  2. 개혁 2019.09.03 10:47  댓글주소  수정/삭제  댓글쓰기

    글 잘봤습니다. 하지만 내용이 길어지면 해당 내용을 볼수가없습니다.

    어떤 방법이 있을까요?

[FCM] #1. 소개 및 메시지

[FCM] #2. Firebase 프로젝트 생성 및 Android 앱 FCM 설정

[FCM] #3. Firebase 메시지 전송

[FCM] #4. Android 메시지 처리


FCM(Firebase Cloud Message) 메시지가 기기로 전달이 되려면 발신자인 Firebase 그리고 수신자인 기기 설정이 필요하다. 

기기 설정은 전문 앱개발자가 아니기 때문에 간단하게 Android 환경에서 샘플 앱을 만들고 FCM 관련 부분을 설정한다.

Firebase

Firebase는 클라우드 환경에서 웹이나 앱을 쉽게 만들 수 있도록 도와주는 서비스 프로바이더라고 보면 될거 같다.
호스팅, 인증, 데이터베이스, 분석, 클라우드 메시지 등등 다양한 기능들을 벡엔드 형태로 제공하고 있고, 쉽게 사용할 수 있다.
당연히 서비스를 이용한 만큼 비용을 지불하지만, FCM은 무료다. 그래서 많이 이용한다. 
이해를 위해 소개 영상을 한번 보길 바란다.

Firebase 가입 

구글 계정으로 하면 된다. 

Firebase 콘솔로 이동

가입이 완료되고 https://firebase.google.com/ 에서 콘솔로 이동 메뉴을 클릭한다.

프로젝트 생성

1. 콘솔로 이동 클릭


2. 프로젝트 추가 클릭


3. 프로젝트 이름 추가 / 약관 동의 체크 / 프로젝트 만들기 클릭


4. 프로젝트 생성 완료 / 계속 클릭


5. 프로젝트 메인 화면


Firebase 프로젝트에 안드로이드 앱 등록

FcmMsg라는 프로젝트가 생성되었다. 이제 앞으로 만들 안드로이드 앱을 미리 등록해보자.
안드로이드 앱은 패키지명이나 앱닉네임,SHA1 서명으로 등록 가능하다.
Android Studio로 만들 패키지 명을 미리 등록해 보자.

1. 프로젝트 설정 클릭  

Firebase 설정 일반 정보를 볼수 있다. 간단히 보자

프로젝트ID를 유니크하게 만들면 ID만 나오는데 fcmmsg로 만든 프로젝트들이 많이 있어서 숫자까지 나온다. 

아마도 동일한 프로젝트 이름의 넘버링 같다.

외부에 공개되는 이름도 나와있다. 

해당 프로젝트에 앱을 등록하지 않아서 그림과 같이 프로젝트 앱이 없다고 나온다.

안드로이드 아이콘 을 클릭하여 앱을 등록하자.


2. 앞으로 만들 안드로이드 앱의 패키지 이름 등록 후 앱 등록 클릭 


3. 다음 클릭

프로젝트의 설정 정보를 json파일로 다운로드 화면을 볼 수 있다. 

친절하게 경로까지 나와있다. 굳이 이 화면서 다운로드 받지 않아도 나중에 다운로드 가능하다. 미리 받아도 상관없다.


4. 다음 클릭

gradle 기준으로 종속 설정도 친절하게 나와있다. 나중에 설정하면 된다.


5. 이 단계 건너뛰기 클릭

미리 작업된 앱이 있으면 설치가 되었는지 확인하는 과정인데 아직 앱을 만들지 않았으므로 건너뛴다.


6. 해당 프로젝트에 안드로이드 앱이 하나 추가되었다. 


7. 상황에 따라 앱 추가를 클릭하고 IOS 앱을 등록해도 된다. 
여기선 안드로이드만 세팅할 예정이므로 등록하지 않는다. 

google-services.json

해당 파일은 Firebase 설정 파일 정보를 가지고 있다. 
외부에 노출이 되지 않게 관리가 잘 되어야한다.

Android 앱 제작

간단하게 FCM 받을 수 있게끔 앱을 생성하고 세팅하자.

Android Stuido 설치

https://developer.android.com/studio/?hl=ko 링크를 클릭하여 Android Studio를 각 사용하는 OS별로 설치하자.
본인 OS는 Windows 64라서 그 환경에 맞는 설치를 진행하였다. 

Android 프로젝트 생성

1. 메뉴에서 File / New / New Project 클릭

Applcation name을 입력한다. 본인은 fcmmsg를 등록하였다.

Pakage name은 위에서 등록한 안드로이드 앱의 패키지명과 동일하게 해준다. 

2. Phone and Tablet 설정하고 Next 클릭

테스트할 Android 환경을 설정한다. 본인은 Oreo를 선택하였다.


3. Empty Activity 선택 Next 클릭 / finish

앱에 대한 액티비티 선택이다. FCM 메시지 테스트만 하기 때문에 빈 액티비티를 선택하였다. 


4. Tools / Firebase 클릭 

Android Studio에서는 Firebase 관련 툴을 제공한다. 

Firebase를 클릭하면 오른쪽 관련 메뉴가 보인다. 

해당 메뉴들은 Firebase 설정을 최대한 자동화 해주는 기능들이다. 

수동으로 설정해도 상관없다. 



5. Set up Firebase Clound Messaging 클릭

본인은 FCM만 사용할 예정이라 해당 메뉴를 클릭한다. 

  

6. Connect to Firebase 클릭

첫번째로 Firebase에 접속 인증정보를 입력하여 생성한 fcmmsg를 선택한다. 



7. Add FCM to app 클릭 / Accept Chages 클릭

Connect your app to Firebase가 정상적으로 연결되면 Connected라고 나온다. 

이번엔 접속된 Firebase 프로젝트의 설정 정보를 자동으로 추가 설정해준다. 


Accept Changes 클릭하면 

프로젝트단 gradle 및 앱단 gradle 설정, app폴더의 google-servervice.json 까지 정보를 자동으로 추가해준다. 


8. ③, ④설정

③Access the device registration token은 Firebase에서 사용하는 기기 토큰을 접속하는 방법이 설명되어 있고, 

④Handle messages는 FCM 메시지를 받았을 때 처리하는 방법이 설명되어 있다. 


9. MsgFireBaseIdService 클래스 생성

③Access the device registration token을 적용하기 위해 클래스를 생성한다. 



10. MsgFirebaseMessagingService 클래스 생성

④ Handle messages을 적용하기 위해 클래스를 생성한다. 


11. MsgFireBaseIdService 클래스 코드 적용

좌측에 두개의 클래스가 추가 되었다. 

MsgFireBaseIdService에 코드를 추가한다.  8. ③, ④설정 코드임 

sendRegirationToServer(refreshToken) 내용은 주석으로 처리한다. 

해당 메소드는 서버쪽에서 토큰을 저장해야하므로 관련된 부분의 샘플 메소드다. 


12. MsgFirebaseMassagingServcie 클래스 코드 적용

8. ③, ④설정 코드를 보고 추가한다.  

ScheduleJob() 및 HandleNow()는 주석으로 처리한다. 

메시지가 도달하였을 때에 대한 샘플 메소드이므로 우선 주석처리한다. 


13. AndroidManifest.xml 설정

기기토큰 및 메시징 처리를 위하여 메니페스트를 적용한다.  

com.google.firebase.INSTANCE_ID_EVENT 는 토큰 처리이므로 토큰 처리 클래스 MsgFireBaseIdServece를 추가한다. 

com.google.firebase.INSTANCE_MESSAGING_EVENT 는 메시지 처리이므로 메세지 처리 클래서 MsgFirebaseMessagingService를 추가한다. 


14. Firebse 콘솔에서 메시지를 보내본다.  

프로젝트 생성 및 FCM 설정이 거의 다 끝났다. 


15. 에뮬레이터 선정 

우선 앱이 잘 뜨는지 확인해 보기 애뮬레이터 설정을 해야 한다. 

처음 Run app 할 때 새로 에뮬레이터를 추가해 줘야 한다. 

Create New Virtual Device를 클릭하여 추가한다. 

보인은 Nexus 5X를 추가했다. 


16. 에뮬레이터에서 앱 확인

Run app을 하면 에뮬레이터에서 앱을 확인 할 수 있다. 

밑에 로그중 Refresh token은 기기의 앱 토큰이다.  

Firebase 콘솔에서 토큰을 넣어서 테스트 해야 하기 때문에 우선 복사해 놓자. 

보통 아래와 같은 형태다 


e2mbtHS8PfE:APA91bHeC0r91I-OBD9qyGHNZ9Qb18AFHsPX7WhuTfBjWAbpK7RX0s8AQeBBV1uZYhO-sNdCZnKdk41GlI0WG6h0FTuDVp1Huueb_G78a4a8d-DxaS-g0sJcAGdjz9cNsq 


기기 토큰이 변경될 때는 여러 경우가 있는데 보통 새로 앱이 설치되었을 때나, OS 자체 복원인 경우, 그리고 앱 데이터 삭제를 했을 경우에 일어난다. 

앱을 종료했을 경우에는 기기 토큰 변경이 일어나지 않는다. 

Firebase 콘솔에서 메시지 테스트

지금까지 Firebase 설정 및 Android Studio를 이용하여 앱을 생성하였다. 
이제 Firebase 콘솔에서 메시를 보내보자. 

에뮬레이터 앱 실행 화면

Nexus X5 에뮬레이터를 이용하여 fcmmsg 앱을 실행한 화면이다. 


앱을 종료하거나 백그라운드 상태로 변경한다. 



Firebase 콘솔 메시지 보내기

Firebase 콘솔에서 메시지를 보내보자. 
본인은 기기 단일 토큰으로만 메시지를 보낸다. 
기기그룹이나. 주제를 이용한 메시지 전송은 나중에 상황이 될 때 진행한다. 

1. Cloud Messaging 클릭 / Send your first message 클릭

이제 처음으로 메시지를 보내본다. 

Send your first mesasge를 클릭하면 알림 작성 화면이 나온다. 

알림 제목과 내용을 입력한다. 


2. 기기에서 테스트 클릭 / 테스트 클릭
아까 복사해 뒀던 토큰을 입력하고 + 눌러 추가한다. 
이제 테스트 클릭을 하면 메시지가 에뮬레이터로 전송된다. 

에뮬레이터 앱 메시지 도달 화면

메시지가 기기에 도달이 되면 알림이 온다. 
마우스를 이용하여 아래로 드래그 하면 메시지 제목과 내용이 나온다. 

제목은 잘살아보세
내용은 우리 모두 잘살아보세


마치며...

지금까지 Firebase 설정 및 안드로이드 앱을 제작하였다. 
그리고 에뮬레이터를 실행하여 실제 메시지가 오는지 확인까지 하였다. 

이것으로 기본적으로 푸시 메시지를 받을 수 있는 수신 환경이 마련되었다.

다음에는 푸시 메시지 발송에 대해서 알아보자. 


Posted by 사용자 피랑이

댓글을 달아 주세요