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

# Publisher Content パッケージ

> ゲーム パブリッシャーが独自の CDN で補足コンテンツをホストおよび更新できるパッケージの種類である、Publisher Content パッケージの作成方法と出荷方法について説明します。

# Publisher Content パッケージ

*Publisher Content* は、プラットフォームがインストール、バックグラウンド ダウンロード、整合性の検証、ユーザー エクスペリエンスの管理を引き続き行いながら、補足的なゲーム コンテンツを独自のコンテンツ配信ネットワーク (CDN) でホストできるパッケージの種類です。Publisher Content パッケージは、XBOX One ファミリ本体と、October 2026 GDK (GDK 2610) 以降の XBOX Series X|S 本体でサポートされています。

Publisher Content パッケージは、実行時にはダウンロード コンテンツ (DLC) と同様に動作します。ベース ゲームと共にインストールされ、プロセスにマウントされ、ゲームの終了時にマウント解除されます。DLC とは異なり、Partner Center を通じて取り込まれることはなく、ストア ID を持たず、Microsoft Store を通じて販売またはライセンス付与されることもありません。どのコンテンツを出荷するか、いつ更新するか、誰が受け取るかについては、お客様のサービスが信頼できる情報源となります。

## Publisher Content を使用する場合

次のいずれかを行う場合は、Publisher Content の使用を検討してください。

* ストアへの取り込みを経ずに、小規模なライブサービスの更新 (構成データ、調整テーブル、小さなアセット パック) を出荷する。
* ベース ゲームのすべてのプレイヤーが自動的に受け取る、パブリッシャー ブランドのアドオン コンテンツを配信する。
* 他のプラットフォームのゲーム向けに既に運用している既存の CDN とコンテンツ パイプラインを再利用する。
* CDN レイヤーでロールアウトのタイミング、地域ターゲティング、または A/B テストを制御し続ける。

Publisher Content は DLC の代わりになるものではありません。ユーザーごとの権利、購入フロー、または Microsoft Store のライセンスが必要な場合は、引き続き標準の [DLC パッケージ](/ja-jp/build/core-features/common/packaging/packaging-downloadable-content-dlc) を使用してください。

## 要件と制約

* ベース ゲームごとに 1 つの Publisher Content パッケージ。
* ベース ゲームを所有するすべてのプレイヤーが利用できます。ユーザーごとのライセンス チェックはありません。
* XBOX One ファミリ本体と XBOX Series X|S 本体でサポートされています。
* ベース ゲームと Publisher Content パッケージは、同じパッケージ形式を使用する必要があります。たとえば、ベース ゲームが MSIXVC2 としてパッケージ化されている場合、Publisher Content パッケージも MSIXVC2 である必要があります。
* Publisher Content パッケージは小さい、つまりサイズが 1 GB 未満である必要があります。
* Publisher Content パッケージはパブリッシャーが提供する署名素材で署名され、ベース ゲームには対応する公開素材が埋め込まれるため、プラットフォームはそのベース ゲームに属すると主張する Publisher Content を検証できます。ベース ゲーム自体は、他のタイトルと同じ方法で署名されます。署名素材はパッケージ形式によって異なります。
  * **XVC および MSIXVC** — 未加工の CNG 署名キー。RSA-4096 が必要です。
  * **MSIXVC2** — RSA-4096 キーを持つ X.509 証明書。証明書は現在有効であり、アクセス可能な RSA 秘密キーを持ち、デジタル署名が許可されている必要があります。

<Info>
  プラットフォームは、Publisher Content パッケージのコンテンツの機密性を提供しません。Microsoft Store の DLC とは異なり、Publisher Content は配信用に暗号化されないため、CDN からファイルをダウンロードした人は誰でもその内容を調べることができます。ペイロードの一部に機密性が必要な場合は、パッケージ化する前に、コンテンツ自体の内部でその部分を暗号化してください。
</Info>

## 各要素の連携のしくみ

大まかな流れは次のとおりです。

