生命周期与存档

宁静的体验也应运行可靠:启动迅速,无人查看时就暂停,不丢失存档,也不重复写入。

握手

  1. 平台会加载你的入口,并在片段中加入 #zc_parent=…&zc_instance=…。
  2. connect() 会每隔 250 毫秒发送一次带有 ID 和版本的 zc.ready,直到收到回复。
  3. 平台会根据审核结果检查你的 ID、版本和协议,然后通过 zc.connected 返回上下文和私有端口,也可能拒绝连接。
  4. 此后,每次调用都会通过该端口传递。如果页面重新加载,会话就会结束,访客需从平台重新开始。

在 15 秒内就绪

先调用 loading.start();访客可以开始时立即调用 loading.ready()。之后再加载大型资源。15 秒后仍未就绪,平台会告知访客出现问题。如果无法启动,请调用 loading.fail(message)。

生命周期命令

命令操作
pause停止声音、动画和输入。报告 paused。
resume从访客离开时的位置继续。报告 running。
visibility连接后发送一次,此后每次变化时发送。visible 为 false 时,请像暂停一样歇息。
dispose停止计时器,让 SDK 刷新存档。你一旦回复,或最多一秒后,框架就会移除。

报告会话状态,无需自行计时

状态变化时调用 session.report({state, mode});运行期间每隔几秒重复报告。平台会根据这些报告在服务器上计时。收到 paused 或连续 12 秒没有收到报告时,计时就会停止。

通过修订号保护每份存档

每次写入都会让存档修订号加一。传入你上次看到的修订号。如果期间有其他位置写入,例如另一个标签页或设备,写入就会以 CONFLICT 失败,而不会覆盖对方的进度。

使用相同的请求 ID 重试

TIMEOUT 或 INTERNAL 错误不代表写入失败,只表示结果未知。请使用相同数据和 requestId 再次发送。服务器会返回首次结果,而不会重复写入。使用不同数据重复同一 ID 会以 IDEMPOTENCY_CONFLICT 失败。

让自动保存掌握节奏

storage.createAutosave(save) 每个间隔最多调用一次你的函数:默认 10 秒,可设为 10 秒至 5 分钟。内容变化时调用 schedule()。暂停、隐藏、销毁时,以及结束一局或访客离开之前,SDK 会立即刷新存档。连续三次失败后,它会通过 onError 报告 SAVE_UNCONFIRMED。如果还有较新的更改需要保存,请让函数返回 false。

通道关闭时

onDisconnect 只会触发一次。保留访客当前看到的内容,停止存档,并温和地告知对方可以重新打开体验继续。切勿自行尝试重新连接。