Ciclo de vida y guardado

Una experiencia tranquila también se comporta bien. Empieza pronto, descansa cuando nadie la mira, nunca pierde un guardado ni lo escribe dos veces.

El saludo de conexión

  1. La plataforma carga tu entrada con #zc_parent=…&zc_instance=… en el fragmento.
  2. connect() envía zc.ready con tu identificador y versión cada 250 milisegundos hasta recibir respuesta.
  3. La plataforma comprueba tu identificador, versión y protocolo con la aprobación, y responde con zc.connected, el contexto y un puerto privado; si no, te rechaza.
  4. Desde ese momento, todas las llamadas pasan por ese puerto. Si se vuelve a cargar la página, la sesión termina y quien visita empieza de nuevo desde la plataforma.

Prepárate en 15 segundos

Llama primero a loading.start() y a loading.ready() en cuanto se pueda empezar. Después carga los recursos pesados. Si no estás listo en 15 segundos, la plataforma avisará de que algo no va bien. Si no puedes iniciar, llama a loading.fail(message).

Comandos del ciclo de vida

ComandoAcción
pauseDetén el sonido, la animación y la entrada. Informa de paused.
resumeContinúa desde donde lo dejó quien visita. Informa de running.
visibilitySe envía una vez tras conectar y después con cada cambio. Si visible es falso, descansa como si estuvieras en pausa.
disposeDetén los temporizadores y deja que el SDK envíe los guardados. El marco se retira al responder o, como máximo, tras un segundo.

Informa de la sesión, no cuentes el tiempo

Llama a session.report({state, mode}) cada vez que cambie el estado y repítelo cada pocos segundos mientras siga en marcha. La plataforma mide el tiempo en el servidor a partir de estos informes. Deja de contar al recibir paused o si no recibe nada durante 12 segundos.

Las revisiones protegen cada guardado

Cada guardado tiene una revisión que aumenta en uno con cada escritura. Pasa la última revisión que viste. Si alguien ha escrito entretanto, por ejemplo desde otra pestaña u otro dispositivo, la escritura falla con CONFLICT en vez de sobrescribir su progreso.

Reintenta con el mismo identificador de solicitud

Un error TIMEOUT o INTERNAL no significa que la escritura haya fallado, sino que no sabes qué ocurrió. Envía los mismos datos con el mismo requestId. El servidor devuelve el primer resultado y evita una segunda escritura. Si reutilizas un identificador con datos distintos, falla con IDEMPOTENCY_CONFLICT.

Deja que el guardado automático marque el ritmo

storage.createAutosave(save) llama a tu función como máximo una vez por intervalo: 10 segundos de forma predeterminada y entre 10 segundos y 5 minutos. Llama a schedule() cuando algo cambie. Al pausar, ocultar o cerrar, y antes de terminar una partida o de salir, el SDK envía el guardado de inmediato. Tras tres intentos fallidos, informa de SAVE_UNCONFIRMED mediante onError. Devuelve false desde tu función si aún hay cambios nuevos que guardar.

Cuando se cierra el canal

onDisconnect se activa una vez. Mantén lo que ve quien visita, deja de guardar y dile con calma que puede volver a abrir la experiencia para continuar. No intentes reconectar por tu cuenta.