问题特征
iOS 和 Android 在 交谈前 和 访问者信息 对象方面的行为不同,这可能会使您的应用程序行为统一起来令人困惑。
VisitorInfo 对象允许您在开始在线交谈之前设置关于访问者的信息。相比之下,PreChatForm 对象会在在线交谈开始后收集该信息。
最初的想法是在您的工作流程中使用其中一个,但不能同时使用这两个,现在 iOS 上已进行了更新。
带有 JWT 身份验证的工作流程也会修改 Chat 的行为。有关更多信息,请参阅文档 (Android|iOS) 或参阅文章:使用 Chat SDK 启用已通过身份验证的用户。
解决步骤
免责声明:本文仅供说明之用。Zendesk 不支持并不保证该代码。如有任何问题,请将其发布在评论部分,或尝试在线搜索解决方案。
iOS
iOS 中的逻辑如下所示:
- 获取 ChatAPIConfiguration的
visitorInfo
和department
属性。 - 获取 ChatConfiguration的
preChatFormConfiguration
数据要求。 - 如果基础属性
VisitorInfo
为 nil 或空字符串,且其对应的数据要求为.hidden
,然后显示字段。 - 如果基础属性
department
为 nil 或空字符串,且其对应的数据要求为.hidden
,然后显示字段。 - SDK 向用户显示表格。用户填写详情或跳过任何
.optional
字段。 - SDK 收集在表格中输入的信息。
如果有任何字段被跳过,它将回退到那里的配置详情。如果为空,则不发送详情。 - 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 中,逻辑有所不同。如果启用了 PreChatForm,则访问者信息将被完全 清除 ,无论该字段是“必填”、“可选”还是“隐藏”。
解决此限制的一种方法是在在线交谈开始后更新 访问者信息 (除了在在线交谈开始后不可编辑的部门):
- 创建一个
VisitorInfo
对象。 - 用关于用户的已知信息填充它。
- 配置交谈前的表格以询问缺失的信息。
- 设置观察者。
- 开始 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 允许通过 VisitorInfo 更灵活地使用 PreChatForm。有关更多信息,请参阅文章:设置在线交谈会话的信息。
这可以按照文档中的示例进行。
翻译免责声明:本文章使用自动翻译软件翻译,以便您了解基本内容。 我们已采取合理措施提供准确翻译,但不保证翻译准确性
如对翻译准确性有任何疑问,请以文章的英语版本为准。