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

# Recherche de mises à jour

> Recherchez et appliquez les mises à jour des packages de jeu et de contenu téléchargeable XBOX dans votre titre à l'aide de XStoreQueryGameAndDlcPackageUpdatesAsync pour assurer la parité en multijoueur.

Le titre peut rechercher et appliquer des mises à jour s'il est essentiel que le jeu soit à jour. Cette condition est souvent importante lorsque le jeu comporte des fonctionnalités multijoueurs pour lesquelles il est crucial que tous les joueurs qui exécutent le jeu disposent des mêmes fonctionnalités.

Le titre peut rechercher des mises à jour à l'aide de [XStoreQueryGameAndDlcPackageUpdatesAsync](/fr-CA/reference/system/xstore/xstore_members), comme le montre l'exemple de code suivant :

```cpp theme={null}
void CALLBACK QueryGameAndDlcPackageUpdatesCallback(XAsyncBlock* async)
{
    unsigned int numUpdates = 0;

    HRESULT hr = XStoreQueryGameAndDlcPackageUpdatesResultCount(async, &numUpdates);

    if (SUCCEEDED(hr))
    {
        if (numUpdates > 0)
        {
            std::vector<XStorePackageUpdate> packages(numUpdates);

            hr = XStoreQueryGameAndDlcPackageUpdatesResult(async, numUpdates, packages.data());

            if (SUCCEEDED(hr))
            {
                for (auto &package : packages)
                {
                    printf("Update available %s\n", package.packageIdentifier);
                }
            }
        }
        else
        {
            printf("No updates are available\n");
        }
    }

    delete async;
}

void CheckForUpdates()
{
    auto asyncBlock = new XAsyncBlock{};
    asyncBlock->queue = m_asyncQueue;
    asyncBlock->callback = QueryGameAndDlcPackageUpdatesCallback;

    if (FAILED(XStoreQueryGameAndDlcPackageUpdatesAsync(m_xStoreContext, asyncBlock)))
    {
        delete asyncBlock;
    }
}
```

Si un titre comprend de nombreux éléments de contenu téléchargeable qui ne nécessitent pas de vérification des mises à jour (par exemple, des packages de contenu téléchargeable vides utilisés uniquement pour les licences), le code précédent peut entraîner une surcharge inutile en vérifiant chacun d'eux.

Utilisez plutôt [XStoreQueryPackageUpdatesAsync](/fr-CA/reference/system/xstore/xstore_members), en filtrant sur l'ID de package du jeu en cours obtenu à l'aide de [XPackageGetCurrentProcessPackageIdentifier](/fr-CA/reference/system/xstore/xstore_members) ou en filtrant les ID de package retournés par [XPackageEnumeratePackages](/fr-CA/reference/system/xstore/xstore_members) :

```cpp theme={null}
void CALLBACK QueryPackageUpdatesCallback(XAsyncBlock* async)
{
    unsigned int numUpdates = 0;

    HRESULT hr = XStoreQueryPackageUpdatesResultCount(async, &numUpdates);

    if (FAILED(hr))
    {
        printf("XStoreQueryPackageUpdatesResultCount failed : 0x%x\n", hr);
        return;
    }

    printf("Number of updates: %d", numUpdates);

    if (count > 0)
    {
        std::vector<XStorePackageUpdate> packages(numUpdates);

        hr = XStoreQueryPackageUpdatesResult(async, numUpdates, packages.data());
        
        if (SUCCEEDED(hr))
        {
            for (auto &package : packages)
            {
                printf("Update available %s\n", package.packageIdentifier);
            }
        }
    }
}

void QueryPackageUpdates()
{
    std::vector<std::string> packageIds;

    HRESULT hr = XPackageEnumeratePackages(
        XPackageKind::Game,
        XPackageEnumerationScope::ThisOnly, // this will return for the base game only
        &packageIds, [](void* context, const XPackageDetails* details) -> bool
        {
            auto packageIds = reinterpret_cast<std::vector<std::string>*>(context);

            printf("Identifier: %s name: %s\n", details->packageIdentifier, details->displayName);

            packageIds->push_back(details->packageIdentifier);
        });

    // packageIds now populated with just the base game package Id

    auto asyncBlock = new XAsyncBlock();
    asyncBlock->queue = m_asyncQueue;
    asyncBlock->context = m_storeContext;
    asyncBlock->callback = QueryPackageUpdatesCallback;

    hr = XStoreQueryPackageUpdatesAsync(
        m_storeContext,
        packageIds.data(),
        packageIds.size(),
        asyncBlock);

    if (FAILED(hr))
    {
        printf("XStoreQueryPackageUpdatesAsync failed: 0x%x\n", hr);
        return;
    }
}
```

## Télécharger et installer les mises à jour

Après avoir déterminé l'ensemble des mises à jour, utilisez [XStoreDownloadAndInstallPackageUpdatesAsync](/fr-CA/reference/system/xstore/xstore_members) pour mettre en file d'attente et télécharger toutes les mises à jour.

<Note />

À ce stade, le jeu se ferme pour appliquer la mise à jour. Ce processus se produit sans avertissement; avisez donc clairement l'utilisateur ou demandez-lui une confirmation avant d'appeler cette fonction.

