生命周期与存档
宁静的体验也应运行可靠:启动迅速,无人查看时就暂停,不丢失存档,也不重复写入。
握手
- 平台会加载你的入口,并在片段中加入
#zc_parent=…&zc_instance=…。 connect()会每隔 250 毫秒发送一次带有 ID 和版本的zc.ready,直到收到回复。- 平台会根据审核结果检查你的 ID、版本和协议,然后通过
zc.connected返回上下文和私有端口,也可能拒绝连接。 - 此后,每次调用都会通过该端口传递。如果页面重新加载,会话就会结束,访客需从平台重新开始。
在 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 只会触发一次。保留访客当前看到的内容,停止存档,并温和地告知对方可以重新打开体验继续。切勿自行尝试重新连接。