Modes de connexion
Mode connecté au nuage
Lorsque le réseau est disponible et quePFGameSaveFilesAddUserWithUiAsync() se termine avec succès, le système fonctionne en mode connecté au nuage. Dans ce mode :
- Toutes les API fonctionnent normalement avec une synchronisation infonuagique complète
- Les téléversements des données de sauvegarde fonctionnent comme prévu
- Les informations sur le quota de stockage sont disponibles
- La surveillance de l’appareil actif fonctionne correctement
Mode hors connexion (non connecté au nuage)
Lorsque le réseau n’est pas disponible ou que l’utilisateur choisit de jouer hors connexion, le système passe en mode hors connexion avec des fonctionnalités limitées. Vous pouvez vérifier l’état actuel de la connexion à l’aide dePFGameSaveFilesIsConnectedToCloud() pour déterminer le mode dans lequel le système fonctionne.
Gestion des défaillances réseau pendant la synchronisation initiale
LorsquePFGameSaveFilesAddUserWithUiAsync() est appelée sans connectivité réseau, elle déclenche un PFGameSaveFilesUiSyncFailedCallback. Le rappel XAsyncBlock ne se déclenche pas pendant que le système attend la réponse de l’utilisateur. L’opération asynchrone est suspendue jusqu’à ce que l’utilisateur sélectionne une action finale.
- Try Again (
Retry) : retente l’appel réseau. Si la nouvelle tentative échoue également, ce rappel se déclenche de nouveau et l’utilisateur doit répondre de nouveau. Le rappelXAsyncBlockreste différé à chaque boucle de nouvelle tentative. - Use Offline (
UseOffline) : le rappelXAsyncBlockse déclenche avecS_OK, mais le système passe en mode hors connexion (détectable avecPFGameSaveFilesIsConnectedToCloud()). - Cancel : le rappel
XAsyncBlockse déclenche avecE_PF_GAMESAVE_USER_CANCELLED.
Comportement des API en mode hors connexion
En mode hors connexion, les API se comportent différemment :API qui fonctionnent normalement
PFGameSaveFilesGetFolder()- Retourne le chemin du dossier de sauvegarde local
API aux fonctionnalités limitées
PFGameSaveFilesUploadWithUiAsync()- RetourneS_OKimmédiatement, mais la fin de l’opération asynchrone retourneE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesGetRemainingQuota()- RetourneE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesSetActiveDeviceChangedCallback()- Peut être défini, mais ne se déclenchera jamais
Retour au mode en ligne
- Appelez de nouveau
PFGameSaveFilesAddUserWithUiAsync()pour tenter une reconnexion - Il n’est pas nécessaire de réinitialiser complètement le système Game Saves
- L’interface utilisateur d’échec s’affichera de nouveau si le réseau n’est toujours pas disponible
- Utilisez
PFGameSaveFilesIsConnectedToCloud()pour vérifier l’état de la connexion après les nouvelles tentatives
Quand Game Saves passe en mode hors connexion ou retourne une erreur
Une question d’intégration courante est la suivante : quand la synchronisation initiale (PFGameSaveFilesAddUserWithUiAsync) fait-elle passer le joueur en mode hors connexion, et quand échoue-t-elle avec un code d’erreur? Il existe trois résultats finaux (connecté, hors connexion ou annulé), et une annulation peut provenir du joueur ou du jeu :
Points clés :
- Le mode hors connexion est un résultat réussi, et non une erreur. On n’y accède que par un choix explicite de Use Offline, et l’opération asynchrone se termine avec
S_OK. Détectez-le avecPFGameSaveFilesIsConnectedToCloud(). - Les défaillances temporaires ou techniques sont signalées par l’interface utilisateur d’échec de synchronisation, et ne sont pas retournées directement par
PFGameSaveFilesAddUserWithUiAsync. L’utilisateur (ou votre réponse automatique) choisit alorsRetry,UseOfflineouCancel, ce qui aboutit à l’un des trois résultats ci-dessus. - L’annulation est finale et ne produit aucun dossier de sauvegarde. Traitez « annulé » (ou tout échec qui ne laisse aucun dossier) comme ne pas permettre de jouer.
- L’annulation par le joueur et l’annulation par le jeu retournent des codes différents. Seul le choix de Cancel par le joueur dans une invite produit
E_PF_GAMESAVE_USER_CANCELLED. Si votre jeu annule lui-même l’opération avecXAsyncCancel, celle-ci se termine avecE_ABORT. Vérifiez les deux si vous souhaitez les traiter de la même manière.
L’annulation d’une invite de conflit est également finale. Elle se termine avec
E_PF_GAMESAVE_USER_CANCELLED et ne mène pas automatiquement à une invite d’échec de synchronisation « Use Offline ». Si vous souhaitez offrir une expérience du type « rejeter le conflit tout en continuant à jouer hors connexion », concevez-la explicitement (par exemple, relancez PFGameSaveFilesAddUserWithUiAsync et sélectionnez Use Offline lors de l’échec qui en résulte). Consultez Conflits de Game Saves.Codes d’erreur de Game Saves
Les HRESULT suivants sont définis par le SDK Game Saves. Les codes de la plage0x8923xxxx sont propres à Game Saves; 0x800704C7 correspond à HRESULT_FROM_WIN32(ERROR_CANCELLED).
Pour savoir comment ces résultats sont produits par l’interface utilisateur système intégrée (hors processus) par rapport à vos propres rappels, consultez Rappels d’interface utilisateur de Game Saves.
Autres scénarios d’état de connexion
L’APIPFGameSaveFilesIsConnectedToCloud() est particulièrement utile, car la déconnexion peut se produire de plusieurs façons :
- Réseau indisponible pendant la synchronisation : l’utilisateur choisit explicitement de jouer hors connexion
- Changement d’appareil actif : un autre appareil devient l’appareil actif, ce qui fait automatiquement passer cet appareil en mode hors connexion
Pratiques exemplaires pour la prise en charge hors connexion
- Implémentez toujours les rappels d’échec de synchronisation pour gérer les problèmes réseau de façon appropriée
- Vérifiez régulièrement l’état de la connexion à l’aide de
PFGameSaveFilesIsConnectedToCloud()avant de tenter des opérations infonuagiques - Informez les joueurs lorsque le jeu fonctionne en mode hors connexion afin qu’ils comprennent que les sauvegardes ne seront pas synchronisées
- Offrez des options de nouvelle tentative lorsque la connectivité réseau est rétablie
- Les sauvegardes locales fonctionnent toujours - les joueurs peuvent continuer à jouer quel que soit l’état du réseau
- Surveillez les déconnexions - n’oubliez pas que des appareils peuvent être déconnectés lorsqu’un autre appareil devient actif
Comportement des téléversements en mode connecté
Même en mode connecté, les téléversements peuvent échouer en raison de problèmes réseau ou de limites de débit. Dans ce cas, le rappelXAsyncBlock ne se déclenche pas immédiatement. L’opération asynchrone est suspendue pendant que le système attend la réponse de l’utilisateur au moyen de la machine à états des rappels d’interface utilisateur :
- Le
PFGameSaveFilesUiSyncFailedCallbackse déclenche avec les détails de l’erreur. - Le rappel
XAsyncBlockne se déclenche pas encore. L’opération est suspendue pendant que le système attend une réponse. - Si l’utilisateur sélectionne
Retry, le téléversement est retenté. S’il échoue de nouveau, le rappel se déclenche de nouveau et l’utilisateur doit répondre de nouveau. - Si l’utilisateur sélectionne
Cancel, le rappelXAsyncBlockse déclenche avecE_PF_GAMESAVE_USER_CANCELLED. - Si une nouvelle tentative réussit, le rappel
XAsyncBlockse déclenche avecS_OK.
PFGameSaveFilesUploadWithUiAsync() plus tard, lorsque le réseau est rétabli.
En processus, n’offrez pas
Use Offline dans l’invite d’échec de synchronisation pendant qu’un téléversement est en cours. Le téléversement déclenche le même PFGameSaveFilesUiSyncFailedCallback que la synchronisation initiale, de sorte que le SDK ne restreint pas les choix. Toutefois, si votre jeu répond par UseOffline à un échec de téléversement, le téléversement échoue avec E_ABORT (et les builds de débogage déclenchent une assertion). N’offrez que Retry et Cancel dans ce cas.Lorsqu’un téléversement met la session hors connexion
Un téléversement ne modifie normalement pas le mode de connexion, mais il peut se terminer avec la session hors connexion dans les cas suivants. Dans chacun d’eux, le téléversement se termine avecE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD, et PFGameSaveFilesIsConnectedToCloud() retourne ensuite false.
- La session était déjà hors connexion. Le téléversement ne s’exécute pas et se termine avec
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD, même si le réseau a été rétabli. - Le nuage contient une sauvegarde plus récente. Si le service signale, lors de la finalisation du téléversement, qu’une sauvegarde plus récente a été validée à partir d’un autre appareil, Game Saves met la session hors connexion, déclenche le rappel de changement d’appareil actif et termine le téléversement avec
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD. - Le joueur choisit
Use Offlinedans l’invite de reverrouillage. Si un téléversement antérieur a validé ses données, mais a échoué par la suite, le téléversement suivant doit d’abord réacquérir le verrou de sauvegarde. Une invite d’échec de synchronisation pendant cette étape peut recevoir la réponseUseOffline, ce qui met la session hors connexion et termine le téléversement avecE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD.
PFGameSaveFilesAddUserWithUiAsync().
Annulation d’un téléversement
Un téléversement peut être annulé de la même manière que la synchronisation initiale : l’utilisateur peut sélectionnerCancel dans l’interface utilisateur de progression pendant que le téléversement est en cours, ou sélectionner Cancel dans l’invite d’échec de synchronisation si le téléversement a rencontré une erreur. Dans les deux cas, PFGameSaveFilesUploadWithUiAsync() se termine avec E_PF_GAMESAVE_USER_CANCELLED (0x800704C7) et la sauvegarde n’est pas téléversée. Ses résultats finaux sont réussite, annulé ou échec (où E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD signifie que la session est désormais hors connexion; consultez Lorsqu’un téléversement met la session hors connexion). Traitez E_PF_GAMESAVE_USER_CANCELLED séparément des autres échecs afin de pouvoir distinguer « le joueur a annulé » de « le téléversement a échoué ». Si votre jeu annule lui-même le téléversement avec XAsyncCancel, celui-ci se termine avec E_ABORT plutôt qu’avec E_PF_GAMESAVE_USER_CANCELLED.