> ## 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.

# Paquetes de Publisher Content

> Describe cómo crear y distribuir paquetes de Publisher Content, un tipo de paquete que permite a los editores de juegos hospedar y actualizar contenido complementario en sus propias CDN.

# Paquetes de Publisher Content

*Publisher Content* es un tipo de paquete que le permite hospedar contenido complementario del juego en su propia red de entrega de contenido (CDN), mientras la plataforma sigue administrando la instalación, la descarga en segundo plano, la validación de integridad y la experiencia del usuario. Los paquetes de Publisher Content son compatibles con las consolas de la familia XBOX One y con las consolas XBOX Series X|S a partir del GDK de octubre de 2026 (GDK 2610).

Los paquetes de Publisher Content se comportan como el contenido descargable (DLC) en tiempo de ejecución: se instalan junto con un juego base, se montan en su proceso y se desmontan cuando el juego se cierra. A diferencia del DLC, no se ingieren a través de Partner Center, no tienen identificador de Store y no se venden ni se licencian a través de Microsoft Store. Su servicio es la fuente de verdad sobre qué contenido se distribuye, cuándo se actualiza y quién lo recibe.

## Cuándo usar Publisher Content

Considere el uso de Publisher Content cuando quiera hacer cualquiera de lo siguiente:

* Distribuir pequeñas actualizaciones de servicio en vivo (datos de configuración, tablas de ajuste, pequeños paquetes de recursos) sin pasar por la ingesta de la Store.
* Entregar contenido de complemento con la marca del editor que todos los jugadores del juego base reciban automáticamente.
* Reutilizar una CDN y una canalización de contenido existentes que ya utilice para sus juegos en otras plataformas.
* Mantener el control sobre el calendario de implementación, la segmentación regional o las pruebas A/B en la capa de la CDN.

Publisher Content no sustituye al DLC. Siga usando los [paquetes de DLC](/es/build/core-features/common/packaging/packaging-downloadable-content-dlc) estándar cuando necesite derechos de uso por usuario, flujos de compra o licencias de Microsoft Store.

## Requisitos y restricciones

* Un paquete de Publisher Content por juego base.
* Disponible para cualquier jugador que posea el juego base. No hay comprobación de licencia por usuario.
* Compatible con las consolas de la familia XBOX One y las consolas XBOX Series X|S.
* El juego base y el paquete de Publisher Content deben usar el mismo formato de paquete. Por ejemplo, si el juego base está empaquetado como MSIXVC2, el paquete de Publisher Content también debe ser MSIXVC2.
* El paquete de Publisher Content debe ser pequeño, es decir, de menos de 1 GB.
* El paquete de Publisher Content se firma con material de firma proporcionado por el editor, y el juego base incluye el material público correspondiente para que la plataforma pueda validar el Publisher Content que afirma pertenecerle. El juego base se firma de la misma forma que cualquier otro título. El material de firma varía según el formato de paquete:
  * **XVC y MSIXVC**: una clave de firma CNG sin procesar. Se requiere RSA-4096.
  * **MSIXVC2**: un certificado X.509 con una clave RSA-4096. El certificado debe ser válido actualmente, tener una clave privada RSA accesible y permitir firmas digitales.

<Info>
  La plataforma no proporciona confidencialidad del contenido para los paquetes de Publisher Content. A diferencia del DLC de Microsoft Store, Publisher Content no se cifra para su distribución: cualquier persona que descargue el archivo de su CDN puede inspeccionar su contenido. Si necesita confidencialidad para partes de su carga útil, cifre esas partes dentro del propio contenido antes del empaquetado.
</Info>

## Cómo encajan las piezas

A grandes rasgos:

1. Declara una **URL de manifiesto** en su juego base en *MicrosoftGame.config*. Esta URL apunta a un pequeño archivo JSON que hospeda en su CDN y que puede actualizar en cualquier momento.
2. Crea un **paquete de Publisher Content** que hace referencia al juego base mediante el identificador de Store.
3. Firma el paquete de Publisher Content con su material de firma de editor. El juego base incluye el material público correspondiente para que la plataforma pueda validar cualquier Publisher Content que afirme pertenecerle.
4. Cuando un jugador instala el juego base, la plataforma obtiene su manifiesto, lee la URL de CDN del paquete de Publisher Content actual y pone en cola su instalación.
5. En tiempo de ejecución, su juego enumera los paquetes instalados y monta el paquete de Publisher Content de la misma forma que montaría un DLC.

