連線模式
已連線至雲端模式
當網路可用且PFGameSaveFilesAddUserWithUiAsync() 成功完成時,系統會以已連線至雲端模式運作。在此模式中:
- 所有 API 都能正常運作,並具備完整的雲端同步
- 存檔資料上傳如預期般運作
- 可取得儲存空間配額資訊
- 作用中裝置監視正常運作
離線模式 (未連線至雲端)
當網路無法使用或使用者選擇離線遊玩時,系統會進入功能有限的離線模式。您可以使用PFGameSaveFilesIsConnectedToCloud() 檢查目前的連線狀態,以判斷系統正以哪種模式運作。
處理初始同步期間的網路失敗
在沒有網路連線的情況下呼叫PFGameSaveFilesAddUserWithUiAsync() 時,會觸發 PFGameSaveFilesUiSyncFailedCallback。在系統等候使用者回應期間,XAsyncBlock 回呼不會觸發。非同步作業會暫停,直到使用者選取最終動作為止。
- 再試一次 (
Retry):重試網路呼叫。如果重試也失敗,此回呼會再次觸發,使用者必須再次回應。在每次重試迴圈中,XAsyncBlock回呼都會保持延遲。 - 離線使用 (
UseOffline):XAsyncBlock回呼會以S_OK觸發,但系統會進入離線模式 (可使用PFGameSaveFilesIsConnectedToCloud()偵測)。 - 取消:
XAsyncBlock回呼會以E_PF_GAMESAVE_USER_CANCELLED觸發。
離線模式中的 API 行為
在離線模式中,API 的行為會有所不同:正常運作的 API
PFGameSaveFilesGetFolder()- 傳回本機存檔資料夾路徑
功能有限的 API
PFGameSaveFilesUploadWithUiAsync()- 立即傳回S_OK,但非同步完成時會傳回E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesGetRemainingQuota()- 傳回E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesSetActiveDeviceChangedCallback()- 可以設定,但永遠不會觸發
返回線上模式
- 再次呼叫
PFGameSaveFilesAddUserWithUiAsync()以嘗試重新連線 - 不需要完全重新初始化 Game Saves 系統
- 如果網路仍無法使用,會再次顯示失敗 UI
- 在重試之後,使用
PFGameSaveFilesIsConnectedToCloud()確認連線狀態
Game Saves 何時會進入離線模式或傳回錯誤
常見的整合問題是:初始同步 (PFGameSaveFilesAddUserWithUiAsync) 何時會讓玩家進入離線模式,何時會以錯誤碼失敗? 共有三種最終結果 (已連線、離線或已取消),而取消可能來自玩家或遊戲:
重點:
- 離線模式是成功的結果,而不是錯誤。 只有在明確選擇 Use Offline 時才會進入此模式,且非同步作業會以
S_OK完成。請使用PFGameSaveFilesIsConnectedToCloud()偵測此模式。 - 暫時性/技術性失敗會透過同步失敗 UI 呈現,而不是直接從
PFGameSaveFilesAddUserWithUiAsync傳回。接著,使用者 (或您的自動回應) 會選擇Retry、UseOffline或Cancel,最後解析為上述三種結果之一。 - 取消是最終結果,且不會產生存檔資料夾。 請將「已取消」(或任何未留下資料夾的失敗) 視為不允許遊玩。
- 玩家取消和遊戲取消會傳回不同的代碼。 只有玩家在提示中選擇 Cancel 才會產生
E_PF_GAMESAVE_USER_CANCELLED。如果您的遊戲自行使用XAsyncCancel取消作業,則會以E_ABORT完成。如果您想以相同方式處理兩者,請同時檢查兩者。
取消衝突提示也是最終結果。它會以
E_PF_GAMESAVE_USER_CANCELLED 完成,且不會自動轉到同步失敗的「Use Offline」提示。如果您想要「拒絕衝突但繼續離線遊玩」的體驗,請明確設計 (例如,重新執行 PFGameSaveFilesAddUserWithUiAsync,並在產生的失敗中選取 Use Offline)。請參閱 Game Saves 衝突。Game Saves 錯誤碼
下列 HRESULT 由 Game Saves SDK 定義。0x8923xxxx 範圍內的代碼為 Game Saves 專用;0x800704C7 為 HRESULT_FROM_WIN32(ERROR_CANCELLED)。
如需了解這些結果在內建 (處理程序外) 系統 UI 與您自己的回呼之間如何產生,請參閱 Game Saves UI 回呼。
其他連線狀態情境
PFGameSaveFilesIsConnectedToCloud() API 特別有用,因為中斷連線可能以多種方式發生:
- 同步期間網路無法使用:使用者明確選擇離線遊玩
- 作用中裝置已變更:另一部裝置接手成為作用中裝置,自動將此裝置置於離線模式
離線支援的最佳做法
- 一律實作同步失敗回呼,以妥善處理網路問題
- 在嘗試雲端作業之前,使用
PFGameSaveFilesIsConnectedToCloud()定期檢查連線狀態 - 在離線模式下運作時通知玩家,讓他們了解存檔不會同步
- 在網路連線恢復時提供重試選項
- 本機存檔一律可運作 - 無論網路狀態為何,玩家都能繼續遊玩
- 監視中斷連線 - 請記住,當另一部裝置變成作用中時,裝置可能會中斷連線
已連線模式中的上傳行為
即使在已連線模式中,上傳也可能因網路問題或速率限制而失敗。發生這種情況時,XAsyncBlock 回呼不會立即觸發。當系統透過 UI 回呼狀態機等候使用者回應時,非同步作業會暫停:
PFGameSaveFilesUiSyncFailedCallback會附帶錯誤詳細資料觸發。XAsyncBlock回呼尚未觸發。在系統等候回應期間,作業會暫停。- 如果使用者選取
Retry,上傳會重試。如果再次失敗,回呼會再次觸發,使用者必須再次回應。 - 如果使用者選取
Cancel,XAsyncBlock回呼會以E_PF_GAMESAVE_USER_CANCELLED觸發。 - 如果重試成功,
XAsyncBlock回呼會以S_OK觸發。
PFGameSaveFilesUploadWithUiAsync()。
在處理程序內,上傳執行期間請勿在同步失敗提示中提供
Use Offline。 上傳會觸發與初始同步相同的 PFGameSaveFilesUiSyncFailedCallback,因此 SDK 不會限制選項。但是,如果您的遊戲以 UseOffline 回應上傳失敗,上傳會以 E_ABORT 失敗 (且偵錯組建會觸發判斷提示)。請只在該處提供 Retry 和 Cancel。上傳何時會使工作階段離線
上傳通常不會變更連線模式,但在下列情況中,可能會以工作階段離線結束。在每種情況下,上傳都會以E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD 完成,之後 PFGameSaveFilesIsConnectedToCloud() 會傳回 false。
- 工作階段原本就處於離線狀態。 上傳不會執行,並以
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD完成,即使網路已恢復亦然。 - 雲端有較新的存檔。 如果服務在上傳完成時回報已從另一部裝置認可較新的存檔,Game Saves 會將工作階段置於離線狀態、觸發作用中裝置變更回呼,並以
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD完成上傳。 - 玩家在重新鎖定提示中選擇
Use Offline。 如果先前的上傳已認可其資料但之後失敗,下一次上傳必須先重新取得存檔鎖定。在該步驟期間出現的同步失敗提示可以用UseOffline回應,這會使工作階段離線,並以E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD完成上傳。
PFGameSaveFilesAddUserWithUiAsync()。
取消上傳
上傳可以用與初始同步相同的方式取消:使用者可以在上傳進行中時Cancel 進度 UI,或在上傳遇到錯誤時 Cancel 同步失敗提示。無論哪種方式,PFGameSaveFilesUploadWithUiAsync() 都會以 E_PF_GAMESAVE_USER_CANCELLED (0x800704C7) 完成,且存檔不會上傳。其最終結果為成功、已取消或失敗 (其中 E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD 表示工作階段現在處於離線狀態;請參閱上傳何時會使工作階段離線)。請將 E_PF_GAMESAVE_USER_CANCELLED 與其他失敗分開處理,以便區分「玩家已退出」和「上傳發生錯誤」。如果您的遊戲自行使用 XAsyncCancel 取消上傳,則會以 E_ABORT 完成,而不是 E_PF_GAMESAVE_USER_CANCELLED。