1. *MicrosoftGame.config* で、ベース ゲームに **マニフェスト URL** を宣言します。この URL は、CDN でホストし、いつでも更新できる小さな JSON ファイルを指します。
2. ストア ID でベース ゲームを参照する **Publisher Content パッケージ** を作成します。
3. パブリッシャーの署名素材で Publisher Content パッケージに署名します。ベース ゲームには対応する公開素材が埋め込まれるため、プラットフォームはそのベース ゲームに属すると主張する Publisher Content を検証できます。
4. プレイヤーがベース ゲームをインストールすると、プラットフォームはマニフェストを取得し、現在の Publisher Content パッケージの CDN URL を読み取って、そのインストールをキューに登録します。
5. 実行時に、ゲームはインストール済みのパッケージを列挙し、DLC をマウントするのと同じ方法で Publisher Content パッケージをマウントします。

コンテンツの新しいリビジョンを出荷するには、新しいパッケージを CDN にアップロードし、それを指すようにマニフェストを更新します。プラットフォームは、次回の更新チェック時に変更を検出します。

## ベース ゲームを設定する

ベース ゲームの *MicrosoftGame.config* ファイルに、`ManifestUrl` 子要素を含む `PublisherContent` 要素を追加します。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>
```

これらの要素の詳細については、[PublisherContent 要素 (MicrosoftGame.config)](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontent) および [ManifestUrl 要素 (MicrosoftGame.config)](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-manifesturl) を参照してください。

## Publisher Content パッケージを作成する

Publisher Content のペイロードと共に *MicrosoftGame.config* を作成します。`PublisherContentBaseProduct` 要素を使用して、ストア ID でベース ゲームを参照します。

```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>
```

詳細については、[PublisherContentBaseProduct 要素 (MicrosoftGame.config)](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontentbaseproduct) を参照してください。

<Note>
  Publisher Content パッケージには `AllowedProducts` 要素を含めないでください。この要素はパッケージを標準の DLC として識別するものであり、`PublisherContentBaseProduct` と相互に排他的です。
</Note>

## マニフェストを作成する

ベース ゲームで宣言した `ManifestUrl` に、小さな JSON マニフェストをホストします。マニフェストには、CDN 上の現在の Publisher Content パッケージを指す単一の `url` フィールドが含まれます。公開後は、その URL にある Publisher Content を変更しないでください。代わりに、新しい Publisher Content パッケージのバージョンはそれぞれ新しい URL に公開し、それに応じてマニフェストを更新してください。

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

## パブリッシャーの署名素材を生成する

パブリッシャーの署名素材はビルド マシン上に置かれ、`makepkg` がベース ゲームと Publisher Content パッケージをパックする際に名前 (または拇印) で参照されます。正確な形式は、対象とするパッケージ形式によって異なります。

<Info>
  パブリッシャーの署名キーまたは証明書の秘密キーは、運用環境のシークレットとして扱ってください。秘密素材にアクセスできる人は誰でも、プラットフォームがお客様からのものとして受け入れる Publisher Content パッケージを作成できます。
</Info>

### XVC および MSIXVC パッケージの場合

ビルド マシン上の Windows CNG キー記憶域プロバイダーに RSA-4096 署名キーを作成します。

次の PowerShell の例では、`MyTestPubXvcSigningKey` という名前のエクスポート可能な RSA-4096 署名キーを 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."
```

生成されたキー名を `/usepublisherkey` で `makepkg pack` に渡します。既定以外の CNG キー記憶域プロバイダーを使用する場合は、`/publisherkeyprovider` でその名前も渡します。

### MSIXVC2 パッケージの場合

サブジェクト キーが RSA-4096 キーである X.509 証明書を作成し、証明書とその秘密キーを `CurrentUser\My` 証明書ストアにインストールします。

次の PowerShell の例では、`CurrentUser\My` に自己署名 RSA-4096 証明書を作成し、その `.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
```

エクスポートした `.cer` のパスまたは証明書の拇印を、`/usepublishercert` で `makepkg pack` に渡します。証明書が `My` 以外のストアにインストールされている場合は、`/publishercertstore` でその名前も渡します。

## ベース ゲームと Publisher Content をパッケージ化する

両方の `pack` の呼び出しで、同じキーまたは証明書を参照する必要があります。

### XVC および MSIXVC パッケージの場合

ベース ゲームをパッケージ化します。

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

Publisher Content をパッケージ化します。

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

Microsoft Software Key Storage Provider 以外の CNG キー記憶域プロバイダーを使用する場合は、両方のコマンドに `/publisherkeyprovider <providername>` を追加します。

### MSIXVC2 パッケージの場合

ベース ゲームをパッケージ化します。

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

Publisher Content をパッケージ化します。

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

