Modos de conexión
Modo conectado a la nube
Cuando la red está disponible yPFGameSaveFilesAddUserWithUiAsync() se completa correctamente, el sistema funciona en modo conectado a la nube. En este modo:
- Todas las API funcionan normalmente con sincronización completa en la nube
- Las cargas de datos de guardado funcionan según lo esperado
- La información de cuota de almacenamiento está disponible
- La supervisión del dispositivo activo funciona correctamente
Modo sin conexión (no conectado a la nube)
Cuando la red no está disponible o el usuario elige jugar sin conexión, el sistema entra en modo sin conexión con funcionalidad limitada. Puede comprobar el estado de conexión actual mediantePFGameSaveFilesIsConnectedToCloud() para determinar en qué modo está funcionando el sistema.
Control de errores de red durante la sincronización inicial
Cuando se llama aPFGameSaveFilesAddUserWithUiAsync() sin conectividad de red, se desencadena una PFGameSaveFilesUiSyncFailedCallback. La devolución de llamada de XAsyncBlock no se activa mientras el sistema espera la respuesta del usuario. La operación asincrónica se pausa hasta que el usuario selecciona una acción terminal.
- Reintentar (
Retry): Reintenta la llamada de red. Si el reintento también falla, esta devolución de llamada se activa de nuevo y el usuario debe responder otra vez. La devolución de llamada deXAsyncBlockpermanece diferida durante cada bucle de reintento. - Usar sin conexión (
UseOffline): La devolución de llamada deXAsyncBlockse activa conS_OK, pero el sistema entra en modo sin conexión (detectable conPFGameSaveFilesIsConnectedToCloud()). - Cancelar: La devolución de llamada de
XAsyncBlockse activa conE_PF_GAMESAVE_USER_CANCELLED.
Comportamiento de las API en modo sin conexión
En el modo sin conexión, las API se comportan de manera diferente:API que funcionan normalmente
PFGameSaveFilesGetFolder(): devuelve la ruta de la carpeta de guardado local
API con funcionalidad limitada
PFGameSaveFilesUploadWithUiAsync(): devuelveS_OKinmediatamente, pero la finalización asincrónica devuelveE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesGetRemainingQuota(): devuelveE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesSetActiveDeviceChangedCallback(): se puede establecer, pero nunca se desencadenará
Volver al modo en línea
- Llame de nuevo a
PFGameSaveFilesAddUserWithUiAsync()para intentar la reconexión - No es necesario reinicializar completamente el sistema de Game Saves
- Volverá a mostrar la interfaz de usuario de error si la red sigue sin estar disponible
- Use
PFGameSaveFilesIsConnectedToCloud()para comprobar el estado de la conexión después de los intentos de reintento
Cuándo Game Saves entra en modo sin conexión o devuelve un error
Una pregunta de integración habitual es: ¿cuándo la sincronización inicial (PFGameSaveFilesAddUserWithUiAsync) deja al jugador en modo sin conexión y cuándo falla con un código de error? Hay tres resultados finales (conectado, sin conexión o cancelado), y una cancelación puede proceder del jugador o del juego:
Puntos clave:
- El modo sin conexión es un resultado correcto, no un error. Solo se entra en él mediante una elección explícita de Use Offline, y la operación asincrónica se completa con
S_OK. Detéctelo conPFGameSaveFilesIsConnectedToCloud(). - Los errores transitorios o técnicos se muestran a través de la interfaz de usuario de error de sincronización, no se devuelven directamente desde
PFGameSaveFilesAddUserWithUiAsync. A continuación, el usuario (o su respuesta automática) eligeRetry,UseOfflineoCancel, lo que se resuelve en uno de los tres resultados anteriores. - La cancelación es definitiva y no produce ninguna carpeta de guardado. Trate “cancelado” (o cualquier error que no deje ninguna carpeta) como no permitir jugar.
- La cancelación del jugador y la del juego devuelven códigos diferentes. Solo la elección de Cancel por parte del jugador en un mensaje produce
E_PF_GAMESAVE_USER_CANCELLED. Si su juego cancela la operación por sí mismo conXAsyncCancel, se completa conE_ABORT. Compruebe ambos si desea tratarlos de la misma manera.
Cancelar un mensaje de conflicto también es definitivo. Se completa con
E_PF_GAMESAVE_USER_CANCELLED y no pasa automáticamente a un mensaje de error de sincronización con “Use Offline”. Si desea una experiencia de “rechazar el conflicto pero seguir jugando sin conexión”, diséñela explícitamente (por ejemplo, vuelva a ejecutar PFGameSaveFilesAddUserWithUiAsync y seleccione Use Offline en el error resultante). Consulte Conflictos de Game Saves.Códigos de error de Game Saves
El SDK de Game Saves define los siguientes HRESULT. Los códigos del intervalo0x8923xxxx son específicos de Game Saves; 0x800704C7 es HRESULT_FROM_WIN32(ERROR_CANCELLED).
Para saber cómo se producen estos resultados con la interfaz de usuario del sistema integrada (fuera de proceso) frente a sus propias devoluciones de llamada, consulte Devoluciones de llamada de la interfaz de usuario de Game Saves.
Escenarios adicionales de estado de conexión
La APIPFGameSaveFilesIsConnectedToCloud() es particularmente útil porque la desconexión puede producirse de varias maneras:
- Red no disponible durante la sincronización: El usuario elige explícitamente jugar sin conexión
- Cambio de dispositivo activo: Otro dispositivo toma el control como dispositivo activo, lo que pone automáticamente este dispositivo en modo sin conexión
Procedimientos recomendados para la compatibilidad sin conexión
- Implemente siempre las devoluciones de llamada de error de sincronización para controlar correctamente los problemas de red
- Compruebe el estado de la conexión con regularidad mediante
PFGameSaveFilesIsConnectedToCloud()antes de intentar operaciones en la nube - Informe a los jugadores cuando funcionen en modo sin conexión para que entiendan que los guardados no se sincronizarán
- Proporcione opciones de reintento cuando se restaure la conectividad de red
- Los guardados locales siempre funcionan: los jugadores pueden seguir jugando independientemente del estado de la red
- Supervise las desconexiones: recuerde que los dispositivos pueden desconectarse cuando otro dispositivo se convierte en el activo
Comportamiento de la carga en modo conectado
Incluso en modo conectado, las cargas pueden fallar debido a problemas de red o límites de frecuencia. Cuando esto sucede, la devolución de llamada deXAsyncBlock no se activa inmediatamente. La operación asincrónica se pausa mientras el sistema espera la respuesta del usuario a través de la máquina de estados de devoluciones de llamada de la interfaz de usuario:
- La
PFGameSaveFilesUiSyncFailedCallbackse activa con los detalles del error. - La devolución de llamada de
XAsyncBlockaún no se activa. La operación se pausa mientras el sistema espera una respuesta. - Si el usuario selecciona
Retry, la carga se reintenta. Si vuelve a fallar, la devolución de llamada se activa de nuevo y el usuario debe responder otra vez. - Si el usuario selecciona
Cancel, la devolución de llamada deXAsyncBlockse activa conE_PF_GAMESAVE_USER_CANCELLED. - Si un reintento se realiza correctamente, la devolución de llamada de
XAsyncBlockse activa conS_OK.
PFGameSaveFilesUploadWithUiAsync() más adelante cuando se restaure la red.
En proceso, no ofrezca
Use Offline en el mensaje de error de sincronización mientras se ejecuta una carga. La carga activa la misma PFGameSaveFilesUiSyncFailedCallback que la sincronización inicial, por lo que el SDK no restringe las opciones. Sin embargo, si su juego responde con UseOffline a un error de carga, la carga falla con E_ABORT (y las compilaciones de depuración generan una aserción). Ofrezca allí solo Retry y Cancel.Cuándo una carga deja la sesión sin conexión
Normalmente, una carga no cambia el modo de conexión, pero puede terminar con la sesión sin conexión en los siguientes casos. En cada uno de ellos, la carga se completa conE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD y PFGameSaveFilesIsConnectedToCloud() devuelve false a continuación.
- La sesión ya estaba sin conexión. La carga no se ejecuta y se completa con
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD, aunque se haya restaurado la red. - La nube tiene un guardado más reciente. Si el servicio informa de que se confirmó un guardado más reciente desde otro dispositivo cuando finaliza la carga, Game Saves pone la sesión sin conexión, activa la devolución de llamada de cambio de dispositivo activo y completa la carga con
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD. - El jugador elige
Use Offlineen el mensaje de rebloqueo. Si una carga anterior confirmó sus datos pero falló después, la siguiente carga primero tiene que volver a adquirir el bloqueo de guardado. Un mensaje de error de sincronización durante ese paso se puede responder conUseOffline, lo que deja la sesión sin conexión y completa la carga conE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD.
PFGameSaveFilesAddUserWithUiAsync().
Cancelación de una carga
Una carga se puede cancelar de la misma manera que la sincronización inicial: el usuario puede seleccionarCancel en la interfaz de usuario de progreso mientras la carga está en curso, o seleccionar Cancel en el mensaje de error de sincronización si la carga encontró un error. En cualquier caso, PFGameSaveFilesUploadWithUiAsync() se completa con E_PF_GAMESAVE_USER_CANCELLED (0x800704C7) y el guardado no se carga. Sus resultados finales son correcto, cancelado o error (donde E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD significa que la sesión ahora está sin conexión; consulte Cuándo una carga deja la sesión sin conexión). Controle E_PF_GAMESAVE_USER_CANCELLED de forma distinta a los demás errores para poder diferenciar “el jugador salió” de “la carga produjo un error”. Si su juego cancela la carga por sí mismo con XAsyncCancel, se completa con E_ABORT en lugar de E_PF_GAMESAVE_USER_CANCELLED.