> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Guía de implementación en Steam Deck para PlayFab Game Saves

> Guía completa para implementar PlayFab Game Saves en Steam Deck con el GDK de octubre de 2025, incluida la autenticación, las devoluciones de llamada de la interfaz de usuario y las estrategias de sincronización

<Info>
  Esta guía cubre específicamente los requisitos de implementación en Steam Deck para PlayFab Game Saves con el GDK de octubre de 2025. Antes de implementar la compatibilidad con Steam Deck, asegúrese de haber completado los requisitos básicos de la [implementación del GDK de octubre de 2025](/services/playfab/player-progression/game-saves/october-2025-gdk-changes).
</Info>

## Información general

La integración de Game Saves en Steam Deck se puede implementar con distintos niveles de complejidad según sus requisitos multiplataforma. Puede elegir entre un enfoque simplificado solo para Steam o la integración completa con el ecosistema XBOX con flujos de autenticación más complejos.

<Info>
  **Diferencia crítica: comportamiento de sincronización**: Game Saves en Windows puede ejecutarse completamente fuera de proceso y continuar sincronizando más allá de la vida del juego. En Steam Deck, Game Saves se ejecuta solo dentro del proceso. Esto significa que la sincronización de guardados se detiene cuando el juego se cierra, por lo que los juegos deben adoptar patrones de sincronización frecuente para evitar perder el progreso no sincronizado. **Procedimiento recomendado para todas las plataformas**: Aunque estos patrones de sincronización son obligatorios para Steam Deck, son muy recomendables para todas las plataformas, especialmente los dispositivos portátiles o cualquier escenario en el que puedan producirse apagados repentinos (agotamiento de la batería, bloqueos del sistema, eventos de cierre forzado).
</Info>

## Diferencias de comportamiento del motor de sincronización

| Plataforma         | Modo de sincronización | Sincronización tras el cierre           | Patrón recomendado                                              |
| ------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------- |
| **PC con Windows** | Fuera de proceso       | ✅ Continúa después del cierre del juego | Se recomienda la sincronización frecuente para mayor fiabilidad |
| **Steam Deck**     | Dentro del proceso     | ❌ Se detiene cuando el juego se cierra  | **Sincronización frecuente obligatoria**                        |

**Recomendaciones universales de sincronización** (beneficiosas para todas las plataformas):

* Sincronice los datos de guardado con frecuencia (por ejemplo, después de cada nivel, punto de control o progreso significativo)
* Sincronice siempre antes de mostrar confirmaciones de "salir del juego"
* Considere la sincronización en segundo plano durante las transiciones del juego
* Implemente indicadores de progreso de sincronización para garantizar la finalización antes del apagado
* Especialmente importante para dispositivos portátiles, donde el agotamiento de la batería o los apagados repentinos son habituales

## Requisitos previos

Antes de implementar la compatibilidad con Steam Deck, asegúrese de tener:

1. **Configuración del GDK de octubre de 2025 completada**: Siga la [guía de implementación del GDK de octubre de 2025](/services/playfab/player-progression/game-saves/october-2025-gdk-changes)
2. **Integración de la API de Steam**: Inicialización básica de la API de Steam y detección de Steam Deck
3. **Elegir el enfoque de integración**: Decida entre la integración con el ecosistema XBOX o con una identidad personalizada (consulte a continuación)
4. **Todos los archivos DLL necesarios**: Los archivos DLL del SDK unificado deben implementarse con su compilación de Steam

## Enfoques de implementación

Steam Deck ofrece dos enfoques de implementación con distintos niveles de complejidad y funcionalidades multiplataforma. PlayFab Game Saves resulta valioso para la sincronización de guardados multiplataforma más allá del ecosistema de Steam: necesitará la integración con XBOX Live (enfoque 1) o su propio sistema de identidad de jugador personalizado (enfoque 2).

### Enfoque 1: Integración con el ecosistema XBOX (recomendado)

**Ventajas**:

