경험의 기록

 

2021.04.11 - [안드로이드/파이어베이스] - [Android] 파이어베이스 연결 후 로그인 구현하기

 

[Android] 파이어베이스 연결 후 로그인 구현하기

1. 파이어베이스와 프로젝트 연결하기 firebase.google.com/?hl=ko Firebase Firebase는 고품질 앱을 빠르게 개발하고 비즈니스를 성장시키는 데 도움이 되는 Google의 모바일 플랫폼입니다. firebase.google.com..

hanyeop.tistory.com

우선 파이어베이스에 연결되어 있지 않다면 파이어베이스에 연결해야 한다.

 

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

 

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

Firebase 클라우드 메시징 Android 클라이언트 앱을 만들려면 FirebaseMessaging API와 Gradle이 있는 Android 스튜디오 1.4 이상을 사용하세요. 이 페이지의 안내에서는 Android 프로젝트에 Firebase를 추가하는 단

firebase.google.com

자세한 내용은 공식문서에서 확인할 수 있다.

 


종속성 추가

// 푸시 라이브러리
    implementation 'com.google.firebase:firebase-messaging-ktx'
    // JSON의 자바 오브젝트의 직렬화, 역직렬화
    implementation 'com.google.code.gson:gson:2.8.5'
    // okhttp3
    implementation 'com.squareup.okhttp3:okhttp:3.4.1'

라이브러리를 추가해준다.

 

메타데이터 설정 (권장)

<meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/push_icon" />
        <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" />

메타데이터로 알람의 아이콘, 배경색, 채널을 설정할 수 있다.

여기서 사용한 데이터들은 수신 메세지에서 명시하지 않은 경우 기본으로 사용한다.

 

FirebaseMessagingService

FirebaseMessagingService를 확장하는 서비스를 추가한다.

백그라운드에서 앱의 알림을 수신하는 것 외에 다른 방식으로 메시지를 처리하려는 경우에 필요하다.

포그라운드 앱의 알림 수신, 데이터 페이로드 수신, 업스트림 메시지 전송 등을 수행하려면 이 서비스를 확장해야 한다.

 

오버라이드 메소드

  • onMessageReceived : 메세지가 수신되면 호출
  • onDeletedMessages : Firebase Cloud Messaging Server 가 대기중인 메세지를 삭제 시 호출
  • onMessageSent : 메세지가 서버로 전송 성공 했을때 호출
  • onSendError : 메세지가 서버로 전송 실패 했을때 호출
  • onNewToken : 새로운 토큰이 생성 될 때 호출

 

Manifest

<service
            android:name=".MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

사용할 서비스를 등록해준다.

 

FirebaseMessagingService 구현

class MyFirebaseMessagingService : FirebaseMessagingService() {
    private val TAG = "FirebaseTest"

    // 메세지가 수신되면 호출
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        if(remoteMessage.data.isNotEmpty()){
            sendNotification(remoteMessage.notification?.title,
                remoteMessage.notification?.body!!)
        }
        else{

        }
    }

    // Firebase Cloud Messaging Server 가 대기중인 메세지를 삭제 시 호출
    override fun onDeletedMessages() {
        super.onDeletedMessages()
    }

    // 메세지가 서버로 전송 성공 했을때 호출
    override fun onMessageSent(p0: String) {
        super.onMessageSent(p0)
    }

    // 메세지가 서버로 전송 실패 했을때 호출
    override fun onSendError(p0: String, p1: Exception) {
        super.onSendError(p0, p1)
    }

    // 새로운 토큰이 생성 될 때 호출
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        sendRegistrationToServer(token)
    }

    private fun sendNotification(title: String?, body: String){
        val intent = Intent(this,MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) // 액티비티 중복 생성 방지
        val pendingIntent = PendingIntent.getActivity(this, 0 , intent,
            PendingIntent.FLAG_ONE_SHOT) // 일회성

        val channelId = "channel" // 채널 아이디
        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) // 소리
        val notificationBuilder = NotificationCompat.Builder(this, channelId)
            .setContentTitle(title) // 제목
            .setContentText(body) // 내용
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent)

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        // 오레오 버전 예외처리
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(channelId,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_DEFAULT)
            notificationManager.createNotificationChannel(channel)
        }

        notificationManager.notify(0 , notificationBuilder.build()) // 알림 생성
    }

    // 받은 토큰을 서버로 전송
    private fun sendRegistrationToServer(token: String){

    }
}

onMessageReceived 에서 메세지를 수신하여

sendNotification 메소드에 보내줌으로써 노티를 발생시킬 수 있다.

 

또한 토큰을 보내서 서버에서 관리하려고 할 때 

onNewToken 에서 보내주는 로직을 작성하거나

 

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

현재의 토큰을 가져오는 FirebaseMessaging.getInstance().token 메소드를 사용하여

 

로직을 작성할 수 있다.

 

 

잘 수신 되는 것을 확인할 수 있다.

 

https://github.com/HanYeop/AndroidStudio-Practice/tree/master/Firebase_test

 

HanYeop/AndroidStudio-Practice

(~2021.05.20) 안드로이드 학습 내용 저장소. Contribute to HanYeop/AndroidStudio-Practice development by creating an account on GitHub.

github.com

 

 

 

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading