ライフサイクルと保存

穏やかな体験は、適切に動作する体験でもあります。すぐに始まり、見られていないときは休み、保存データを失わず、二重に書き込みません。

ハンドシェイク

  1. プラットフォームはハッシュに#zc_parent=…&zc_instance=…を付けてエントリーを読み込みます。
  2. connect()は応答があるまで、IDとバージョンを含むzc.readyを250ミリ秒ごとに送信します。
  3. プラットフォームは承認内容とID、バージョン、プロトコルを照合し、コンテキストと専用ポートを含むzc.connectedで応答するか、接続を拒否します。
  4. 以後、すべての呼び出しはそのポートを通ります。ページを再読み込みするとセッションは終了し、訪問者はプラットフォームから再開します。

15秒以内に準備を整える

まずloading.start()を呼び、訪問者が始められる状態になったらすぐにloading.ready()を呼びます。大きなアセットはその後に読み込みます。15秒以内に準備できない場合、プラットフォームは問題が起きていることを訪問者に知らせます。開始できない場合はloading.fail(message)を呼びます。

ライフサイクルの指示

指示操作
pauseサウンド、アニメーション、入力を停止します。pausedを報告します。
resume訪問者が中断したところから続けます。runningを報告します。
visibility接続後に一度、その後は変更のたびに送信されます。visibleがfalseの場合は、一時停止中と同じように休止します。
disposeタイマーを停止し、SDKに保存データをフラッシュさせます。応答後すぐ、遅くとも1秒後にフレームが削除されます。

時間を数えず、セッションを報告する

状態が変わるたびにsession.report({state, mode})を呼び、実行中は数秒ごとに繰り返します。プラットフォームはサーバー上で報告を基に時間を計測します。pausedを受信したとき、または12秒間何も受信しなかったときに計測を停止します。

リビジョンで保存を保護する

保存データにはリビジョンがあり、書き込むたびに1ずつ増えます。最後に確認したリビジョンを渡してください。別のタブや端末などで先に書き込まれていた場合、進行状況を上書きせずCONFLICTで失敗します。

同じリクエストIDで再試行する

TIMEOUTやINTERNALエラーは、書き込みに失敗したという意味ではなく、結果が不明という意味です。同じデータを同じrequestIdで再送してください。サーバーは二重に書き込まず、最初の結果を返します。別のデータでIDを再利用するとIDEMPOTENCY_CONFLICTで失敗します。

自動保存の間隔を適切に保つ

storage.createAutosave(save)は間隔ごとに最大1回、関数を呼び出します。既定は10秒で、10秒から5分まで設定できます。変更のたびにschedule()を呼んでください。一時停止、非表示、破棄時、プレイの終了前、訪問者の退出前にはSDKがすぐにフラッシュします。3回失敗するとonErrorを通じてSAVE_UNCONFIRMEDを報告します。新しい変更も保存する必要がある場合は、関数からfalseを返してください。

チャネルが閉じたとき

onDisconnectは一度だけ発生します。訪問者に見えている状態を保ち、保存を停止し、体験を開き直せば続けられることを穏やかに伝えてください。自動で再接続しないでください。