오랜만에 포스팅 입니다.

요즘 바쁜관계로 항상 포스팅해야지 하고선 키워드만 메모해놓고 포스팅을 못하고 있네요.


오늘은 구글 클라우드 메시징 서비스인 FCM 사용방법을 포스팅 하겠습니다.


클라우드 메시징 FCM 푸시는 서버 혹은 특정 요청발생시에 자신의 안드로이드 어플리케이션에서 수신을 받아 메시지를 받는 것을 말합니다.

(IOS에서도 사용가능합니다.)


프로젝트 생성 부터 푸시를 받는 예제까지 작업해보도록 하겠습니다.


1. 프로젝트 생성 및 기본 설정


먼저 자신의 구글 계정을 통하여 파이어베이스 콘솔사이트에 접속을 합니다.


파이어베이스 콘솔

https://console.firebase.google.com/u/0/?hl=ko&pli=1


그리고 다음 사진의 설명과 같이 진행하시면됩니다 



먼저 파이어베이스 콘솔사이트에 접속하여 프로젝트를 생성합니다.

프로젝트 추가를 누릅니다.



저는 테스트용도로 FCM TEST라고 프로젝트명을 지정하였습니다.

프로젝트 이름을 작성하고 약관에 동의후 프로젝트 만들기 하시면 됩니다.



생성된 프로젝트에 들어와서 Project Overview 항목에 '톱니바퀴' 모양을 눌러줍니다.



톱니바퀴를 누른뒤 '프로젝트 설정'에 들어가보시면 나의 프로젝트의 ID와 API키등을 확인할수 있습니다.



프로젝트 설정 하단에 오늘의 주제인 안드로이드 FCM구현을 위해 Android 앱에 Firebase 추가를 선택해줍니다.



안드로이드 추가를 선택하시면 Android 패키지 이름을 요구합니다.

해당 패키지이름은 안드로이드 프로젝트 패키지명을 의미합니다.



안드로이드로 넘어와서 프로젝트를 생성합니다.

프로젝트 이름 패키지명을 지정/생성후 하단 보이는 Package name 을 복사/붙여넣기 하시면됩니다.

(저는 테스트 용도로 'fcm'으로 생성하였습니다.)



다시 파이어베이스 콘솔로 돌아와서 안드로이드 스튜디오에서 생성한 패키지명을 입력해줍니다.

나머지 앱닉네임, 디버그 서명 인증서는 선택사항임으로 생략하겠습니다.



앱등록을 진행후에 'google-services.json' 파일을 제공합니다.

해당 파일은 나의 안드로이드 프로젝트와 파이어베이스를 동기화시키는 연결고리 역할을 합니다.

구글에서 인증 프로토콜로 구글에서 개발하여 하여 기존 RPC프로토콜과 다른 GRPC라고 명칭 합니다.



해당 프로젝트에 App폴더 및에 파일을 복사 해주시면 됩니다.



그리고 프로젝트에 build.gadle의 플러그인을 추가해줍니다.

(자세한 사항은 아래사진에 있습니다.)



먼저 App build.gradle 입니다.

가이드에는 최신버전 16.0.1을 권장하고 있지만, 저는 12.0.0 으로 진행하였습니다.

(보안적으로 업데이트를 하였지만, 안드로이드 스튜디오든 구글 플러그인은 항상 업데이트이후 말썽이 많아 기존 잘 유지되던 버전으로 사용하겠습니다.)


dependencies안에는  implementation 'com.google.firebase:firebase-messaging:12.0.0'


dependencies 밖에는 apply plugin: 'com.google.gms.google-services'


사진을 잘 참고해주시고 붙여넣어주세요!



Project build.gradle 입니다.

구글에서 권장하는 최신버전으로 붙여넣으셔도 문제없습니다.


dependencies안에  classpath 'com.google.gms:google-services:4.0.1' 를 붙여넣어주세요.



이로써 프로젝트 생성과 안드로이드 프로젝트 설정이 끝났습니다.



2.  안드로이드 프로젝트 소스코드 작성



Manifest 퍼미션 설정

FCM은 인터넷 환경에서 작동되는 서비스 입니다.

즉, 어플리케이션의 인터넷 퍼미션을 열어줘야합니다.


매니페스트 상단에 퍼미션 설정을 해주시면 됩니다.


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



Manifest 서비스 설정

FCM을 사용하기위해 어플을 설치한 기기장치의 디바이스 토큰값을 얻어오는 서비스와 푸시 메시지를 받았을때 동작하는 서비스를 등록해 주어야 합니다.


<application> 태그 안쪽에 붙여넣거나 작성해주시면됩니다.


<service

      android:name=".MyFirebaseMessagingService">

      <intent-filter>

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

      </intent-filter>

 </service>

 <service

      android:name=".MyFirebaseInstanceIDService">

      <intent-filter>

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

       </intent-filter>

 </service>



