服务器返回JWT死时的平滑会话恢复

问题描述

我已经将Smooch / Sunshine Conversations SDK集成到了我们的应用中。

在大多数情况下,它可以工作。但是在失败的情况下,我有一个问题:

  1. 用户登录(同时使用我们的服务和smooch)
  2. 我们的服务器端死于任何原因,这意味着暂时无法获取JWT
  3. 对话视图显示“无法连接到服务器”(按预期方式)
  4. 我们的服务器端已恢复...根据请求返回了有效的JWT
  5. 用户尝试在应用程序中触发对话,并且他们继续无限期地看到“无法连接到服务器”(即使在从对话活动移回并回到对话活动之后)。
  6. Smooch SDK永远无法从中恢复。解决该问题的唯一方法是杀死并重新启动该应用程序。

我使用的是最新的SDK版本7.0.3,还有香草ConversationActivity(我没有将其子类化)。

我尝试了以下操作:

  • 在进入ConversationActivity之前立即重新初始化Smooch
  • 在进入ConversationActivity之前立即致电登录

有什么想法吗?

代码

        // This is in the Application class,as recommended
        fun initialiseSmooch(application: Application) {
            GlobalScope.launch {
                Log.i(TAG,"Initialising Smooch")

                val settings = Settings("INTEGRATION_ID")
                settings.authenticationDelegate = getAuthenticationDelegate()

                Smooch.init(application,settings,getinitialisationCallback())
            }
        }   

        private fun getinitialisationCallback(): (SmoochCallback.Response<InitializationStatus>) -> Unit {
            return { response ->
                if (response.data === InitializationStatus.SUCCESS) {
                    Log.i(TAG,"Smooch initialised successfully")
                } else {
                    Log.e(TAG,"Smooch initialization Failed: ${response.error}")
                }
            }
        }

        /**
         * This basically tells the Smooch SDK what to do if the JWT is rejected. Basically it goes
         * and fetches a new token from our API.
         */
        private fun getAuthenticationDelegate(): AuthenticationDelegate {
            return AuthenticationDelegate(function = { authenticationError,authenticationCallback ->
                if (authenticationError != null && authenticationError.data != null) {
                    Log.w(TAG,authenticationError.data)
                }
                if(AppResources.repository.getUserId() == null){
                    Log.i(TAG,"Authentication error. User isn't logged in,so shouldn't be logged in to Smooch either.")
                    logoutSmoochUser()
                } else {
                    Log.i(TAG,"Authentication error. Getting new Smooch token.")
                    getSmoochToken { token -> authenticationCallback.updatetoken(token) }
                }
            })
        }

        private fun getSmoochToken(callback: (String) -> Unit) {
          // Fetches token from API. If successful,callback is called
          // If unsuccessful,callback isn't called. This won't hang forever,it has a timeout.
        }


    // And to start the conversation
    private fun proceedToConversation() {
        ConversationActivity.builder().show(this)
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...