问题症状
iOS 和 Android 对于 交谈前 和 访问者信息 对象的行为不同,这可能使您的应用程序行为统一起来。
访问者 信息对象使您可以在开始在线交谈前设置关于访问者的信息。与之相反,PreChatform 对象会在在线交谈开始后收集该信息。
最初的提议是在您的工作流程中使用一个或另一个,但不能同时使用两者,目前已在 iOS 上更新。
带有 JWT 身份验证的工作流程也会修改 Chat 的行为。如需更多信息,请查阅文档(Android|iOS)或查看这篇文章:使用 Chat SDK 启用已通过身份验证的用户。
解决步骤
免责声明:这篇文章仅用于教学目的。Zendesk 不支持或保证此代码。在评论部分发布您的任何问题,或尝试在线搜索解决方案。
iOS
iOS 中的逻辑如下:
- 获取 ChatAPI配置的
visitorInfo
和department
属性。 - 获取 Chat配置的
preChatFormConfiguration
数据要求。 - 如果
VisitorInfo
为空或空字符串,且其相应的数据要求不是.hidden
,然后显示字段。 - 如果
department
为空或空字符串,且其相应的数据要求不是.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 中,逻辑是不同的。如果启用 预聊天 表格, 访问者信息 将被完全删除,无论该字段为必填、可选还是已隐藏。
解决此限制的一种方法是在在线交谈开始后更新 访问者信息 (除了在线交谈开始后不可编辑的部门):
- 创建
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 允许通过访问者信息更灵活地使用PreChat表格。如需更多信息,请查看此文章:在线交谈会话的设置信息。
这可以按照文档中的例子原生工作。
翻译免责声明:本文章使用自动翻译软件翻译,以便您了解基本内容。 我们已采取合理措施提供准确翻译,但不保证翻译准确性
如对翻译准确性有任何疑问,请以文章的英语版本为准。
0 条评论