生命週期與儲存

平靜的體驗也需要妥善運作:快速啟動、無人觀看時休息、不遺失儲存資料,也不重複寫入。

交握程序

  1. 平台載入你的入口頁面,並在網址片段中加入 #zc_parent=…&zc_instance=…。
  2. connect() 每隔 250 毫秒傳送一次含有識別碼與版本的 zc.ready,直到收到回應。
  3. 平台會依據核准資料檢查你的識別碼、版本與通訊協定,並以環境資訊和專用連接埠回覆 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 失敗,不會覆寫對方的進度。

使用相同的要求識別碼重試

TIMEOUT 或 INTERNAL 錯誤不代表寫入失敗,只表示結果未知。請以相同的 requestId 再傳送相同資料。伺服器會回傳第一次的結果,避免重複寫入。若以相同識別碼搭配不同資料,會發生 IDEMPOTENCY_CONFLICT。

讓自動儲存掌握節奏

storage.createAutosave(save) 每個間隔最多呼叫你的函式一次:預設為 10 秒,可設為 10 秒至 5 分鐘。每當內容變更時呼叫 schedule()。暫停、隱藏或卸載時,以及完成遊玩或訪客離開前,SDK 都會立即寫入待儲存資料。連續三次失敗後,會透過 onError 回報 SAVE_UNCONFIRMED。若仍有較新的變更待儲存,請讓函式回傳 false。

通道關閉時

onDisconnect 只會觸發一次。保留訪客目前看到的內容,停止儲存,並溫和告知訪客可以重新開啟體驗以繼續使用。切勿自行嘗試重新連線。