안드로이드 스튜디오와 장고 서버를 REST로 연결.
원래 FCM token은 각 디바이스 당 하나의 토큰을 만든다. 여기서 문제점 몇가지를 생각할 수 있었다.
한 디바이스에서 여러 유저가 사용하게 될 경우, 혹은 한 유저가 여러 디바이스에서 사용하게 될 경우
FCM token을 이용해서 push알림을 전송을 해야 하는데 유저마다 token값이 동일하게 된다면 a라는 유저가 설정을 해둔 값이 b라는 유저에게도 영향을 끼치고 그 반대도 마찬가지다.
해결방안 각 유저가 로그인을 할때 마다 새로운 FCM token을 생성을 해주는 방법이다. 저장된 token값은 로그아웃 시에 삭제한다.
FCM token 사용 과정
1. 로그인 django view.py에서 입력한 user의 값이 db에 있는지 확인을 하고 성공을 하게 됬을때 FCM token을 생성
@RequiresExtension(extension = Build.VERSION_CODES.S, version = 7)
fun login(user: User) {
viewModelScope.launch {
_authState.value = AuthState.Loading
try {
val response = apiService.login(user)//장고db에서 user정보를 가져와라 반환의 구조는 authresponse형태로
if (response.isSuccessful) {//파이썬에서 값을 가져오는 것을 성공했다면.
response.body()?.let {
.....
// FCM 토큰을 서버에 전송
try {
val token = Firebase.messaging.token.await()
Log.d("FCMtoken", "fcm_ Token: $token")
myFirebaseMessagingService.sendTokenToServer(token, accessToken) // accesstoken으로 전송을 해준다.
} catch (e: Exception) {
Log.e("FCM", "FCM 토큰 생성 실패", e)
}
....
2. 발생했던 문제는 한 디바이스에서 오로지 하나만 생성되는 FCM token 특성때문인지 유저마다 새로운 토큰값을 만들어낼 수 없다가 아래와 코드로 문제를 해결함
class MyFirebaseMessagingService : FirebaseMessagingService() {
private val apiService: ApiService by lazy {
RetrofitInstance.apiService // Retrofit 인스턴스를 가져오는 방법에 따라 수정
}
override fun onNewToken(token: String) {
super.onNewToken(token)
// 새 토큰이 생성될 때마다 서버로 전송
Log.d("onNEWTOKEN", "ONNEWTOKEN working? Refreshed token: $token")
// val authViewModel = AuthViewModel(RetrofitInstance.apiService, TokenManager(this))
// authViewModel.updateFcmToken(token)
val user_accesstoken_for_fcm = TokenManager(this).getAccessToken()
if (user_accesstoken_for_fcm != null) {
// FCM 토큰을 서버로 전송
CoroutineScope(Dispatchers.IO).launch {
Log.d("onNEWTOKEN", "ONNEWTOKEN working222222222? Refreshed token: $token")
sendTokenToServer(user_accesstoken_for_fcm, token)
}
} else {
Log.e(TAG, "Access token을 찾을 수 없습니다.")
}
}
suspend fun sendTokenToServer(token: String, user_accesstoken_for_fcm: String) {
// Django 서버에 토큰을 저장하는 API 호출
val response = apiService.updateFcmToken("Bearer $user_accesstoken_for_fcm", mapOf("fcm_token" to token)) // Retrofit 또는 다른 네트워크 라이브러리 사용
if (response.isSuccessful) {
Log.d("sendTokenToserver working!!", "Token saved successfully for user: $user_accesstoken_for_fcm")
} else {
Log.e(TAG, "Failed to save token for user: $user_accesstoken_for_fcm")
}
}
3. Django에서 보낸 token값을 저장하는 파일 (FCM token을 저장하는 DB를 새로 만들었고 그건 User의 id값을 외래키로 참조했다. )
//ApiService.kt값
@POST("update_fcm_token/")
suspend fun updateFcmToken(
@Header("Authorization") token: String,
@Body fcmToken: Map<String, String>
): Response<Unit>
//python view.py
class UpdateFcmTokenView(APIView): # fcm 토큰을 유저에 fcm_token 필드에 저장
permission_classes = [IsAuthenticated]
def post(self, request):
fcm_token = request.data.get('fcm_token')
print("login success !!!!!!fcm_token",fcm_token)
try:
if fcm_token:
FCMToken.objects.create( user=request.user,token=fcm_token)
print("good save in fcm DB")
return Response(status=status.HTTP_204_NO_CONTENT)
except CustomUser.DoesNotExist:
return Response({"error": "User not found."}, status=status.HTTP_404_NOT_FOUND)
잘 동작하는지 확인할 수 있는 기능도 있었고 각 유저마다 만들어진 토큰 값을 넣어서 테스트 메세지를 보내보았는데 로그인을 한 유저에게만 값이 잘 전송되는 것을 확인할 수 있었다.
https://normalblog.tistory.com/9
[Firebase] Android FCM 전송 테스트 FirebaseConsole
Android FCM을 통해 메시지를 받을 수 있도록 세팅하였다면 서버가 없더라도 테스트 가능함 포스트맨과 FirebaseConsole을 이용하여 테스트 할 수 있음 이번에는 FirebaseConsole을 이용하는 방법을 알아보
normalblog.tistory.com
FCM 전송 테스트
https://todaycode.tistory.com/181
suspend 함수란 무엇인가요?
🚀 글 읽는 순서 🚀 코루틴은 왜 빠른 걸까요? -> suspend 함수란 무엇인가요? (현재) 1. 요약 2. await 2-1. 개념 2-2. 코루틴 내부에서 실행되는 await 2-3. suspend 내부에서 실행되는 await 3. Suspend 3-1. 개념
todaycode.tistory.com
suspend함수에 관한 설명
https://eunjin3786.tistory.com/281
[Django] FCM 서버를 통해 앱에 푸쉬보내기
[Flutter] Firebase Cloud Messaging 연동 + 파베 콘솔에서 푸쉬보내기 에서 푸쉬를 받는 클라이언트(iOS, 안드로이드) 쪽 설정을 해줬는데요 이제 푸쉬를 보내는 서버쪽 작업을 해주겠습니다. 문서 중 서버
eunjin3786.tistory.com
https://maejing.tistory.com/52
[Android] FCM을 이용해 Push 구현하기
Push Service? FCM? 서버에서 모바일 장치에 보내는 알림 또는 메시지. 직접 구현한 서버에서 사용자 장치로 알림을 보내기 위해서는 앱과 서버의 연결을 지속적으로 유지해야한다. 그러나 FCM(Firebase
maejing.tistory.com
FCM을 통한 실시간 푸시 메세지 구현 (Feat. FCM 토큰)
이번에 진행한 프로젝트에서 실시간 푸시 메세지가 꼭 필요한 기능이였습니다. 따라서 푸시메세지를 구현하기 위해 FCM을 사용했으며, 이를 사용할때 마주했던 문제들과 이를 해결했던 방법들
tioon.tistory.com
위 3가지 사이트는 FCM을 사용할 수 있게 도와준 사이트
공부용으로 작성한 글입니다. 문제시 삭제처리하도록 하겠습니다.