Para distribuir una nueva revisión del contenido, cargue un nuevo paquete en su CDN y actualice su manifiesto para que apunte a él. La plataforma detecta el cambio en la siguiente comprobación de actualizaciones.

## Configurar el juego base

En el archivo *MicrosoftGame.config* de su juego base, agregue un elemento `PublisherContent` con un elemento secundario `ManifestUrl`. Todos los dispositivos que ejecuten su juego deben poder acceder a la URL.

```xml theme={null}
<?xml version="1.0" encoding="utf-8"?>
<Game configVersion="1">
    <!-- Existing Identity, ShellVisuals, ExecutableList, StoreId, etc. -->

    <StoreId>9NZTKMP36L8J</StoreId>

    <PublisherContent>
        <ManifestUrl>https://example.com/space-raiders/pubxvc/console/manifest.json</ManifestUrl>
    </PublisherContent>
</Game>
```

Para obtener más información sobre estos elementos, consulte [Elemento PublisherContent (MicrosoftGame.config)](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontent) y [Elemento ManifestUrl (MicrosoftGame.config)](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-manifesturl).

## Crear el paquete de Publisher Content

Cree un archivo *MicrosoftGame.config* junto a la carga útil de Publisher Content. Haga referencia al juego base mediante su identificador de Store con el elemento `PublisherContentBaseProduct`.

```xml theme={null}
<?xml version="1.0" encoding="utf-8"?>
<Game configVersion="1">
    <Identity Name="ContosoStudios.SpaceRaiders.PublisherContent"
              Publisher="CN=REPLACE_WITH_YOUR_PUBLISHER"
              Version="1.0.0.0"/>

    <ShellVisuals DefaultDisplayName="Space Raiders Publisher Content"
                  PublisherDisplayName="Contoso Studios"
                  StoreLogo="StoreLogo.png"
                  Square150x150Logo="Logo.png"
                  Square44x44Logo="SmallLogo.png"
                  Description="Publisher-hosted content for Space Raiders."
                  BackgroundColor="#000040"
                  SplashScreenImage="SplashScreen.png"/>

    <PublisherContentBaseProduct>9NZTKMP36L8J</PublisherContentBaseProduct>
</Game>
```

Para obtener más información, consulte [Elemento PublisherContentBaseProduct (MicrosoftGame.config)](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontentbaseproduct).

<Note>
  No incluya un elemento `AllowedProducts` en un paquete de Publisher Content. Ese elemento identifica un paquete como DLC estándar y es mutuamente excluyente con `PublisherContentBaseProduct`.
</Note>

## Crear el manifiesto

Hospede un pequeño manifiesto JSON en la `ManifestUrl` que declaró en el juego base. El manifiesto contiene un único campo `url` que apunta al paquete de Publisher Content actual en su CDN. Asegúrese de no cambiar el Publisher Content en esa URL una vez publicado; en su lugar, publique cada nueva versión del paquete de Publisher Content en una nueva URL y actualice el manifiesto en consecuencia.

```json theme={null}
{
    "url": "https://example.com/space-raiders/pubxvc/console/space-raiders-pubxvc-v2.30.1.xvc"
}
```

## Generar el material de firma del editor

El material de firma del editor reside en su máquina de compilación y se hace referencia a él por nombre (o huella digital) cuando `makepkg` empaqueta el juego base y el paquete de Publisher Content. La forma exacta depende del formato de paquete de destino.

<Info>
  Trate la clave de firma del editor o la clave privada del certificado como un secreto de producción. Cualquier persona con acceso al material privado puede generar paquetes de Publisher Content que la plataforma aceptará como si procedieran de usted.
</Info>

### Para paquetes XVC y MSIXVC

Cree una clave de firma RSA-4096 en un proveedor de almacenamiento de claves CNG de Windows en la máquina de compilación.

En el siguiente ejemplo de PowerShell se crea una clave de firma RSA-4096 exportable llamada `MyTestPubXvcSigningKey` en Microsoft Software Key Storage Provider.