* **Sincronización multiplataforma completa**: Los datos de guardado se sincronizan entre Steam Deck, las consolas XBOX, la PC de Microsoft Store y otras plataformas habilitadas para XBOX
* **Integración con XBOX Live**: Los jugadores usan su gamertag de XBOX y pueden acceder a las características sociales de XBOX
* **Identidad de jugador unificada**: El mismo perfil de jugador en todas las plataformas
* **Autenticación probada**: Aprovecha la madura infraestructura de autenticación de XBOX Live
* **Compatibilidad con XBOX Game Studios**: Integración sin problemas para los estudios propios y asociados de XBOX

**Complejidad**:

* **Autenticación compleja**: Se requieren controladores de eventos de XUser personalizados y devoluciones de llamada de la interfaz de usuario
* **Configuración de sandbox de desarrollo**: Necesaria para entornos de prueba no comerciales
* **Privilegios de administrador**: Necesarios para las modificaciones del registro durante la configuración del sandbox
* **Implementación adicional de interfaz de usuario**: Cuadros de diálogo de autenticación mediante código QR y de selección de gamertag

**Cuándo elegirlo**: Juegos dirigidos a varias plataformas, incluidas las consolas XBOX, títulos de XBOX Game Studios o juegos que requieran la integración completa con el ecosistema de XBOX Live.

### Enfoque 2: Implementación con identidad personalizada (alternativa)

**Ventajas**:

* **Complejidad de inicio de sesión potencialmente reducida**: No se requiere autenticación de usuario de XBOX
* **Sin configuración del registro**: No se necesita configuración de sandbox
* **Sin API de XUser**: Elimina los controladores de eventos complejos
* **Flexibilidad de identidad personalizada**: Implemente su propio sistema de identidad de jugador multiplataforma

**Complejidad**:

* **Administración manual de jugadores**: Debe implementar su propio sistema de identidad de jugador multiplataforma
* **Integración limitada con el ecosistema**: Sin acceso a las características sociales de XBOX Live ni a la base de jugadores existente de XBOX
* **Puente entre plataformas**: Requiere soluciones personalizadas para conectar a los jugadores entre distintas plataformas
* **Infraestructura de identidad adicional**: Es necesario crear sistemas de identidad o integrar sistemas de terceros

**Cuándo elegirlo**: Juegos centrados en Steam, juegos con sistemas de identidad personalizados existentes o escenarios de desarrollo en los que la integración con XBOX Live no es necesaria ni deseada.

**OpenID Connect**: Para el enfoque 2, PlayFab admite la autenticación con OpenID Connect mediante la llamada a la API `LoginWithOpenIdConnect`, lo que permite la integración con proveedores de identidades personalizados que admitan el estándar OpenID Connect.

## Configuración común (ambos enfoques)

Los siguientes pasos de configuración son necesarios independientemente del enfoque de implementación que elija.

## 1. Requisitos de implementación de archivos DLL

Steam Deck requiere que todos los archivos DLL del SDK unificado se implementen con su juego:

**Archivos DLL necesarios**:

* `libHttpClient.dll` - Operaciones HTTP
* `PlayFabCore.dll` - Autenticación y servicios principales
* `PlayFabGameSave.dll` - Funcionalidad de Game Saves
* `xgameruntime.dll` - Funcionalidades principales del SDK e inicio de sesión de XBOX

**Archivo DLL opcional**:

* `PlayFabServices.dll` - Servicios adicionales de PlayFab (recomendado)

**Estructura de implementación en Steam Deck**:

```
YourGame/
├── YourGame.exe
├── libHttpClient.dll     // Required for HTTP operations
├── PlayFabCore.dll       // Required for authentication
├── PlayFabServices.dll   // Optional: For additional PlayFab services
├── PlayFabGameSave.dll   // Required for Game Saves
├── xgameruntime.dll      // Required for Xbox Live services
├── Steam_api64.dll
└── Other game files...
```

## 2. Requisitos previos de integración con Steam

### Integración de la API de Steam

```cpp theme={null}
// Initialize Steam API
bool steamAvailable = SteamAPI_Init();
```

### Detección de plataforma

Implemente la detección de plataforma al principio de la inicialización:

```cpp theme={null}
bool DetectSteamDeck() {
    if (!SteamAPI_Init()) {
        return false;
    }
    
    return SteamUtils()->IsSteamRunningOnSteamDeck();
}
```

## 3. Implementación de las devoluciones de llamada de la interfaz de usuario

