问题症状

iOS 和 Android 对于 交谈前 和 访问者信息 对象的行为不同,这可能使您的应用程序行为统一起来。

访问者 信息对象使您可以在开始在线交谈前设置关于访问者的信息。与之相反,PreChatform 对象会在在线交谈开始后收集该信息。

最初的提议是在您的工作流程中使用一个或另一个,但不能同时使用两者,目前已在 iOS 上更新。 

带有 JWT 身份验证的工作流程也会修改 Chat 的行为。如需更多信息,请查阅文档(Android|iOS)或查看这篇文章:使用 Chat SDK 启用已通过身份验证的用户。

解决步骤

免责声明:这篇文章仅用于教学目的。Zendesk 不支持或保证此代码。在评论部分发布您的任何问题,或尝试在线搜索解决方案。

iOS

iOS 中的逻辑如下:

  1. 获取 ChatAPI配置的 visitorInfo 和 department 属性。
  2. 获取 Chat配置的 preChatFormConfiguration 数据要求。
  3. 如果 VisitorInfo 为空或空字符串,且其相应的数据要求不是 .hidden,然后显示字段。
  4. 如果 department 为空或空字符串,且其相应的数据要求不是 .hidden,然后显示字段。
  5. SDK 向用户显示表格。用户填写详情或跳过任何 .optional 字段由他们决定。
  6. SDK 收集在表格中输入的信息。
    如果有任何字段被跳过,其将回退到现有的配置详情。如果为空,则不会发送详情。
  7. SDK 分配部门并调用 chat.profileProvider.setVisitorInfo(visitorInfo) 带有表格的 访问者 信息详情(将输入的数据与未填的 API 配置合并)。

例如:

func status(for info: String?) -> FormFieldStatus {
info?.isEmpty == true ? .optional: .hidden
}

let chatAPIConfig = ChatAPIConfiguration()
chatAPIConfig.visitorInfo = visitorInfo
chatAPIConfig.department = departmentName
chat.configuration = chatAPIConfig
chat.profileProvider.setVisitorInfo(visitorInfo)
let chatUIConfig = ChatConfiguration()
chatUIConfig.preChatFormConfiguration = .init(name: status(for: visitorInfo.name),
email: status(for: visitorInfo.email),
phoneNumber: status(for: visitorInfo.phoneNumber),
department: status(for: form.departmentId))
// pass chatUIConfig into buildUI(engines:, configs:)

Android

对于 SDK Chat 3.2.0 之前的版本:

在 Android 中,逻辑是不同的。如果启用 预聊天 表格, 访问者信息 将被完全删除,无论该字段为必填、可选还是已隐藏。

解决此限制的一种方法是在在线交谈开始后更新 访问者信息 (除了在线交谈开始后不可编辑的部门):

  1. 创建 VisitorInfo 对象。
  2. 填写关于此用户的已知信息。
  3. 配置交谈前的表格以询问缺失的信息。
  4. 设置观察者。
  5. 开始 Chat 活动。

当PreChat 完成且在线交谈变为"已开始"状态时,访问者信息就会更新。

例如:

boolean visitorSet = false; // Generic condition to ensure that you only set those info once

// ...

public void
setupObserver(){
final ObservationScope observationScope = new ObservationScope();
Chat.INSTANCE.providers().chatProvider().observeChatState(observationScope, new Observer<ChatState>() {
@Override
public void update(ChatState chatState) {
ChatSessionStatus chatStatus = chatState.getChatSessionStatus();
// Status achieved after the PreChatForm is completed
if (chatStatus == ChatSessionStatus.STARTED) {
// Update the information MID chat here. All info but Department can be updated
if (!visitorSet) {
// Add here the code to set the visitor info - visitorInfo would be a VisitorInfo type variable containing all the information to set
profileProvider.setVisitorInfo(visitorInfo, null);
visitorSet = true;
}

} else {
// There are few other statuses that you can observe but they are unused in this example
Log.d("DEBUG", "[observerSetup] - ChatSessionUpdate -> (unused) status : " + chatStatus.toString());
}
}
});
}

更新提供的代码脚本以适用于您的工作流程。

从 3.2.0 版本起:

最新的 SDK 允许通过访问者信息更灵活地使用PreChat表格。如需更多信息,请查看此文章:在线交谈会话的设置信息。

这可以按照文档中的例子原生工作。

翻译免责声明:本文章使用自动翻译软件翻译,以便您了解基本内容。 我们已采取合理措施提供准确翻译,但不保证翻译准确性

如对翻译准确性有任何疑问,请以文章的英语版本为准。

由 Zendesk 提供技术支持