diff --git a/sdk-update/src/main/java/com/xuqm/sdk/update/UpdateSDK.kt b/sdk-update/src/main/java/com/xuqm/sdk/update/UpdateSDK.kt index 5d030e9..33d6153 100644 --- a/sdk-update/src/main/java/com/xuqm/sdk/update/UpdateSDK.kt +++ b/sdk-update/src/main/java/com/xuqm/sdk/update/UpdateSDK.kt @@ -184,7 +184,7 @@ object UpdateSDK { } runCatching { - api.checkUpdate(XuqmSDK.appKey, "ANDROID", versionCode, userId).data?.let { info -> + api.checkUpdate(XuqmSDK.appKey, "ANDROID", versionCode, userId).data?.toUpdateInfo()?.let { info -> val normalized = info.copy(downloadUrl = normalizeDownloadUrl(info.downloadUrl) ?: info.downloadUrl) val afterIgnore = if (!bypassIgnore && normalized.needsUpdate && !normalized.forceUpdate && isVersionIgnored(context, normalized.versionCode) diff --git a/sdk-update/src/main/java/com/xuqm/sdk/update/api/UpdateApi.kt b/sdk-update/src/main/java/com/xuqm/sdk/update/api/UpdateApi.kt index 857f4f7..140f698 100644 --- a/sdk-update/src/main/java/com/xuqm/sdk/update/api/UpdateApi.kt +++ b/sdk-update/src/main/java/com/xuqm/sdk/update/api/UpdateApi.kt @@ -6,12 +6,39 @@ import retrofit2.http.Query data class ApiResponse(val code: Int, val data: T?, val message: String) -interface UpdateApi { +/** 服务端响应的原始 DTO,所有字符串字段可为 null,防止 Gson 绕过 Kotlin 默认值引发 NPE。 */ +internal data class UpdateInfoDto( + val needsUpdate: Boolean = false, + val versionName: String? = null, + val versionCode: Int = 0, + val downloadUrl: String? = null, + val changeLog: String? = null, + val forceUpdate: Boolean = false, + val appStoreUrl: String? = null, + val marketUrl: String? = null, + val requiresLogin: Boolean = false, + val apkHash: String? = null, +) { + fun toUpdateInfo() = UpdateInfo( + needsUpdate = needsUpdate, + versionName = versionName.orEmpty(), + versionCode = versionCode, + downloadUrl = downloadUrl.orEmpty(), + changeLog = changeLog.orEmpty(), + forceUpdate = forceUpdate, + appStoreUrl = appStoreUrl.orEmpty(), + marketUrl = marketUrl.orEmpty(), + requiresLogin = requiresLogin, + apkHash = apkHash, + ) +} + +internal interface UpdateApi { @GET("api/v1/updates/app/check") suspend fun checkUpdate( @Query("appKey") appKey: String, @Query("platform") platform: String, @Query("currentVersionCode") currentVersionCode: Int, @Query("userId") userId: String? = null, - ): ApiResponse + ): ApiResponse }