@@ -6,6 +6,7 @@ import com.google.android.gms.auth.api.signin.GoogleSignIn
66import com.google.android.gms.auth.api.signin.GoogleSignInOptions
77import com.google.android.gms.common.Scopes
88import com.google.android.gms.common.api.Scope
9+ import com.google.firebase.messaging.FirebaseMessaging
910import com.kakao.sdk.user.UserApiClient
1011import com.wafflestudio.siksha2.R
1112import com.wafflestudio.siksha2.models.User
@@ -21,9 +22,9 @@ import com.wafflestudio.siksha2.network.dto.core.UserDto
2122import com.wafflestudio.siksha2.network.result.NetworkResult
2223import com.wafflestudio.siksha2.preferences.SikshaPrefObjects
2324import com.wafflestudio.siksha2.utils.showToast
24- import kotlinx.coroutines.CoroutineScope
2525import kotlinx.coroutines.Dispatchers
26- import kotlinx.coroutines.launch
26+ import kotlinx.coroutines.tasks.await
27+ import kotlinx.coroutines.withContext
2728import okhttp3.MultipartBody
2829import timber.log.Timber
2930import javax.inject.Inject
@@ -46,7 +47,7 @@ class UserStatusManager @Inject constructor(
4647 sikshaPrefObjects.oAuthProvider.setValue(provider)
4748 sikshaPrefObjects.accessToken.setValue(attachBearerPrefix(accessToken))
4849
49- registerFcmTokenAfterLogin(attachBearerPrefix( accessToken) )
50+ syncFcmTokenIfNeeded( accessToken)
5051 }
5152 else -> { }
5253 }
@@ -167,18 +168,38 @@ class UserStatusManager @Inject constructor(
167168 " Bearer $token "
168169 }
169170
170- private fun registerFcmTokenAfterLogin (accessToken : String ) {
171- val fcmToken = sikshaPrefObjects.fcmToken.getValue()
171+ suspend fun syncFcmTokenIfNeeded (accessToken : String? = null) {
172+ val bearer = accessToken ? : sikshaPrefObjects.accessToken.getValue()
173+ if (bearer.isBlank()) return
172174
173- CoroutineScope (Dispatchers .IO ).launch {
174- try {
175- val response = sikshaApi.registerUserDevice(
176- mapOf (" fcm_token" to fcmToken),
177- accessToken
175+ // 토큰 불러오기
176+ val currentToken = try {
177+ FirebaseMessaging .getInstance().token.await()
178+ } catch (e: Exception ) {
179+ Log .e(" UserStatusManager" , " FCM token fetch failed" , e)
180+ return
181+ }
182+
183+ // prefs에 현재 토큰 저장 (기존 onNewToken으로도 저장되지만 안전하게 동기화)
184+ sikshaPrefObjects.fcmToken.setValue(currentToken)
185+
186+ // 서버 등록 여부 판단
187+ val lastRegistered = sikshaPrefObjects.lastRegisteredFcmToken.getValue()
188+ val needsRegister = lastRegistered.isBlank() || lastRegistered != currentToken
189+ if (! needsRegister) return
190+
191+ // 서버 등록
192+ try {
193+ withContext(Dispatchers .IO ) {
194+ sikshaApi.registerUserDevice(
195+ mapOf (" fcm_token" to currentToken),
196+ attachBearerPrefix(bearer)
178197 )
179- } catch (e: Exception ) {
180- Log .e(" UserStatusManager" , " FCM registration exception" , e)
181198 }
199+ sikshaPrefObjects.lastRegisteredFcmToken.setValue(currentToken)
200+ Timber .d(" FCM token registered to server: $currentToken " )
201+ } catch (e: Exception ) {
202+ Log .e(" UserStatusManager" , " FCM registration exception" , e)
182203 }
183204 }
184205}
0 commit comments