관리 메뉴

나만을 위한 블로그

[Android] 샌드버드 SDK v4 - 그룹 채널에서 채팅 푸시 알림 받기 본문

Android

[Android] 샌드버드 SDK v4 - 그룹 채널에서 채팅 푸시 알림 받기

참깨빵위에참깨빵_ 2023. 9. 10. 20:23
728x90
반응형

아래 포스팅에서 이어지는 포스팅이다.

 

https://onlyfor-me-blog.tistory.com/794

 

[Android] 샌드버드 SDK v4를 사용한 1:1 채팅 기능 구현하기

※ 이 포스팅의 코드는 예제 수준이기 때문에 실제로 사용하려면 반드시 리팩토링해서 사용하자 앱에서 채팅을 구현하려면 웹소켓, 파이어베이스 등 여러 방법이 있다. 하지만 SaaS를 사용해 채

onlyfor-me-blog.tistory.com

 

1:1 채팅을 보낼 수 있게 됐으니 이제 상대가 나한테 채팅을 보내면 그 채팅을 푸시 알림으로 받아볼 수도 있어야 한다. 카카오톡 같은 채팅 서비스에는 대부분 기본적으로 있는 기능이다. 샌드버드 또한 이 기능을 지원하지만, 오픈 채널로 생성한 채팅방에서 보낸 알림은 받아볼 수 없고 그룹 채널로 특정 상대와 대화하는 채팅방에서 보낸 메시지만 알림으로 받아볼 수 있다.

 

샌드버드 푸시 알림의 원리는 아래 링크의 개요 부분에 잘 나와 있다. 요약하면 샌드버드는 FCM을 통해 푸시 알림을 보내는데, Chat SDK로 유저의 채팅 메시지가 전송되면 샌드버드 서버는 FCM을 사용하여 상대방에게 푸시 알림을 전송하는 흐름이다. 그 외의 내용들은 아래 링크를 참고한다.

 

https://sendbird.com/docs/chat/sdk/v4/android/push-notifications/overview-push-notifications

 

Overview | Chat Android SDK | Sendbird Docs

Guides for quick and easy integration of Sendbird Chat, Calls and Desk for iOS, Android, JavaScript, Unity, .NET and Platform API.

sendbird.com

 

안드로이드 앱에 FCM을 붙이는 과정은 생략한다. 이미 너무 많은 블로그들에서 설명하고 있기도 하고, 파이어베이스 홈페이지의 설명만 잘 따라가면 무리 없이 붙일 수 있기 때문이다. 파이어베이스의 설명이나 과정이 어렵지도 않기 때문에 생략한다.

FCM을 붙였다면 FirebaseMessagingService를 상속하는 클래스를 만들고, 이를 매니페스트에 service 태그를 만들어 정의했을 것이다. 이 상태에서 수정할 부분은 딱 한 곳, onMessageReceived() 뿐이다.

아래 로직을 추가한다.

 

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    try {
        if (remoteMessage.data.containsKey("sendbird")) {
            val sendbird = remoteMessage.data["sendbird"]?.let { JSONObject(it) } ?: return
            val messageTitle = sendbird.get("push_title") as? String
            val messageBody = sendbird.get("message") as String
            sendNotification(messageTitle ?: "샌드버드 푸시 제목", messageBody)
        }
    } catch (exception: Exception) {
        //
    }
    .
    .
    .
}

 

코드를 보면 코틀린보다는 자바에 가까운 방식으로 JSON 값들을 처리하고 있다. 그렇다고 맘에 안 들어서 섣불리 리팩토링하는 것보다 먼저 이렇게 작성하고 실행해서 동작하는지 여부를 확인한 다음, 그 후에 리팩토링하는 게 더 좋을 것이다.

좀 더 확실하게 보고 싶다면 함수 본문 시작 부분에 로그를 심어 remoteMessage 변수의 값을 확인하면 좋다. service 태그로 서비스 클래스를 정의했기 때문에 앱이 완전히 종료돼도 remoteMessage 변수값은 확인할 수 있다.

 

테스트 방법은 이전 포스팅과 동일하다. 반드시 각각의 기기 or 에뮬레이터에 다른 accessToken, userId를 설정한 뒤 실행해서 그룹채널을 개설한 다음, A 기기는 채팅방을 나오고 B 기기는 채팅방에서 메시지를 보내는 것이다.

이렇게 테스트하면 별 문제 없이 푸시 알림을 받을 것이고, 푸시 알림을 눌렀을 때 처리를 별도로 작성하지 않았다면 앱이 실행될 것이다.

 

주의할 것은 푸시알림 구현을 위해 공식문서를 뒤지다 보면 이 링크를 발견할 텐데, 이 문서의 sendNotification() 구현을 보면 매개변수로 Context를 넘기고 있다.

 

https://sendbird.com/docs/chat/sdk/v4/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm

 

Set up push notifications for FCM | Chat Android SDK | Sendbird Docs

Guides for quick and easy integration of Sendbird Chat, Calls and Desk for iOS, Android, JavaScript, Unity, .NET and Platform API.

sendbird.com

 

절대 Context를 넘길 필요 없다. 또한 공식문서에서 제시하는 구현을 따라서 기존의 FCM 서비스 코드를 바꿀 필요도 없다. 그냥 위에서 onMessageReceived() 안에 추가하라고 적은 코드만 넣으면 푸시 알림을 받을 수 있다. 괜히 삽질하느라 잘 작동하던 코드를 수정하지 말자.

만약 이렇게 했을 때 작동하지 않는다면 아래 내용들을 확인해 보자.

 

  • 오픈 채널에서 실행하는 게 아닌가? 샌드버드는 오픈 채널에서 상대방의 채팅 메시지를 알림으로 보내는 기능은 지원하지 않는다. 푸시 알림 테스트는 그룹 채널로 만든 채팅방에서만 가능하다
  • FCM 토큰을 대시보드에 올바르게 등록했는가?
  • 파이어베이스의 FCM 구현 가이드라인을 따라 앱 설정을 변경했는가? (google-services.json 파일 추가, 의존성 추가 등)
  • 앱의 알림 수신 여부를 '차단함'으로 설정하지 않았는가? 이러면 당연히 알림을 몇 번 보내더라도 받을 수 없다
  • 푸시 알림을 받을 앱이 백그라운드로 이동한 상태인가? 그룹 채널 안에 있다면 샌드버드 푸시 알림을 받을 수 없다
반응형
Comments