Síntomas del problema
iOS y Android se comportan de manera diferente cuando se trata de objetos previos al chat y VisitorInfo y esto puede hacer que la unificación de los comportamientos de la aplicación sea confusa.
El objeto VisitorInfo le permite establecer la información sobre el visitante antes de iniciar el chat. En cambio, el objeto PreChatForm recopila esa información una vez que se inicia el chat.
Inicialmente, la idea era usar uno u otro en el flujo de trabajo, pero no ambos a la vez, algo que ahora se ha actualizado en iOS.
El flujo de trabajo con autenticación JWT también modifica el comportamiento de Chat. Si desea más información, consulte la documentación (Android|iOS) o consulte este artículo: Permitir usuarios autenticados con el SDK de Chat.
Pasos de resolución
iOS
La lógica en iOS es la siguiente:
- Ejecutar las aplicaciones de ChatAPIConfiguration
visitorInfo
ydepartment
propiedades. - Realizar los ChatConfiguration
preChatFormConfiguration
requisitos de datos. - Si las propiedades subyacentes de
VisitorInfo
son cadenas vacías o nulas, y sus requisitos de datos correspondientes no lo son.hidden
y luego mostrar el campo. - Si las propiedades subyacentes de
department
son cadenas vacías o nulas, y sus requisitos de datos correspondientes no lo son.hidden
y luego mostrar el campo. - El SDK muestra el formulario al usuario. El usuario rellena los detalles o omite algunos
.optional
campos a su criterio. - El SDK recopila la información especificada en el formulario.
Si se omitió algún campo, se recurre a los detalles de configuración existentes. Si está vacío, no se envía ningún detalle. - El SDK asigna el departamento y las llamadas
chat.profileProvider.setVisitorInfo(visitorInfo)
con los detalles de VisitorInfo del formulario (fusionar los datos especificados con la configuración de la API donde no se rellenaron).
Ejemplo:
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
Para las versiones anteriores a SDK Chat 3.2.0:
En Android, la lógica es diferente. VisitorInfo se borra por completo si se activa PreChatForm , sin importar si el campo es Requerido, Opcional u Oculto.
Una manera de evitar esta limitación es actualizar VisitorInfo una vez que se inicia el chat (excepto el departamento que no se puede editar una vez que se inicia el chat):
- Crear un
VisitorInfo
objeto. - Rellénelo con información ya conocida sobre el usuario.
- Configure el formulario previo al chat para solicitar la información que falta.
- Configurar el observador
- Inicie la actividad de chat.
Una vez que se completa la sesión previa y el chat pasa al estado INICIAL, se actualiza la información del visitante.
Ejemplo:
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());
}
}
});
}
Actualice los scripts de código proporcionados para adaptarlos a su flujo de trabajo.
A partir de la versión 3.2.0:
El SDK más reciente permite un uso más flexible de PreChatForm con VisitorInfo. Lea este artículo para más información: Configuración de la información para la sesión de chat.
Esto puede funcionar de forma nativa siguiendo el ejemplo de la documentación.
Descargo de responsabilidad de la traducción: Este artículo ha sido traducido usando software de traducción automática para proporcionar una idea básica del contenido. Se han realizado esfuerzos razonables para proporcionar una traducción exacta, sin embargo, Zendesk no garantiza la exactitud de la traducción.
Si surge alguna pregunta relacionada con la exactitud de la información incluida en el artículo traducido, consulte la versión en inglés del artículo, que es la versión oficial.