<Info>
  **Requisito de interfaz de usuario en Steam Deck**: Todas las devoluciones de llamada de la interfaz de usuario de PlayFab Game Saves son **obligatorias** en Steam Deck, independientemente del enfoque de implementación que elija. Esto se debe a que Steam Deck no dispone de una interfaz de usuario integrada para las operaciones de Game Saves, por lo que su aplicación debe proporcionar todos los cuadros de diálogo de la interfaz de usuario.
</Info>

### Devoluciones de llamada de la interfaz de usuario de Game Saves (obligatorias para ambos enfoques)

Tanto la implementación con identidad personalizada como la del ecosistema XBOX requieren las mismas devoluciones de llamada de la interfaz de usuario de PlayFab Game Saves:

```cpp theme={null}
// Required Game Saves UI callbacks for Steam Deck (both approaches)
PFGameSaveUICallbacks callbacks{};
callbacks.progressCallback = OnPFGameSaveFilesUiProgress;                    // Sync progress
callbacks.syncFailedCallback = OnPFGameSaveFilesUiSyncFailed;               // Sync errors
callbacks.activeDeviceContentionCallback = OnPFGameSaveFilesUiActiveDeviceContention;  // Device conflicts
callbacks.conflictCallback = OnPFGameSaveFilesUiConflict;                   // Save conflicts
callbacks.outOfStorageCallback = OnPFGameSaveFilesUiOutOfStorage;           // Storage quota

HRESULT hr = PFGameSaveFilesSetUiCallbacks(&callbacks);
if (FAILED(hr)) {
    // Handle callback setup failure
}

// Optional: Additional active device changed callback
hr = PFGameSaveFilesSetActiveDeviceChangedCallback(&OnActiveDeviceChanged, nullptr);
```

**Cuadros de diálogo obligatorios de la interfaz de usuario de Game Saves** (ambos enfoques):

* **Cuadros de diálogo de progreso**: Muestran el progreso de la sincronización durante las operaciones de guardado
* **Control de errores**: Muestran mensajes de error de sincronización y opciones de reintento
* **Resolución de conflictos**: Controlan los conflictos de guardado entre dispositivos
* **Contención de dispositivos**: Controlan los escenarios de acceso desde varios dispositivos
* **Administración del almacenamiento**: Notifican a los usuarios los problemas de cuota de almacenamiento

***

## Enfoque 1: Integración con el ecosistema XBOX - Implementación completa

Este enfoque proporciona sincronización multiplataforma completa entre Steam Deck, las consolas XBOX, la PC de Microsoft Store y otras plataformas habilitadas para XBOX. Elija este enfoque si su juego está dirigido a plataformas XBOX o requiere la integración con XBOX Live.

### Información general

**Requisitos previos**:

* Configuración común completada (secciones 1 a 3 anteriores)
* Acceso a un sandbox de desarrollo para pruebas
* Privilegios de administrador para la configuración del registro (solo desarrollo/pruebas)

### 1. Configuración del registro

Steam Deck requiere la configuración del sandbox de XBOX Live para las pruebas en sandbox no comerciales:

```cpp theme={null}
// Set sandbox before Xbox Live services initialization
// Only required when testing with non-retail sandboxes
if (isSteamDeck) {
    HRESULT hr = SteamIntegration::SetSandboxForSteamDeck("XDKS.1");
    if (FAILED(hr)) {
        // Handle sandbox setup failure - requires admin privileges
        return hr;
    }
}
```

**Detalles de configuración**:

* **Clave**: `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\XboxLive\Sandbox`
* **Valor**: Id. del sandbox de desarrollo (por ejemplo, "XDKS.1")
* **Momento**: Debe establecerse antes de que se inicialicen los servicios de XBOX Live
* **Privilegios**: Requiere acceso de administrador
* **Uso**: Solo es necesario para las pruebas en sandbox no comerciales (entornos de desarrollo o pruebas)

### 2. Controladores de eventos de plataforma de XUser

Steam Deck requiere dos conjuntos críticos de controladores de eventos para la autenticación de XBOX:

#### A. Controladores de eventos de conexión remota

Controlan el flujo de autenticación remota (visualización de código QR/URL):

