ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Firebase Clounding Message 구현 (2) - 서비스 구현
    Android/FireBase 2019. 8. 5. 18:29

    기본셋팅까지 다 끝내셨으면 이제 Firebase에서 날라오는 알림을 받기 위한 서비스를 구현 해주어야 한다.


    1. FirebaseMessagingService 상속받은 클래스 생성

    class MyFirebaseMessagingService : FirebaseMessagingService() {
    
        /**
         * 메시지를 받았을 경우 그 메시지에 대하여 구현
         */
        override fun onMessageReceived(remoteMessage: RemoteMessage?) {
            Log.d(TAG, "Received Message !!")
        }
    
        /**
         * 구글 토큰 값 흭득
         * 아래 토큰은 앱이 설치된 디바이스에 대한 고유값으로 푸시를 보낼때 사용
         */
        override fun onNewToken(token: String?) {
            Log.d(TAG, "Refreshed token: " + token!!)
            FirebaseTokenManager.sendRegistrationToServer(applicationContext, token)
        }
    
    }

    구현 할 메서드는 딱 2개 이다.

    onMessageReceived : 메시지를 받았을때 실행

    onNewToken : 구글 토큰 값을 흭득 했을 때 실행


    2. FirebaseTokenManager 생성

    object FirebaseTokenManager {
    
        /**
         * 해당 디바이스의 Token을 받아옵니다.
         */
        fun registerTokenManager(context: Context) {
            FirebaseInstanceId.getInstance().instanceId
                .addOnCompleteListener(OnCompleteListener { task ->
                    if (!task.isSuccessful) {
                        Log.w(TAG, "getInstanceId failed", task.exception)
                        return@OnCompleteListener
                    }
    
                    // Get new Instance ID token
                    val token = task.result?.token
                    sendRegistrationToServer(context, token!!)
                })
        }
    
        /**
         * 서버에 토큰값을 저장합니다.
         * document = 디바이스 고유 ID ( UniqueID )
         */
        @SuppressLint("HardwareIds")
        fun sendRegistrationToServer(context: Context, token: String) {
            FirebaseFirestore.getInstance().collection("Token")
                .document(
                	Settings.Secure.getString(
                    	context.contentResolver,
                        Settings.Secure.ANDROID_ID
                    )
                )
                .set(mapOf("token" to token))
        }
    
    }

    FirebaseInstanceId.getInstance() 이것으로 해당 기기의 토큰값을 받아와 준다.

     

    토큰은 기기를 식별하는 값이기에 토큰이 발급되었을때 DB에 저장을 해주도록 하자

    DB는 Firebase의 Firestore를 사용하였다.


    3. AndroidManifest.xml 수정하기

     

    먼저 strings.xml에 값 하나를 추가해주도록 합시다.

    <resources>
        <string name="app_name">My Application</string><resources>
        <string name="default_notification_channel_id">istmanagerfcm</string>
    </resources>
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.donghun.myapplication">
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    
        <application
                android:allowBackup="true"
                android:icon="@mipmap/ic_launcher"
                android:label="@string/app_name"
                android:roundIcon="@mipmap/ic_launcher_round"
                android:supportsRtl="true"
                android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
            <service android:name=".MyFirebaseMessagingService">
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
                </intent-filter>
            </service>
            <meta-data
                    android:name="com.google.firebase.messaging.default_notification_icon"
                    android:resource="@drawable/ic_launcher_background"/>
            <meta-data
                    android:name="com.google.firebase.messaging.default_notification_color"
                    android:resource="@color/colorAccent"/>
            <meta-data
                    android:name="com.google.firebase.messaging.default_notification_channel_id"
                    android:value="@string/default_notification_channel_id"/>
        </application>
    
    </manifest>

    meta data에 대해서 설정을 하자면 우리가 서버로 부터 데이터를 받아오지만 어떻게 노티를 출력시킬지는 정해지지 않았다. 이를 위해서 만약 노티가 들어왔을때 기본값으로 사용할 값을 지정해주어야 한다.

    <meta-data
    	android:name="com.google.firebase.messaging.default_notification_icon"
    	android:resource="@drawable/ic_launcher_background"/

    먼저 Notification에 출력시킨 아이콘이다. 현재는 따로 준비한게 없어서 아이콘 런처의 백그라운드로 지정 하였다.

    보통은 앱의 아이콘을 사용한다.

    <meta-data
    	android:name="com.google.firebase.messaging.default_notification_channel_id"
    	android:value="@string/default_notification_channel_id"/>​

    그다음은 Notification의 채널이다. 오레오부터 추가된 개념으로 적용하지 않으면 Notification이 출력되지 않을 수 있다.

    <meta-data
    	android:name="com.google.firebase.messaging.default_notification_color"
    	android:resource="@color/colorAccent"/>

    그다음은 Notificication의 색상이다.


    앱을 실행시켜 Firebase Firestore에 정상적으로 Token값이 저장되는지 확인을 해주도록 하자.

    이로써 디바이스에서 기본적인 셋팅은 다 끝났다.

    다음 강좌에서는 메시지를 직접 날려보고 추가적인 작업을 해보도록 하겠다.

    댓글

Designed by Tistory.