```powershell theme={null}
Add-Type -AssemblyName System.Security

$keyName = "MyTestPubXvcSigningKey"
$providerName = "Microsoft Software Key Storage Provider"

$cngParams = [System.Security.Cryptography.CngKeyCreationParameters]::new()
$cngParams.Provider     = [System.Security.Cryptography.CngProvider]::new($providerName)
$cngParams.KeyUsage     = [System.Security.Cryptography.CngKeyUsages]::Signing
$cngParams.ExportPolicy = [System.Security.Cryptography.CngExportPolicies]::AllowExport

<# Use an RSA-4096 key. #>
$len = [System.Security.Cryptography.CngProperty]::new(
    "Length", [BitConverter]::GetBytes([int]4096),
    [System.Security.Cryptography.CngPropertyOptions]::None)
$cngParams.Parameters.Add($len)

$key = [System.Security.Cryptography.CngKey]::Create(
    [System.Security.Cryptography.CngAlgorithm]::Rsa, $keyName, $cngParams)

Write-Host "Created CNG key '$keyName' in the $providerName."
```

Pase el nombre de la clave resultante a `makepkg pack` mediante `/usepublisherkey`. Si usa un proveedor de almacenamiento de claves CNG distinto del predeterminado, pase también su nombre mediante `/publisherkeyprovider`.

### Para paquetes MSIXVC2

Cree un certificado X.509 cuya clave de sujeto sea una clave RSA-4096 e instale el certificado y su clave privada en el almacén de certificados `CurrentUser\My`.

En el siguiente ejemplo de PowerShell se crea un certificado RSA-4096 autofirmado en `CurrentUser\My` y se exporta su archivo `.cer`.

```powershell theme={null}
$subject = "CN=MyTestPubXvcSigningCertificate"
$certificatePath = Join-Path $PWD "MyTestPubXvcSigningCertificate.cer"

$certificate = New-SelfSignedCertificate `
    -Subject $subject `
    -CertStoreLocation "Cert:\CurrentUser\My" `
    -Provider "Microsoft Software Key Storage Provider" `
    -KeyAlgorithm RSA `
    -KeyLength 4096 `
    -HashAlgorithm SHA256 `
    -KeyUsage DigitalSignature `
    -NotAfter (Get-Date).AddYears(5)

Export-Certificate `
    -Cert $certificate `
    -FilePath $certificatePath `
    -Type CERT
