[Android/Kotlin] FCM 이용해 푸쉬알림 받기 (2-1 /3)

hyomin·2022년 3월 3일
0

Android

목록 보기
2/9

구글 소셜 로그인/회원가입 부분은 이미 다른 팀원이 소스코드를 작성해 놓은 상태이다.

  1. 구글 소셜 로그인/회원가입
  2. 파이어베이스 소셜 로그인 순서로 로직을 구성할 것이다.

FCM Device Token
기기별로 고유한 token을 부여받고, 이 토큰을 통해 해당 기기에게 알림을 보내게 된다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mAuth = FirebaseAuth.getInstance()
        initFirebaseAuth()
        initValues()
    }
    
     private fun initFirebaseAuth() {
        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(FIREBASE_CLIENT_KEY)
                .requestEmail()
               .build()
        mGoogleApiClient = GoogleApiClient.Builder(this)
            .enableAutoManage(this){}
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build()
        mAuthListener = FirebaseAuth.AuthStateListener() { updateProfile() }
    }
    
    // onActivityResult 를 실행한다.
   private fun firbaseSignIn() {
        val signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
        startActivityForResult(signInIntent, RC_SIGN_IN)
    }

initFirebaseAuth 는 Google api를 이용해서 사용자의 로그인 상태를 확인하고 파이어 베이스 디바이스 Token을 받아오기 위한 GoogleSignOption을 초기화 하는 부분이다.

아래 코드에서는 requestCode ==RC_SIGN_IN 부분을 확인하면 된다.


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode == G_SIGN_IN){  //구글 로그인 / 회원가입 gso 확인
            if(resultCode!=0){
                val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data)
                val account = task.getResult(ApiException::class.java)
                email = account?.email.toString()
                authService.setLoginView(this)
                authService.login(UserEmail(email))
            }
        }else if(requestCode ==RC_SIGN_IN){  //파이어베이스 토큰을 얻기 위한 gso 확인
            val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data!!)!!
               if( result.isSuccess) {
                email =result.signInAccount?.email!!
                firebaseAuthWithGoogle(result.signInAccount)
                updateProfile()
            }
        }
    }

   //계정의 권한을 확인하고 인증 결과를 넘긴다. 
    fun firebaseAuthWithGoogle(account : GoogleSignInAccount?){
        var credential = GoogleAuthProvider.getCredential(account?.idToken,null)
        mAuth?.signInWithCredential(credential)
            ?.addOnCompleteListener{
                    task ->
                if(task.isSuccessful){
                    // 아이디, 비밀번호 맞을 때
                    updateProfile()
                    moveMainPage(task.result?.user)
                }else{
                    // 틀렸을 때
                    Log.e("Firebase",task.exception?.message.toString())
                }
            }
    }


    fun updateProfile(){
        mAuth = FirebaseAuth.getInstance()
        val user =  mAuth?.currentUser
        if(user != null) {
             FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener {
                       task-> if(!task.isSuccessful){
                            Log.w(ApplicationClass.TAG,"FetchingFCM registration token failed", task.exception)
                            return@OnCompleteListener
                            }
                            val token = task.result
                            val msg = getString(R.string.msg_token_fmt, token)
                            fcmTokenService.setFcmTokenView(this)
                            fcmTokenService.postFcmToken(getUserIdx(),token) //서버로 Token 전송
                        })

            }
           
    }

디바이스 토큰을 관리하는 방법은 초기에는 파이어베이스의 Realtime Database를 사용하는 방법을 채택했었다. 하지만 프로젝트 구조상 DB를 따로 또 사용하기보다 Server의 User DB에 Column을 추가하여 관리하는 방법으로 변경하면서 Realtime DB에 저장하는 코드를 서버로 전송하는 방법으로 수정하였다.

하지만!!
Realtime DB를 사용하는 방법이 궁금하실 수 있으니 그 부분도 함께 공유해보고자 한다.
다음 포스팅을 참고해 주세요! 😎

부가적인 코드는 이렇다!

   //파이어베이스 자동 로그인 처리
    fun moveMainPage(user: FirebaseUser?){
        if( user!= null){
            startActivity(Intent(this, MainActivity::class.java))
            finish()
        }else{
            firbaseSignIn()
        }
    }

    override fun onPause() {
        super.onPause()
        mGoogleApiClient.stopAutoManage(this);
        mGoogleApiClient.disconnect();

    }

이 모든 과정이 끝나면
Authentication 페이지에 요렇게 로그인된 모습을 볼 수 있을 것이다!!

FCM Token Test 📃

자, 이제 token이 제대로 발급 받아 졌는지 간단한 test를 해보려고 한다.

1.발급 부분에 로그를 하나 찍어서 확인한다!, 그리고 복사해서

  1. 파이어베이스에 접속해서 Cloude Messaging에 들어가서 알림을 새로 만든다

  1. 테스트 메시지 전송에서 아까 발급받은 토큰을 넣어 줍니다.

  2. 뾰로로롱

    이렇게 알람이 온 걸 확인할 수 있다!!!

profile
🌱

0개의 댓글