소개팅 앱 6. FCM으로 PUSH 알림 보내기

변현섭·2023년 8월 28일
0

이번 포스팅과 다음 포스팅에서는 FCM을 이용해 push 알림을 전송하는 방법에 대해 배워보도록 하겠습니다.

1. 매칭 여부 확인하기

① 매칭리스트에 있는 유저를 클릭했을 때, 해당 유저도 나를 좋아요 표시했는지 알 수 있도록 클릭 이벤트 리스너를 등록하자. MatchingListActivity의 onCreate 메서드에 아래의 내용을 추가한다.

listview.setOnItemClickListener { parent, view, position, id ->
    matchingChk(myLikeUserInfo[position].uid.toString())
}
  • parent: 클릭된 아이템이 속한 부모 뷰 즉, ListView
  • view: 실제 클릭된 아이템 뷰
  • position: 클릭된 아이템의 인덱스)
  • id: 클릭된 아이템의 ID

② matchingChk() 메서드를 아래와 같이 정의한다.

private fun matchingChk(otherUid : String) {
    val postListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            if(dataSnapshot.children.count() == 0) {
                Toast.makeText(this@MatchingListActivity, "매칭되지 않은 유저입니다.", Toast.LENGTH_SHORT).show()
            }
            else {
                for(dataModel in dataSnapshot.children) {
                    if(dataModel.key.toString().equals(uid)) {
                        Toast.makeText(this@MatchingListActivity, "매칭된 유저입니다.", Toast.LENGTH_SHORT).show()
                    }
                    else {
                        Toast.makeText(this@MatchingListActivity, "매칭되지 않은 유저입니다.", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
        
        override fun onCancelled(databseError: DatabaseError) {
            Log.w("MainActivity", "onCancelled", databseError.toException())
        }
    }
    FirebaseRef.userLike.child(otherUid).addValueEventListener(postListener)
}
  • dataSnapshot.children.count() == 0를 검사하는 이유는 해당 유저가 좋아요 표시한 유저가 없어도 Toast 메시지를 띄워주기 위함이다.
  • dataSnapshot.children의 크기가 0이면, for문을 아예 돌지 않기 때문에 아무런 Toast 메시지도 출력되지 않는다.

③ 코드를 실행시킨 후 매칭 리스트의 아이템을 클릭하면, 매칭 여부를 알려주는 Toast 메시지가 나타날 것이다.

2. Firebase 콘솔을 이용하여 푸시 알림 보내기

push 알림을 보내는 방법에는 크게 4가지가 있다.

  • 코드를 작성하여 push 알림 보내기
  • Firebase 콘솔을 이용하여 앱 사용자 모두에게 push 알림 보내기
  • Firebase 콘솔을 이용하여 특정 사용자에게 push 알림 보내기
  • 앱에서 다른 사용자에게 push 알림 보내기

첫번째 방법은 이미 이전 포스팅에서 다루었으니 아래의 링크를 참조하기 바란다. 이번 포스팅에서는 Firebase 콘솔을 이용하여 push 알림을 보내는 방법에 대해 다뤄보기로 하고, 앱에서 push 알림을 보내는 것은 다음 포스팅에서 알아보기로 하자.
>> 코드로 push 알림 보내기

1) Firebase 콘솔에서 모든 사용자에게 push 알림 보내기

① Module 수준의 build.gradle 파일에 아래의 의존성을 추가한다.

implementation("com.google.firebase:firebase-messaging-ktx")

② 파이어베이스 콘솔에서 참여 > Messaging을 클릭한다. 첫 번째 캠페인 만들기 버튼을 클릭한다.

③ Firebase 알림 메시지를 선택한다.

④ 알림의 제목과 텍스트를 입력한다.

⑤ 현재 작업하고 있는 앱을 선택한다.

⑥ 예약, 전환 이벤트, 추가옵션은 별다른 설정 없이 바로 다음 버튼을 클릭한다. (아직 검토 버튼은 클릭하지 않는다.)

⑦ 이제 코드를 실행하여 Emulator 또는 본인의 스마트폰에 앱을 설치한다.

⑧ 검토 > 게시 버튼을 클릭한다.

⑨ 4~5분 정도 기다리면 푸시 알림이 도착한다. 생각보다 푸시 알림이 늦게 도착할 수도 있다.

  • 포그라운드 상태에서는 push 알림이 전송되지 않으니, 반드시 백그라운드 상태에서 테스트 해야한다.
  • 제대로 알림이 안 가는 경우도 있으니, 2~3번씩 테스트해보자.

2) Firebase 콘솔에서 특정 사용자에게만 push 알림 보내기

① 특정 사용자에게만 push 알림을 보내려면 device token이 필요하다.

② device token을 가져오는 메서드를 SplashActivity에 추가하자. 자세한 내용은 아래의 공식 문서를 참조하기 바란다.
>> push 알림 관련 파이어베이스 공식 문서

  • onCreate 메서드에서 uid보다 먼저 device token을 받아오자.
  • device token을 알아보기 쉽게 하기위해 Log.e를 사용하였다.
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w("MyToken", "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }
    // Get new FCM registration token
    val token = task.result
    // Log and toast
    Log.e("MyToken", token.toString())
})

③ 빨간색 글씨로 본인의 device token이 로그로 찍힌 것을 확인할 수 있다. 이 device token을 복사하자.

④ 다시 파이어베이스 콘솔로 돌아와 알림 내용을 작성하고 테스트 메시지 전송 버튼을 클릭한다.

⑤ 복사한 device token을 붙여넣고 + 버튼을 클릭한다.

⑥ 테스트 버튼을 클릭하면 push 알림이 전송된다.

  • 테스트 메시지는 매우 빠르게 알림이 도착한다.
  • 마찬가지로, 백그라운드 상태에서 테스트해야 한다.

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글