```cpp theme={null}
// Handle remote authentication flow (QR code/URL)
XUserPlatformRemoteConnectEventHandlers remoteConnect{};
remoteConnect.context = nullptr;
remoteConnect.show = &OnRemoteConnectShow;     // Display QR code/URL dialog
remoteConnect.close = &OnRemoteConnectClose;   // Close authentication dialog
HRESULT hr = XUserPlatformRemoteConnectSetEventHandlers(nullptr, &remoteConnect);
if (FAILED(hr)) {
    // Handle event handler setup failure
}
```

#### B. Controladores de eventos de SPOP (aviso de inicio de sesión)

Controlan el aviso de inicio de sesión de SPOP que se usa cuando la cuenta de un usuario ya tiene la sesión iniciada en otro dispositivo:

```cpp theme={null}
// Handle SPOP sign-in prompt. See sample: ShowSpopPromptDialogForXUserOnSteamDeck
HRESULT hr = XUserPlatformSpopPromptSetEventHandlers(nullptr, &OnSpopPrompt, nullptr);
if (FAILED(hr)) {
    // Handle SPOP setup failure
}
```

El controlador debe presentar una interfaz de usuario que permita al jugador elegir una acción (iniciar sesión aquí, cambiar de cuenta o cancelar) y llamar a `XUserPlatformSpopPromptComplete(operation, result)` con el resultado elegido.

### 3. Implementación de la interfaz de usuario de autenticación

Además de las devoluciones de llamada de la interfaz de usuario de Game Saves (sección 3), la integración con el ecosistema XBOX requiere:

* **Cuadro de diálogo de conexión remota**: Muestre el código QR y la URL para que los usuarios se autentiquen en otro dispositivo
* **Cuadro de diálogo de aviso de SPOP**: Permita a los usuarios seleccionar o confirmar su gamertag de XBOX

### 4. Secuencia de inicialización

Siga esta secuencia de inicialización para la integración con el ecosistema XBOX:

```cpp theme={null}
// 1. Check Steam availability and platform
bool steamAvailable = SteamIntegration::CheckSteamAvailability();
bool isSteamDeck = SteamIntegration::CheckIfSteamDeck();

// 2. Set Xbox Live sandbox (Steam Deck only, required for non-retail sandbox testing)
if (isSteamDeck) {
    HRESULT hr = SteamIntegration::SetSandboxForSteamDeck("XDKS.1");
    if (FAILED(hr)) {
        // Handle sandbox setup failure
        return hr;
    }
}

// 3. Initialize Xbox runtime
hr = XGameRuntimeInitialize();
if (FAILED(hr)) {
    return hr;
}

// 4. Initialize PlayFab Core and Services
hr = PFInitialize(nullptr);
if (FAILED(hr)) {
    return hr;
}
hr = PFServicesInitialize(nullptr); // Optional

// 5. Initialize XUser for Steam Deck
if (isSteamDeck) {
    hr = SteamIntegration::InitializeXUserForSteamDeck();
    if (FAILED(hr)) {
        return hr;
    }
}

// 6. Initialize Game Saves with appropriate callbacks
bool setUiCallbacks = isSteamDeck;
hr = InitializeGameSaves(setUiCallbacks);
if (FAILED(hr)) {
    return hr;
}
```

### 5. Implementación del cierre de sesión

Steam Deck requiere un control especial del cierre de sesión para borrar las credenciales de XBOX almacenadas:

```cpp theme={null}
void SignOutFromSteamDeck() {
    // Enumerate and delete Windows credentials with target names starting with "Xbl"
    DWORD count = 0;
    PCREDENTIALW* credentials = nullptr;
    
    if (CredEnumerateW(L"Xbl*", 0, &count, &credentials)) {
        for (DWORD i = 0; i < count; i++) {
            CredDeleteW(credentials[i]->TargetName, credentials[i]->Type, 0);
        }
        CredFree(credentials);
    }
    
    // Close Xbox user handles
    if (xboxUser) {
        XUserCloseHandle(xboxUser);
        xboxUser = nullptr;
    }
    
    // Close PlayFab user handles
    if (pfUser) {
        PFLocalUserCloseHandle(pfUser);
        pfUser = nullptr;
    }
    
    // Reset authentication state for clean re-authentication
    authenticationState = AuthState::NotAuthenticated;
}
```

