기본적으로는 공식 페이지를 참고해서 구현하면 되며, 추가적으로는 Stream 에서 일하고 계신 한국인 현직자 skydoves 님 블로그를 추가적으로 참고하면 도움이 크게 됩니다. 저는 제 기준으로 진행하면서 알았으면 좋았겠구나 싶은 부분을 기준으로 설명합니다.
⚠ Stream 에 계정이 있다는 전제하에 설명합니다.
모바일 채팅 구현에 앞서서 Stream 대시보드에 가서 채팅 앱(서버 역할)을 구성해야합니다.
1. Stream 대시보드에서 채팅에 사용할 서버 앱 구성
앱 생성 시 설정 환경이 PRODUCTION / DEVELOPMENT 2가지 형태가 있습니다.
앱 환경에 따라서 모바일에서 채팅을 구현할때 Token 필요 여부가 정해집니다. Development 환경으로 셋팅을 하면 Token 을 실제 생성하지 않아도 테스트를 할 수 있습니다. Production 환경 으로 앱을 셋팅하면 반드시 모바일에서 Stream 에 연결할때 Token 이 있어야만 연결할 수 있습니다.
토큰 생성 방법은 아래 더 보기를 눌러보시면 확인이 가능합니다.
VS Code 로 Python 설치 후 실행하면 토큰을 얻게 됩니다. Get Token!!
# pip install stream-chat
import stream_chat
server_client = stream_chat.StreamChat(api_key="STREAM_KEY", api_secret="STREAM_SECRET")
token = server_client.create_token("계정 ID")
api_key, api_secret 은 아래 이미지 참고하면 됩니다.
계정 ID 같은 경우는 유니크한 String 으로 구성해야하고, Stream 대시보드에서 계정을 생성하고 생성한 ID 를 사용해도되며, 등록되지 않은 임의의 문자(abcd123)로 설정해서 모바일에서 Stream Client 에서 연결하면 생성한 서버앱에서 사용자가 추가됩니다.
(지금 계정에 대한 설명은 직접 실행해보시고나면 이해할 수 있을 것이니, 그냥 그렇구나 하고 넘어가시면 됩니다.)
결과론적으로, 계정 ID 는 아무렇게나 설정해서 진행해라!!! - 다만, 해당 계정 ID 는 모바일에서 코드를 구현할때 사용해야 합니다.
https://getstream.io/chat/docs/react/tokens_and_authentication/#generating-tokens
참고로, 저 같은 경우는 Development 환경에서 작업해 보고 Production 환경도 작업하기 위해서 vscode 로 python 설치 후 토큰 발급 받아서 테스트를 진행했습니다.
2. AOS 에서 Stream Client 로 연결하기
-> 공식 사이트 채팅 구성 코드 를 참고하시면 정말 좋습니다.
아래 코드는 튜토리얼에 나온 메인 페이지인 MainActivity.kt 참고 하시면 됩니다.
ChatClient 클래스로 Stream 서비스에 연결하기 위해서는 서버 앱 구성시 제공되는 APK KEY 와 채팅 ID 가 필요합니다. 그리고 아래 코드에 있는 token 변수 의 경우 Development 환경이라면 Token 을 생성할 필요가 없으나 Production 환경이라면 Token 이 필요 합니다.
(Token 생성은 위의 토큰 생성 방법을 참고하시기 바랍니다.)
val client = ChatClient.Builder("***API KEY***", applicationContext)
.withPlugin(offlinePluginFactory)
.logLevel(ChatLogLevel.ALL) // Set to NOTHING in prod
.build()
val user = User(
id = "*** 채팅ID ***",
name = "*** 채팅ID ***", // 이름은 어떤게 들어가든 상관 없음
)
// Production 버전
client.connectUser(
user = user,
token = "*** 서버에서 받은 Token ***"
).enqueue()
// Development 버전
client.connectUser(
user = user,
token = client.devToken(user.id)
).enqueue()
3. ChatClient 로 Stream 에 정상적으로 연결 후 채팅 리스트 받아오기
아래 코드도 동일하게 메인 페이지인 MainActivity.kt 참고 하시면 됩니다.
위의 코드로 통해서 ChatClient 로 연결이 제대로 이루어지면 채팅 리스트를 ChannelListViewModel 에서 받아오면 해당 화면의 리스트에 보내줄것입니다.
val filter = Filters.and(
Filters.eq("type", "messaging"),
Filters.`in`("members", listOf(user.id))
)
val viewModelFactory =
ChannelListViewModelFactory(filter, ChannelListViewModel.DEFAULT_SORT)
val viewModel: ChannelListViewModel by viewModels { viewModelFactory }
viewModel.bindView(binding.channelListView, this)
binding.channelListView.setChannelItemClickListener { channel ->
startActivity(ChannelActivity4.newIntent(this, channel))
}
4. 대시보드에서 계정 확인
계정을 미리 생성한 경우가 아니고 생성하지 않은 ID 로 위의 프로세스대로 하고 정상적으로 ChatClient 로 연결을 했다면 아래와 같이 새로 생성한 계정을 Chat Explorer 에서 확인할 수 있습니다.
5. 추가적으로 채팅 채널도 모바일에서 생성하기
아래 코드도 동일하게 메인 페이지인 MainActivity.kt 참고 하시면 됩니다.
client.connetUser().enqueque() 후에 다음과 같은 코드로 채팅 채널을 생성할 수도 있습니다. 다음과 같이 정상적으로 채팅방 생성이 된다면 아래의 이미지와 같이 새롭게 생성된 채팅방을 확인할 수 있습니다.
- 채팅 채널 생성 가이드 참고
client.connectUser(
user = user,
token = TOKEN
).enqueue {
if (it.isSuccess) {
client.createChannel(
channelType = "messaging",
channelId = "new_channel_02",
memberIds = listOf(user.id),
extraData = mapOf("name" to "My New Channel")
).enqueue { result ->
if (result.isSuccess) {
startActivity(ChannelActivity.newIntent(context, result.data()))
} else {
Toast.makeText(con, "채팅 채널 생성 실패", Toast.LENGTH_SHORT).show()
}
}
}
}
ChannelType 은 messaging 으로 설정해서 일반 메세징으로 설정했으며
고유한 ChannelId 는 new_channel_02 로 만들었고 채팅 리스트에 노출되는 채널 이름은 My New Channel 로 설정했습니다.
대시보드에서 확인 가능한 내용
모바일 에서 확인 가능한 채널 이름
공식 사이트와 skydoves 님 블로그 글을 메인으로 보면서 해당 글을 추가로 본다면 조금이나마 도움이 되리라 생각합니다.
참고 사이트
- https://getstream.io/tutorials/android-chat/
- https://velog.io/@skydoves/android-chat-tutorial-stream-chat-sdk
'Dev > Android' 카테고리의 다른 글
JetpackCompose - SplashScreen API (0) | 2023.11.16 |
---|---|
Bluetooth 관련 정리 (0) | 2023.03.09 |
Android Studio Dolphin 🐬(2021.3.1) - Stable Release (0) | 2022.09.20 |
Android MVVM 패턴에 대해서 (0) | 2022.09.01 |
Jetpack Compose 학습 (0) | 2022.08.16 |