```

Pase la ruta de acceso del archivo `.cer` exportado o la huella digital del certificado a `makepkg pack` mediante `/usepublishercert`. Si el certificado está instalado en un almacén distinto de `My`, pase también su nombre mediante `/publishercertstore`.

## Empaquetar el juego base y el Publisher Content

Ambas invocaciones de `pack` deben hacer referencia a la misma clave o certificado.

### Para paquetes XVC y MSIXVC

Empaquete el juego base:

```console theme={null}
makepkg pack /f layout.xml /d <base_game_folder> /pd <output_folder> /usepublisherkey <publisherkeyname>
```

Empaquete el Publisher Content:

```console theme={null}
makepkg pack /f layout.xml /d <publisher_content_folder> /pd <output_folder> /usepublisherkey <publisherkeyname>
```

Si usa un proveedor de almacenamiento de claves CNG distinto de Microsoft Software Key Storage Provider, agregue `/publisherkeyprovider <providername>` a ambos comandos.

### Para paquetes MSIXVC2

Empaquete el juego base:

```console theme={null}
makepkg pack /msixvc2 /d <base_game_folder> /pd <output_folder> /usepublishercert <thumbprint|certificate.cer>
```

Empaquete el Publisher Content:

```console theme={null}
makepkg pack /msixvc2 /d <publisher_content_folder> /pd <output_folder> /usepublishercert <thumbprint|certificate.cer>
```

Si el certificado está instalado en un almacén distinto de `CurrentUser\My`, agregue `/publishercertstore <store>` a ambos comandos.

Para obtener más detalles, consulte [Crear paquete (makepkg.exe)](/es/build/core-features/common/packaging/deployment/makepkg).

## Publicar y actualizar

<Note>
  Los paquetes de Publisher Content se hospedan en su CDN y no se pueden cargar en Partner Center. `makepkg upload` rechaza los paquetes de Publisher Content tanto en formato sin empaquetar como empaquetado. El paquete del juego base se carga con normalidad mediante el flujo estándar de Partner Center.
</Note>

1. Cargue el XVC de Publisher Content empaquetado en su CDN, en la URL a la que hace referencia su manifiesto.
2. Cargue el JSON de su manifiesto en la URL que declaró en el elemento `ManifestUrl` del juego base.
3. Envíe y distribuya el juego base a través de Partner Center como de costumbre.

Para implementar una actualización:

1. Cargue el nuevo paquete de Publisher Content en su CDN en una nueva URL. No reemplace el paquete de Publisher Content anterior.
2. Actualice el valor `url` del manifiesto para que apunte al nuevo paquete.
3. Cargue el archivo JSON actualizado en la URL que declaró en el elemento `ManifestUrl` del juego base.

Los dispositivos con el juego instalado detectan el cambio en la siguiente comprobación de actualizaciones y descargan el nuevo paquete de Publisher Content en segundo plano.

## Acceder a Publisher Content en tiempo de ejecución

En tiempo de ejecución, descubra el Publisher Content instalado de la misma forma que descubre el DLC: mediante [XPackageEnumeratePackages](/es/reference/system/xpackage/functions/xpackageenumeratepackages) y, después, montando el paquete devuelto con [XPackageMountWithUiAsync](/es/reference/system/xpackage/functions/xpackagemountwithuiasync).

Pase [XPackageKind::PublisherContent](/es/reference/system/xpackage/enums/xpackagekind) para filtrar la enumeración y obtener solo Publisher Content:

```cpp theme={null}
HRESULT hr = XPackageEnumeratePackages(
    XPackageKind::PublisherContent,
    XPackageEnumerationScope::ThisOnly,
    nullptr,
    [](void*, const XPackageDetails* details) -> bool
    {
        // details->packageIdentifier can be passed to XPackageMountWithUiAsync.
        // details->kind is XPackageKind::PublisherContent.
        return true;
    });
```

Si ya tiene un identificador de paquete de otro origen, use [XPackageGetPackageKind](/es/reference/system/xpackage/functions/xpackagegetpackagekind) para determinar si hace referencia a un paquete de Publisher Content:

```cpp theme={null}
XPackageKind kind;
HRESULT hr = XPackageGetPackageKind(packageIdentifier, &kind);
if (SUCCEEDED(hr) && kind == XPackageKind::PublisherContent)
{
    // Handle Publisher Content.
}
```

Dado que Publisher Content no se licencia a través de Microsoft Store, no es necesario llamar a [XStoreQueryPackageIdByKind](/es/gdk-docs/docs/reference/system/xstore/xstore_members) ni realizar una comprobación de licencia de la Store antes del montaje.

## Comportamiento de desinstalación

Cuando un jugador desinstala el juego base, la plataforma desinstala automáticamente el paquete de Publisher Content asociado. No es necesario quitarlo explícitamente desde el código del juego.

## Consulte también

* [Elemento PublisherContent (MicrosoftGame.config)](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontent)
* [Elemento ManifestUrl (MicrosoftGame.config)](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-manifesturl)
* [Elemento PublisherContentBaseProduct (MicrosoftGame.config)](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontentbaseproduct)
* [Crear paquete (makepkg.exe)](/es/build/core-features/common/packaging/deployment/makepkg)
* [XPackageKind](/es/reference/system/xpackage/enums/xpackagekind)
* [XPackageGetPackageKind](/es/reference/system/xpackage/functions/xpackagegetpackagekind)
* [XPackageEnumeratePackages](/es/reference/system/xpackage/functions/xpackageenumeratepackages)
* [Paquetes de contenido descargable (DLC) del GDK](/es/build/core-features/common/packaging/packaging-downloadable-content-dlc)


## Related topics

- [Elemento de MicrosoftGame.config: PublisherContent](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontent.md)
- [Elemento de MicrosoftGame.config: PublisherContentBaseProduct](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontentbaseproduct.md)
- [XPackageKind](/es/reference/system/xpackage/enums/xpackagekind.md)
- [XPackageGetPackageKind](/es/reference/system/xpackage/functions/xpackagegetpackagekind.md)
- [Elemento de MicrosoftGame.config: ManifestUrl](/es/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-manifesturl.md)