### 6. Lista de comprobación de pruebas

Use esta lista de comprobación para validar su implementación del ecosistema XBOX:

* [ ] **Flujo de autenticación**: Pruebe la autenticación por conexión remota (código QR/URL)
* [ ] **Devoluciones de llamada de la interfaz de usuario**: Compruebe que todos los cuadros de diálogo de la interfaz de usuario de Game Saves se muestran correctamente
* [ ] **Avisos de SPOP**: Pruebe la selección y confirmación del gamertag
* [ ] **Persistencia de credenciales**: Pruebe la persistencia del inicio de sesión entre reinicios de la aplicación
* [ ] **Cierre de sesión**: Compruebe la limpieza correcta de las credenciales al cerrar sesión
* [ ] **Comportamiento de sincronización**: Pruebe los patrones de sincronización frecuente y la sincronización previa al apagado
* [ ] **Prevención de pérdida de datos**: Compruebe que se pierde un progreso mínimo en escenarios de cierre forzado
* [ ] **Sincronización multiplataforma**: Pruebe la sincronización de guardados entre Steam Deck, las consolas XBOX y la PC de Microsoft Store
* [ ] **Configuración del registro**: Compruebe que la configuración del sandbox funciona en entornos de desarrollo
* [ ] **Controladores de eventos de XUser**: Confirme que los controladores de conexión remota y de SPOP funcionan correctamente

***

## Enfoque 2: Implementación con identidad personalizada - Implementación completa

Este enfoque le permite usar su propio sistema de identidad de jugador sin integración con XBOX Live. Elija este enfoque si su juego está centrado en Steam o si tiene un sistema de identidad personalizado existente.

### Información general

**Requisitos previos**:

* Configuración común completada (secciones 1 a 3 anteriores)
* Sistema de identidad de jugador personalizado para uso en producción

**Ventajas**:

* No se requiere autenticación de XBOX
* No se necesita configuración del registro
* No se requieren privilegios de administrador
* Interfaz de usuario más sencilla (sin código QR ni selección de gamertag)

**Limitaciones**:

* Debe implementar su propia identidad de jugador multiplataforma
* Sin características sociales de XBOX Live
* Requiere soluciones personalizadas de puente entre plataformas

### 1. Autenticación con identidad personalizada

Implemente su propio sistema de identidad para la autenticación de jugadores multiplataforma:

```cpp theme={null}
// Custom identity authentication
if (isSteamDeck) {
    // Development/Testing: Use Steam user identity temporarily
    // Production: Implement your own cross-platform player identity system
    // Required for production since Steam Cloud handles Steam-only sync
    
    // Option 1: OpenID Connect Integration (Recommended)
    // If your identity system supports OpenID Connect, use LoginWithOpenIdConnect:
    // PFAuthenticationLoginWithOpenIdConnectRequest request = {};
    // request.connectionId = "YourOpenIdConnectConnectionId";
    // request.idToken = "YourOpenIdConnectToken";
    // PFAuthenticationLoginWithOpenIdConnectAsync(serviceConfigHandle, &request, ...);
    
    // Option 2: Custom Integration
    // Initialize your custom authentication system
    // Connect to your user accounts/login system
    // Integrate with PlayFab Game Saves using your player identity
    
    // Initialize Game Saves with your custom identity system
    // (Implementation details depend on your specific identity integration)
}
```

### 2. Secuencia de inicialización

```cpp theme={null}
// 1. Check Steam availability and platform
bool steamAvailable = SteamIntegration::CheckSteamAvailability();
bool isSteamDeck = SteamIntegration::CheckIfSteamDeck();

// 2. Initialize Xbox runtime (still required for Game Saves infrastructure)
HRESULT hr = XGameRuntimeInitialize();
if (FAILED(hr)) {
    return hr;
}

// 3. Initialize PlayFab Core and Services
hr = PFInitialize(nullptr);
if (FAILED(hr)) {
    return hr;
}
hr = PFServicesInitialize(nullptr); // Optional

// 4. Initialize your custom player identity system
hr = InitializeCustomPlayerIdentity();
if (FAILED(hr)) {
    return hr;
}

// 5. Initialize Game Saves with custom identity system
// Option A: OpenID Connect (if your identity system supports it)
// hr = PFAuthenticationLoginWithOpenIdConnectAsync(serviceConfigHandle, &openIdRequest, ...);
// Option B: Custom authentication integration
hr = InitializeGameSavesWithCustomIdentity();
if (FAILED(hr)) {
    return hr;
}
```

