接続モード
クラウド接続モード
ネットワークが利用可能でPFGameSaveFilesAddUserWithUiAsync() が正常に完了すると、システムはクラウド接続モードで動作します。このモードでは:
- すべての API がクラウド同期を完全に伴って正常に機能します
- セーブ データのアップロードは期待どおりに動作します
- ストレージ クォータの情報が利用可能です
- アクティブ デバイスの監視が正しく機能します
オフライン モード (クラウドに未接続)
ネットワークが利用できないか、ユーザーがオフラインでプレイすることを選択した場合、システムは限られた機能でオフライン モードに入ります。PFGameSaveFilesIsConnectedToCloud() を使用して現在の接続状態を確認し、システムがどのモードで動作しているかを判断できます。
初期同期中のネットワーク障害の処理
PFGameSaveFilesAddUserWithUiAsync() がネットワーク接続なしで呼び出されると、PFGameSaveFilesUiSyncFailedCallback がトリガーされます。システムがユーザーの応答を待つ間、XAsyncBlock コールバックは発火しません。ユーザーが終端アクションを選択するまで、非同期操作は一時停止されます。
- Try Again (
Retry): ネットワーク呼び出しを再試行します。再試行も失敗した場合、このコールバックが再度発火し、ユーザーが再度応答する必要があります。XAsyncBlockコールバックは、各再試行ループを通じて延期されたままです。 - Use Offline (
UseOffline):XAsyncBlockコールバックがS_OKで発火しますが、システムはオフライン モードに入ります (PFGameSaveFilesIsConnectedToCloud()で検出できます)。 - Cancel:
XAsyncBlockコールバックがE_PF_GAMESAVE_USER_CANCELLEDで発火します。
オフライン モードでの API 動作
オフライン モードでは、API は異なる動作をします。通常に動作する API
PFGameSaveFilesGetFolder()- ローカル セーブ フォルダー パスを返します
機能が制限される API
PFGameSaveFilesUploadWithUiAsync()- すぐにS_OKを返しますが、非同期の完了はE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDを返しますPFGameSaveFilesGetRemainingQuota()-E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDを返しますPFGameSaveFilesSetActiveDeviceChangedCallback()- 設定できますがトリガーされることはありません
オンライン モードに戻る
- 再接続を試みるために
PFGameSaveFilesAddUserWithUiAsync()を再度呼び出します - Game Saves システムを完全に再初期化する必要はありません
- ネットワークがまだ利用できない場合、再度失敗 UI が表示されます
- 再試行後に接続状態を検証するには
PFGameSaveFilesIsConnectedToCloud()を使用します
Game Saves がオフライン モードに入る場合とエラーを返す場合
統合に関するよくある質問は、初期同期 (PFGameSaveFilesAddUserWithUiAsync) はどのような場合にプレイヤーをオフライン モードにし、どのような場合にエラー コードで失敗するのか というものです。終端の結果は接続、オフライン、キャンセルの 3 つで、キャンセルはプレイヤーとゲームのどちらからも発生する可能性があります:
重要なポイント:
- オフライン モードはエラーではなく、成功の結果です。 オフライン モードには明示的に Use Offline を選択した場合にのみ入り、非同期操作は
S_OKで完了します。PFGameSaveFilesIsConnectedToCloud()で検出してください。 - 一時的/技術的な障害は同期失敗 UI を通じて通知され、
PFGameSaveFilesAddUserWithUiAsyncから直接返されることはありません。その後、ユーザー (または自動応答) がRetry、UseOffline、またはCancelを選択し、上記の 3 つの結果のいずれかに解決されます。 - キャンセルは終端であり、セーブ フォルダーは生成されません。 「キャンセル」(またはフォルダーが残らない失敗) は プレイを許可しない として扱ってください。
- プレイヤーによるキャンセルとゲームによるキャンセルは異なるコードを返します。
E_PF_GAMESAVE_USER_CANCELLEDが生成されるのは、プレイヤーがプロンプトで Cancel を選択した場合のみです。ゲーム自体が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() を再度呼び出します。
アップロードのキャンセル
アップロードは初期同期と同じ方法でキャンセルできます。ユーザーは、アップロードの実行中に進行状況 UI をCancel するか、アップロードでエラーが発生した場合に同期失敗のプロンプトを Cancel できます。どちらの場合も、PFGameSaveFilesUploadWithUiAsync() は E_PF_GAMESAVE_USER_CANCELLED (0x800704C7) で完了し、セーブはアップロードされません。終端の結果は成功、キャンセル、または失敗です (E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD はセッションがオフラインになったことを意味します。アップロードによってセッションがオフラインになる場合を参照してください)。「プレイヤーが中止した」ことと「アップロードでエラーが発生した」ことを区別できるように、E_PF_GAMESAVE_USER_CANCELLED は他の障害とは別に処理してください。ゲーム自体が XAsyncCancel でアップロードをキャンセルした場合は、E_PF_GAMESAVE_USER_CANCELLED ではなく E_ABORT で完了します。