Flutter集成Mailchimp SDK:Android Release异常及结果回调实现问题
问题解答
一、Android端获取联系人创建/更新的最终结果
Mailchimp Android SDK的createOrUpdateContact是异步执行的,直接调用getStatusById只能获取当前队列状态(如QUEUED),无法拿到最终的成功/失败结果。你可以通过注册SdkCallback来监听任务状态变化,具体实现如下:
1. 实现SdkCallback接口
class MailchimpCallback : SdkCallback { override fun onSdkInitialized() { // SDK初始化完成的回调 } override fun onTaskCompleted(taskId: String, taskResult: TaskResult) { // 任务完成时的回调,可获取最终结果 when (taskResult) { is TaskResult.Success -> { // 联系人创建/更新成功,可通过taskId匹配发起任务时的UUID } is TaskResult.Failure -> { // 任务失败,获取错误信息 val errorMessage = taskResult.error.message } } } }
2. 注册回调到SDK
在初始化Mailchimp SDK后,注册自定义回调:
val configuration = MailchimpSdkConfiguration.Builder(appContext, sdkKey) .isAutoTaggingEnabled(true) .build() Mailchimp.initialize(configuration) // 注册回调 Mailchimp.sharedInstance().addSdkCallback(MailchimpCallback()) // 发起创建/更新联系人任务 val taskId = Mailchimp.sharedInstance().createOrUpdateContact(newContact)
当任务完成(成功或失败)时,onTaskCompleted方法会被触发,你就能拿到最终结果。
如果使用Kotlin协程,还可以封装成挂起函数等待结果:
suspend fun waitForContactResult(taskId: String): TaskResult { val deferred = CompletableDeferred<TaskResult>() val callback = object : SdkCallback { override fun onSdkInitialized() {} override fun onTaskCompleted(id: String, result: TaskResult) { if (id == taskId) { deferred.complete(result) Mailchimp.sharedInstance().removeSdkCallback(this) } } } Mailchimp.sharedInstance().addSdkCallback(callback) return deferred.await() } // 调用示例 CoroutineScope(Dispatchers.IO).launch { val taskId = Mailchimp.sharedInstance().createOrUpdateContact(newContact) val result = waitForContactResult(taskId) // 处理最终结果 }
二、Release模式无法创建联系人的原因及解决方法
Release模式失效最常见的原因是代码混淆导致Mailchimp SDK的类被错误混淆(Debug模式默认关闭混淆,因此能正常工作)。你需要在混淆规则文件(proguard-rules.pro)中添加以下规则:
# 保留Mailchimp SDK的所有类与方法 -keep class com.mailchimp.sdk.** { *; } -dontwarn com.mailchimp.sdk.**
同时检查以下几点:
- 确认
AndroidManifest.xml已添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 检查Release模式下SDK初始化是否成功,可通过
onSdkInitialized回调或日志确认。 - 确认Release模式下没有限制第三方SDK的网络请求(如自定义网络拦截器、安全配置等)。
内容的提问来源于stack exchange,提问作者Zoltán
相关产品推荐
相关产品推荐

