【问题标题】:Smooch conversation recovery when server returning JWT's dies当服务器返回 JWT 死机时,Smooch 对话恢复
【发布时间】:2021-10-20 00:32:04
【问题描述】:

我已将 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)
    }

【问题讨论】:

  • 我应该补充一下……我们在开发环境中设置了一个非常短的 JWT 超时 10 秒,因为我们想测试 JWT 过期时会发生什么。也许这与我的困境有关?

标签: android smooch


【解决方案1】:

请确保您已实施身份验证委托以自动处理 JWT 过期的情况:https://docs.smooch.io/guide/authenticating-users/#expiring-jwts-on-sdks

一旦您发出 JWT 的后端恢复正常,我将通过 login() 调用开始恢复尝试。

最后,10 秒的 JWT 到期时间确实很短。

【讨论】:

  • 感谢您的回复。最后,我们做出了不使用 Smooch 的商业决定,因为我们遇到了一大堆问题(Zendesk 中的用户对话没有正确关联,成为 FWICR 的主要障碍)。我们当时认为它对我们来说不是一个可行的产品并结束了这个项目。在支付了几个月(不便宜)并花费 2 个月 * 2 个开发人员 = 4 个开发人员月后,有点烦人。一年过去了,情况可能有所改善,但我们对整个 TBH 感到有些困惑。 Smooch 现在已被同化为 Zendesk 产品?
  • 我无法测试你的答案,但它看起来很合理,因为没有其他答案即将到来,我接受了它
  • 很抱歉您遇到了这些问题 - 我希望我们的解决方案架构师团队能够帮助您加入该平台以减轻一些心痛。
  • 事实上,是的,在收购之后,已经发布了一个新的集成,改进了 Sunshine Conversations(以前的 Smooch)和 Zendesk 的代理工作区之间的连接。现在有一些工具可以告诉 Zendesk 一个全新的社交用户应该关联到哪个 ZD 用户配置文件(而不是创建一个新用户)。更多信息:stackoverflow.com/a/69441127/10761353
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多