微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决服务器返回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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?