証明書が `CurrentUser\My` 以外のストアにインストールされている場合は、両方のコマンドに `/publishercertstore <store>` を追加します。

詳細については、[パッケージの作成 (makepkg.exe)](/ja-jp/build/core-features/common/packaging/deployment/makepkg) を参照してください。

## 公開と更新

<Note>
  Publisher Content パッケージは CDN でホストされ、Partner Center にアップロードすることはできません。`makepkg upload` は、ルーズ形式とパッケージ形式のどちらの Publisher Content パッケージも拒否します。ベース ゲーム パッケージは、標準の Partner Center フローを通じて通常どおりアップロードされます。
</Note>

1. パッケージ化された Publisher Content XVC を、マニフェストで参照した URL で CDN にアップロードします。
2. マニフェスト JSON を、ベース ゲームの `ManifestUrl` 要素で宣言した URL にアップロードします。
3. 通常どおり、Partner Center を通じてベース ゲームを申請して出荷します。

更新をロールアウトするには:

1. 新しい Publisher Content パッケージを、新しい URL で CDN にアップロードします。古い Publisher Content パッケージは置き換えないでください。
2. 新しいパッケージを指すように、マニフェストの `url` の値を更新します。
3. 更新した JSON ファイルを、ベース ゲームの `ManifestUrl` 要素で宣言した URL にアップロードします。

インストール済みのデバイスは、次回の更新チェック時に変更を検出し、新しい Publisher Content パッケージをバックグラウンドでダウンロードします。

## 実行時に Publisher Content にアクセスする

実行時には、DLC を検出するのと同じ方法でインストール済みの Publisher Content を検出します。つまり、[XPackageEnumeratePackages](/ja-jp/reference/system/xpackage/functions/xpackageenumeratepackages) を使用し、返されたパッケージを [XPackageMountWithUiAsync](/ja-jp/reference/system/xpackage/functions/xpackagemountwithuiasync) でマウントします。

列挙を Publisher Content のみに絞り込むには、[XPackageKind::PublisherContent](/ja-jp/reference/system/xpackage/enums/xpackagekind) を渡します。

```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;
    });
```

別のソースから既にパッケージ識別子を取得している場合は、[XPackageGetPackageKind](/ja-jp/reference/system/xpackage/functions/xpackagegetpackagekind) を使用して、それが Publisher Content パッケージを参照しているかどうかを判断します。

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

Publisher Content は Microsoft Store を通じてライセンス付与されないため、マウントする前に [XStoreQueryPackageIdByKind](/ja-jp/gdk-docs/docs/reference/system/xstore/xstore_members) を呼び出したり、ストアのライセンス チェックを実行したりする必要はありません。

## アンインストール時の動作

プレイヤーがベース ゲームをアンインストールすると、プラットフォームは関連する Publisher Content パッケージを自動的にアンインストールします。ゲーム コードから明示的に削除する必要はありません。

## 関連項目

* [PublisherContent 要素 (MicrosoftGame.config)](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontent)
* [ManifestUrl 要素 (MicrosoftGame.config)](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-manifesturl)
* [PublisherContentBaseProduct 要素 (MicrosoftGame.config)](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontentbaseproduct)
* [パッケージの作成 (makepkg.exe)](/ja-jp/build/core-features/common/packaging/deployment/makepkg)
* [XPackageKind](/ja-jp/reference/system/xpackage/enums/xpackagekind)
* [XPackageGetPackageKind](/ja-jp/reference/system/xpackage/functions/xpackagegetpackagekind)
* [XPackageEnumeratePackages](/ja-jp/reference/system/xpackage/functions/xpackageenumeratepackages)
* [GDK ダウンロード コンテンツ (DLC) パッケージ](/ja-jp/build/core-features/common/packaging/packaging-downloadable-content-dlc)


## Related topics

- [MicrosoftGame.config 要素 - PublisherContentBaseProduct](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontentbaseproduct.md)
- [MicrosoftGame.config 要素 - PublisherContent](/ja-jp/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-publishercontent.md)
- [XPackageKind](/ja-jp/reference/system/xpackage/enums/xpackagekind.md)
- [XPackageGetPackageKind](/ja-jp/reference/system/xpackage/functions/xpackagegetpackagekind.md)
- [XVC パッケージ](/ja-jp/publishing/game-publishing/concepts/packages-xvc.md)
