일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드 os 구조
- 스택 자바 코드
- ANR이란
- 안드로이드 유닛테스트란
- 안드로이드 라이선스 종류
- rxjava hot observable
- 안드로이드 레트로핏 crud
- 스택 큐 차이
- 안드로이드 유닛 테스트
- 서비스 vs 쓰레드
- 자바 다형성
- jvm 작동 원리
- 안드로이드 유닛 테스트 예시
- rxjava disposable
- 2022 플러터 안드로이드 스튜디오
- ar vr 차이
- rxjava cold observable
- 안드로이드 라이선스
- jvm이란
- 안드로이드 레트로핏 사용법
- 큐 자바 코드
- 플러터 설치 2022
- 객체
- 멤버변수
- android retrofit login
- 클래스
- Rxjava Observable
- 서비스 쓰레드 차이
- 2022 플러터 설치
- android ar 개발
- Today
- Total
나만을 위한 블로그
[Android] 샌드버드 SDK v4 - 그룹 채널에서 채팅 푸시 알림 받기 본문
아래 포스팅에서 이어지는 포스팅이다.
https://onlyfor-me-blog.tistory.com/794
1:1 채팅을 보낼 수 있게 됐으니 이제 상대가 나한테 채팅을 보내면 그 채팅을 푸시 알림으로 받아볼 수도 있어야 한다. 카카오톡 같은 채팅 서비스에는 대부분 기본적으로 있는 기능이다. 샌드버드 또한 이 기능을 지원하지만, 오픈 채널로 생성한 채팅방에서 보낸 알림은 받아볼 수 없고 그룹 채널로 특정 상대와 대화하는 채팅방에서 보낸 메시지만 알림으로 받아볼 수 있다.
샌드버드 푸시 알림의 원리는 아래 링크의 개요 부분에 잘 나와 있다. 요약하면 샌드버드는 FCM을 통해 푸시 알림을 보내는데, Chat SDK로 유저의 채팅 메시지가 전송되면 샌드버드 서버는 FCM을 사용하여 상대방에게 푸시 알림을 전송하는 흐름이다. 그 외의 내용들은 아래 링크를 참고한다.
https://sendbird.com/docs/chat/sdk/v4/android/push-notifications/overview-push-notifications
안드로이드 앱에 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를 넘기고 있다.
절대 Context를 넘길 필요 없다. 또한 공식문서에서 제시하는 구현을 따라서 기존의 FCM 서비스 코드를 바꿀 필요도 없다. 그냥 위에서 onMessageReceived() 안에 추가하라고 적은 코드만 넣으면 푸시 알림을 받을 수 있다. 괜히 삽질하느라 잘 작동하던 코드를 수정하지 말자.
만약 이렇게 했을 때 작동하지 않는다면 아래 내용들을 확인해 보자.
- 오픈 채널에서 실행하는 게 아닌가? 샌드버드는 오픈 채널에서 상대방의 채팅 메시지를 알림으로 보내는 기능은 지원하지 않는다. 푸시 알림 테스트는 그룹 채널로 만든 채팅방에서만 가능하다
- FCM 토큰을 대시보드에 올바르게 등록했는가?
- 파이어베이스의 FCM 구현 가이드라인을 따라 앱 설정을 변경했는가? (google-services.json 파일 추가, 의존성 추가 등)
- 앱의 알림 수신 여부를 '차단함'으로 설정하지 않았는가? 이러면 당연히 알림을 몇 번 보내더라도 받을 수 없다
- 푸시 알림을 받을 앱이 백그라운드로 이동한 상태인가? 그룹 채널 안에 있다면 샌드버드 푸시 알림을 받을 수 없다
'Android' 카테고리의 다른 글
[Android] CameraX 코드랩 뜯어보기 - 4 - (完) (0) | 2023.09.19 |
---|---|
[Android] BottomNavigationView의 탭 선택된 효과 최대한 없애기 (0) | 2023.09.15 |
[Android] Android 14 변경사항 미리보기 (0) | 2023.09.04 |
[Android] 웹뷰에서 인텐트 호출 시 net::ERR_UNKNOWN_URL_SCHEME 에러 해결 (0) | 2023.08.29 |
[Android] 라이브러리 없이 권한 요청하는 법 (0) | 2023.08.28 |