### 3. Implementación del cierre de sesión

```cpp theme={null}
void SignOutFromSteamDeck() {
    // Sign-out for custom identity implementation
    // No Xbox credential cleanup needed
    
    // Clean up your custom identity system
    SignOutFromCustomIdentitySystem();
    
    // Close PlayFab user handles
    if (pfUser) {
        PFLocalUserCloseHandle(pfUser);
        pfUser = nullptr;
    }
    
    // Clear local game state as needed
    ClearLocalGameState();
}
```

### 4. Lista de comprobación de pruebas

Use esta lista de comprobación para validar su implementación con identidad personalizada:

* [ ] **Sistema de identidad personalizado**: Pruebe su sistema personalizado de autenticación e identidad de jugadores
* [ ] **Autenticación de PlayFab**: Pruebe el inicio de sesión de PlayFab mediante LoginWithOpenIdConnect (si usa OpenID Connect) o el método de autenticación personalizado
* [ ] **Sincronización multiplataforma de Game Saves**: Pruebe la sincronización de guardados en todas las plataformas de destino
* [ ] **Devoluciones de llamada de la interfaz de usuario**: Compruebe que todos los cuadros de diálogo de la interfaz de usuario de Game Saves se muestran correctamente
* [ ] **Resolución de conflictos**: Pruebe los conflictos de guardado entre dispositivos de distintas plataformas
* [ ] **Comportamiento de sincronización**: Pruebe los patrones de sincronización frecuente y la sincronización previa al apagado
* [ ] **Prevención de pérdida de datos**: Compruebe que se pierde un progreso mínimo en escenarios de cierre forzado
* [ ] **Autenticación personalizada**: Pruebe los flujos de inicio y cierre de sesión de su sistema de identidad
* [ ] **Cobertura de plataformas**: Pruebe en todas las plataformas a las que está dirigido su juego (no solo en dispositivos Steam)
* [ ] **Escenarios de red**: Pruebe las transiciones entre sin conexión y en línea
* [ ] **Rendimiento**: Compruebe que las operaciones de sincronización no afectan al rendimiento del juego

***

## Referencia de código de ejemplo

Para obtener ejemplos de implementación completos de ambos enfoques, consulte el proyecto de ejemplo:

* **Ubicación**: [PlayFabGameSaveSample-Windows](https://github.com/PlayFab/PlayFab-Samples/tree/master/Samples/All/PlayFabGameSaveSample-Windows)
* **Archivos clave**:
  * `SteamIntegration.cpp/.h` - Detección de Steam Deck, configuración del registro, controladores de autenticación
  * `GameSaveIntegrationUI.cpp/.h` - Implementaciones de devoluciones de llamada de la interfaz de usuario para ambos enfoques

***

## Documentación relacionada

* [Guía de implementación del GDK de octubre de 2025](/services/playfab/player-progression/game-saves/october-2025-gdk-changes)
* [Información general de Game Saves](/services/playfab/player-progression/game-saves/overview)
* [Inicio rápido de Game Saves](/services/playfab/player-progression/game-saves/quickstart)


## Related topics

- [Estrategias de vinculación de cuentas para PlayFab Game Saves](/es/services/playfab/player-progression/game-saves/linking.md)
- [Implementación de Game Saves con el GDK de octubre de 2025](/es/services/playfab/player-progression/game-saves/october-2025-gdk-changes.md)
- [Devoluciones de llamada de la interfaz de usuario de Game Saves](/es/services/playfab/player-progression/game-saves/ui-callbacks.md)
- [Inicio rápido de Game Saves](/es/services/playfab/player-progression/game-saves/quickstart.md)
- [Guías de portabilidad al GDK de XBOX](/es/home/build-first-title/porting-guides.md)