메인 소스코드 작성

2가지의 자바 클래스파일을 자바 메인에 생성합니다.

(생성 위치는 다들 아실것이라 생각하지만 혹시나 모르시는분은 아래 사진을참고해주세요.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d("IDService""Refreshed token: " + refreshedToken);
 
        sendRegistrationToServer(refreshedToken);
    }
 
    private void sendRegistrationToServer(String token) {
 
    }
}
 
cs


MyFirebaseInstanceIDService

해당 클래스 파일은 어플리케이션 실행시 디바이스토큰이 생성 및 재생성 될시에 동작을 작성합니다.


sendRegistrationToServer는 어플리케이션을 실행후, 해당 어플리케이션을 실행한 Device 토큰을 서버로 전송하는 코드를 작성하시면 됩니다.

(앱으로 푸시를 보내기 위해서는 Device토큰이 필수값 입니다.)


오늘은 설정을 마친뒤 발송테스트를 파이어베이스 콘솔에서 진행할것 입니다.

혹시나 별도의 웹서버나 요청을할 서버가 있다면 코드를 작성하시면 될것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MyFirebaseMsgService";
 
    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @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.
            } 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());
            sendNotification(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.
    }
    // [END receive_message]
 
    /**
     * Handle time allotted to BroadcastReceivers.
     */
    private void handleNow() {
        Log.d(TAG, "Short lived task is done.");
    }
 
    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param messageBody FCM message body received.
     */
    private void sendNotification(String messageBody) {
 
        Intent intent = new Intent(this, MainActivity.class);
 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
        PendingIntent pendingIntent = PendingIntent.getActivity(this0, 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.mipmap.ic_launcher)
                        .setContentTitle("FCM Message")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
 
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String channelName = getString(R.string.default_notification_channel_name);
            NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);
            notificationManager.createNotificationChannel(channel);
        }
        notificationManager.notify(0, notificationBuilder.build());
    }
}
cs


MyFirebaseMessagingService

해당 클래스파일은 메시지를 수신하여 알림으로 보여주는 클래스 입니다.


어플리케이션이 실행되면서 해당 클래스가 서비스로 돌고 있다가 메시지가 수신이된다면 Notification으로 알림을 해주는 코드 입니다.

만약 알림을 수신하지않고 별도의 작업을 하고싶게 작성하고싶으면 onMessageReceived 메소드를 수정하시면 될것 같습니다.



strings.xml 설정

간혹 혹시나, MyFirebaseMessagingService 소스코드를 작성하였을때 Strings.xml에서 없는 String값이라고 에러가 나올수도있습니다.

해당 오류에 맞는 태그 스트링 값입니다.

(에러가 안발생하시는분은 선택사항입니다.)


<string name="default_notification_channel_id">Channel ID</string>

 <string name="default_notification_channel_name" translatable="true">Test</string>


이제 모든 설정이 끝이 났습니다.

작성한 코드가 정상적으로 동작 실행하는지 확인해보겠습니다.


3. 동작 확인



다시 콘솔로 돌아옵니다.

그후 성장 메뉴에 Cloud Messaging메뉴로 들어갑니다.



'Send your first message' 혹은 기존에 메시지를 보내보셨던분은 '알림 생성'으로 메시지 작성을 시작합니다.



어플리케이션에게 발송한 푸시 메시지 제목, 메시지 내용을 작성하였습니다.

(임의로 Test, Fcm Test 라고 작성 테스트 하였습니다.)




푸시 메시지를 받을 타겟을 생성한 앱을 선택해줍니다.

이렇게 된다면 해당 어플리케이션이 설치된 모든 디바이스에게 푸시를 전달합니다.



예약항목에서는 메시지를 언제 발송할것인지 스케쥴링 합니다.

(저는 테스트 목적으로 'Now' 바로 보내기를 설정후 발송하겠습니다.)



나머지 전환 이벤트 및 추가항목은 선택사항임으로 생략하겠습니다.

그리고 게시를 누르고 '발송'을 합니다.


4. 결과 



안드로이드 에뮬레이터로 실행하였습니다.

어플리케이션이 잘 실행되어 메시징 서비스로 메시지를 잘전달받은것을 확인 할 수 있습니다.


이로써 FCM 푸시 서비스 구현을 마치겠습니다.


*추가 푸시메시지 발송 후 확인이 안될시*

모두 정상적으로 작성하였는데도 푸시메시지가 확인이 되지않는다면

매니페스트의 'Messaging서비스'에 'enabled'와 'exported'를 'true' 설정후 다시 실행해보세요.



감사합니다.


반응형

'IT > Android' 카테고리의 다른 글

Android NDK&JNI(C/C++) 사용하기 (JNI-Hello, World)  (8) 2021.03.26
WebView 안드로이드 웹뷰 생성하기  (5) 2019.02.19

+ Recent posts