feat:增加 token 过期自动跳转登录的逻辑

This commit is contained in:
amos
2026-01-15 16:20:34 +08:00
parent b65f97f123
commit 2f3b206ad2
3 changed files with 32 additions and 4 deletions

View File

@@ -13,11 +13,11 @@ android {
applicationId = "com.memory.app"
minSdk = 26
targetSdk = 35
versionCode = 43
versionName = "1.5.9"
versionCode = 44
versionName = "1.6.0"
buildConfigField("String", "API_BASE_URL", "\"https://x.amos.us.kg/api/\"")
buildConfigField("int", "VERSION_CODE", "43")
buildConfigField("int", "VERSION_CODE", "44")
}
signingConfigs {

View File

@@ -18,6 +18,7 @@ import com.memory.app.data.CredentialsManager
import com.memory.app.data.ThemeManager
import com.memory.app.data.ThemeMode
import com.memory.app.data.UpdateManager
import com.memory.app.data.api.ApiClient
import com.memory.app.data.model.User
import com.memory.app.data.model.VersionInfo
import com.memory.app.data.repository.AuthRepository
@@ -91,6 +92,20 @@ class MainActivity : ComponentActivity() {
isLoggedIn = restored
}
// 监听 401 事件,自动登出
LaunchedEffect(Unit) {
ApiClient.unauthorizedEvent.collect {
authRepository.logout()
isLoggedIn = false
currentUser = null
android.widget.Toast.makeText(
this@MainActivity,
"登录已过期,请重新登录",
android.widget.Toast.LENGTH_SHORT
).show()
}
}
// Check for updates
LaunchedEffect(Unit) {
updateInfo = updateManager.checkUpdate()

View File

@@ -2,6 +2,8 @@ package com.memory.app.data.api
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.memory.app.BuildConfig
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
@@ -12,6 +14,10 @@ import java.util.concurrent.TimeUnit
object ApiClient {
private var token: String? = null
// 401 事件流,用于通知 UI 层登出
private val _unauthorizedEvent = MutableSharedFlow<Unit>(extraBufferCapacity = 1)
val unauthorizedEvent = _unauthorizedEvent.asSharedFlow()
private val json = Json {
ignoreUnknownKeys = true
coerceInputValues = true
@@ -27,7 +33,14 @@ object ApiClient {
token?.let {
request.addHeader("Authorization", "Bearer $it")
}
chain.proceed(request.build())
val response = chain.proceed(request.build())
// 检测 401触发登出事件
if (response.code == 401) {
_unauthorizedEvent.tryEmit(Unit)
}
response
}
.addInterceptor(HttpLoggingInterceptor().apply {
level = if (BuildConfig.DEBUG) {