```cpp theme={null}
void DownloadUpdates()
{
    std::vector<const char*> packageIds;

    for (XStorePackageUpdate package : m_updates)
    {
        // m_updates populated from the update check
        packageIds.push_back(package.packageIdentifier);
    }

    if (!packageIds.empty())
    {
        auto asyncBlock = new XAsyncBlock{};
        asyncBlock->context = this;
        asyncBlock->queue = m_asyncQueue;
        asyncBlock->callback = [](XAsyncBlock* asyncBlockInner)
        {
            // Called when update is complete
            auto pThis = reinterpret_cast<Sample*>(asyncBlockInner->context);
            HRESULT hr = XStoreDownloadAndInstallPackageUpdatesResult(asyncBlockInner);

            delete asyncBlockInner;
        };

        HRESULT hr = XStoreDownloadAndInstallPackageUpdatesAsync(m_xStoreContext, packageIds.data(), packageIds.size(), asyncBlock);
    }
}
```

## Surveillance de la progression du téléchargement

Lorsqu'un téléchargement est en cours, utilisez [XPackageCreateInstallationMonitor](/fr-CA/reference/system/xstore/xstore_members) pour surveiller la progression du téléchargement :

```cpp theme={null}
void CreateInstallationMonitor(const char* packageId)
{
    XPackageInstallationMonitorHandle pimHandle;

    HRESULT hr = XPackageCreateInstallationMonitor(packageId, 0, nullptr, 1000, m_asyncQueue, &pimHandle);

    if(SUCCEEDED(hr))
    {
        XTaskQueueRegistrationToken callbackToken;

        XPackageRegisterInstallationProgressChanged(
            m_pimHandle,
            this,
            [](void* context, XPackageInstallationMonitorHandle pimHandle)
            {
                XPackageInstallationProgress progress;
                XPackageGetInstallationProgress(pimHandle, &progress);

                if(!progress.completed)
                {
                    printf("%llu%% installed\n", static_cast<double>(progress.installedBytes) / static_cast<double>(progress.totalBytes);
                }
                else
                {
                    XPackageCloseInstallationMonitorHandle(pimHandle);
                }
            }, &callbackToken);
    }
}
```

## Test des mises à jour

Pendant le développement, vous pouvez tester la disponibilité des mises à jour uniquement à l'aide de packages locaux.

1. Créez un package V1 avec le code de vérification et de téléchargement des mises à jour.
2. Créez un package V2 avec la même identité, mais un numéro de version incrémenté.
3. Exécutez `xbapp/wdapp install` V1.
4. Exécutez `xbapp/wdapp update` V2 `/a`.
5. Lancez V1.

Assurez-vous que l'ID de contenu correspond entre les packages.

Le résultat de ce processus est que l'appel `XStoreQueryGameAndDlcPackageUpdatesAsync` ou `XStoreQueryPackageUpdatesAsync` de V1 trouve toutes les mises à jour disponibles, et que `XStoreDownloadAndInstallPackageUpdatesAsync` met à jour V1 à l'aide du package V2 annoncé. Lorsque le « téléchargement » de V2 est en cours, cet état s'affiche dans la file d'attente de téléchargement XBOX, l'application XBOX ou l'application Microsoft Store sous forme d'élément dans la file d'attente. Une fois l'installation terminée, V2 est installé. Vous pouvez vérifier l'installation à l'aide de `xbapp/wdapp list[dlc]`.

L'utilisation de `/m` au lieu de `/a` rend la mise à jour « obligatoire », ce qui affecte simplement le champ [XStorePackageUpdate](/fr-CA/reference/system/xstore/xstore_members)`.isMandatory`.

Vous ne pouvez pas effectuer une mise à jour d'une build de développement vers le package téléchargé à partir du Store en raison des différences de signature.

Pour plus d'informations sur la création de mises à jour efficaces et les différentes façons de les tester, consultez les pages sur les mises à jour de contenu mentionnées dans la section suivante.

## Documentation de référence de l'API

* [XStore (contenu de l'API)](/fr-CA/reference/system/xstore/xstore_members)
  * Fonctions
    * [XStoreQueryGameAndDlcPackageUpdatesAsync](/fr-CA/reference/system/xstore/xstore_members)
    * [XStoreQueryPackageUpdatesAsync](/fr-CA/reference/system/xstore/xstore_members)
    * [XStoreDownloadAndInstallPackageUpdatesAsync](/fr-CA/reference/system/xstore/xstore_members)
  * Structures
    * [XStorePackageUpdate](/fr-CA/reference/system/xstore/xstore_members)
* [XPackage (contenu de l'API)](/fr-CA/reference/system/xstore/xstore_members)
  * Fonctions
    * [XPackageGetCurrentProcessPackageIdentifier](/fr-CA/reference/system/xstore/xstore_members)
    * [XPackageEnumeratePackages](/fr-CA/reference/system/xstore/xstore_members)
    * [XPackageCreateInstallationMonitor](/fr-CA/reference/system/xstore/xstore_members)

## Voir aussi

[Vue d'ensemble du commerce](/fr-CA/publishing/xstore-commerce/xstore-commerce-overview)

[Activation du développement et des tests XStore](/fr-CA/publishing/xstore-commerce/xstore-product-testing-setup)

Meilleures pratiques pour les mises à jour de contenu

Création, examen et test des mises à jour de contenu

[Référence de l'API XStore](/fr-CA/reference/system/xstore/xstore_members)


## Related topics

- [Exigences XBOX testées lors de la certification pour les jeux sur console XBOX](/fr/publishing/certification/console-cert-tested-requirements.md)
- [Exigences XBOX pour les jeux XBOX](/fr-CA/publishing/certification/xbox-requirements.md)
- [XBOX Requirements pour les jeux XBOX](/fr/publishing/certification/xbox-requirements.md)
- [Terminologie](/fr/publishing/certification/console-cert-terminology.md)
- [XBOX Rapid Updates](/fr/publishing/game-publishing/concepts/certification/xbox-rapid-updates.md)
