fix(update): surface API errors instead of silently returning null

- Log exception details (url/appKey/versionCode/userId) when checkUpdate fails
- Log warning + debug messages around awaitInitialization
- Helps diagnose SDK vs old private-server API incompatibilities

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-06-11 19:30:59 +08:00
父节点 e10deeb4ff
当前提交 a574ecdead

查看文件

@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.util.Log
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import com.xuqm.sdk.XuqmSDK import com.xuqm.sdk.XuqmSDK
import com.xuqm.sdk.file.FileSDK import com.xuqm.sdk.file.FileSDK
@ -152,6 +153,7 @@ object UpdateSDK {
packageInfo.versionCode packageInfo.versionCode
} }
val userId = resolveUserId() val userId = resolveUserId()
val url = ServiceEndpointRegistry.updateBaseUrl
runCatching { runCatching {
api.checkUpdate(XuqmSDK.appKey, "ANDROID", versionCode, userId).data?.let { info -> api.checkUpdate(XuqmSDK.appKey, "ANDROID", versionCode, userId).data?.let { info ->
val normalized = info.copy(downloadUrl = normalizeDownloadUrl(info.downloadUrl) ?: info.downloadUrl) val normalized = info.copy(downloadUrl = normalizeDownloadUrl(info.downloadUrl) ?: info.downloadUrl)
@ -171,16 +173,24 @@ object UpdateSDK {
afterIgnore afterIgnore
} }
} }
}.onFailure { e ->
Log.e("UpdateSDK", "checkUpdate failed [url=$url appKey=${XuqmSDK.appKey} versionCode=$versionCode userId=$userId]: ${e.message}", e)
}.getOrNull() }.getOrNull()
} }
private suspend fun awaitInitialization() { private suspend fun awaitInitialization() {
if (XuqmSDK.isInitialized()) return if (XuqmSDK.isInitialized()) return
Log.w("UpdateSDK", "XuqmSDK not yet initialized, waiting up to 15s...")
kotlinx.coroutines.withTimeoutOrNull(15_000L) { kotlinx.coroutines.withTimeoutOrNull(15_000L) {
while (!XuqmSDK.isInitialized()) { while (!XuqmSDK.isInitialized()) {
kotlinx.coroutines.delay(100) kotlinx.coroutines.delay(100)
} }
} ?: throw IllegalStateException("XuqmSDK not initialized. Check that config.xuqm is present and valid.") } ?: run {
val msg = "XuqmSDK init timeout (15s). Check that config.xuqm is present and package name matches."
Log.e("UpdateSDK", msg)
throw IllegalStateException(msg)
}
Log.d("UpdateSDK", "XuqmSDK initialized, proceeding with update check")
} }
// ───────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────