Обновление приложений, опубликованных в Store, с помощью кода

Начиная с Windows 10 версии 1607 (сборка 14393), Windows 10 позволяет разработчикам создавать более надежные гарантии вокруг обновлений приложений из Магазина. Это требует нескольких простых API, создает согласованный и предсказуемый пользовательский интерфейс и позволяет разработчикам сосредоточиться на том, что они делают лучше, позволяя Windows делать тяжелый подъем.

Существует два основных способа управления обновлениями приложений. В обоих случаях чистый результат для этих методов одинаков — применяется обновление. Однако в одном случае можно разрешить системе выполнять все действия, а в другом случае вам может потребоваться более глубокий уровень контроля над взаимодействием с пользователем.

Простые обновления

Прежде всего, это очень простой вызов API, который сообщает системе проверка обновлений, скачайте их, а затем запросите разрешение от пользователя на установку. Начните с класса StoreContext , чтобы получить объекты StorePackageUpdate , скачать и установить их.

using Windows.Services.Store;

private async void GetEasyUpdates()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation = 
            updateManager.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);
        StorePackageUpdateResult result = await downloadOperation.AsTask();
    }
}

На этом этапе пользователь может выбрать два варианта: применить обновление сейчас или отложить обновление. Любой выбор, который пользователь делает, будет возвращен StorePackageUpdateResult через объект, позволяющий разработчикам выполнять дальнейшие действия, такие как закрытие приложения, если обновление необходимо продолжить или просто повторить попытку позже.

Управляемые обновления

Для разработчиков, которые хотят иметь полностью настраиваемый интерфейс, предоставляются дополнительные API, которые обеспечивают более широкий контроль над процессом обновления. Платформа позволяет выполнять следующие действия:

  • Получение событий хода выполнения при загрузке отдельного пакета или в целом обновлении.
  • Примените обновления к удобствам пользователя и приложения, а не к одному или другому.

Разработчики могут скачать обновления в фоновом режиме (в то время как приложение используется), а затем запросить обновления установки пользователя, если они отклонятся, вы можете просто отключить возможности, затронутые обновлением при выборе.

Скачивание обновлений

private async void DownloadUpdatesAsync()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
            updateManager.RequestDownloadStorePackageUpdatesAsync(updates);

        downloadOperation.Progress = async (asyncInfo, progress) =>
        {
            // Show progress UI
        };

        StorePackageUpdateResult result = await downloadOperation.AsTask();
        if (result.OverallState == StorePackageUpdateState.Completed)
        {
            // Update was downloaded, add logic to request install
        }
    }
}

Установка обновлений

private async void InstallUpdatesAsync()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();    

    // Save app state here

    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> installOperation =
        updateManager.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

    StorePackageUpdateResult result = await installOperation.AsTask();

    // Under normal circumstances, app will terminate here

    // Handle error cases here using StorePackageUpdateResult from above
}

Обязательное обновление

В некоторых случаях может потребоваться обновление, которое должно быть установлено на устройстве пользователя, что делает его действительно обязательным (например, критическое исправление для приложения, которое не может ждать). В этих случаях существуют дополнительные меры, которые можно предпринять, чтобы сделать обновление обязательным.

  1. Реализуйте логику обязательного обновления в коде приложения (необходимо выполнить перед обязательным обновлением).
  2. Во время отправки в Центр разработки убедитесь, что выбран флажок "Сделать это обновление обязательным".

Реализация кода приложения

Чтобы воспользоваться полными преимуществами обязательных обновлений, необходимо внести некоторые незначительные изменения в приведенный выше код. Чтобы определить, является ли обновление обязательным, необходимо использовать объект StorePackageUpdate.

 private async bool CheckForMandatoryUpdates()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        foreach (StorePackageUpdate u in updates)
        {
            if (u.Mandatory)
                return true;
        }
    }
    return false;
}

Затем необходимо создать настраиваемый в диалоговом окне приложения, чтобы сообщить пользователю, что есть обязательное обновление и что он должен установить его для продолжения полного использования приложения. Если пользователь отклонит обновление, приложение может либо снизить функциональные возможности (например, запретить доступ через Интернет) либо полностью завершить (например, игры только в Интернете).

Центр партнеров

Чтобы в StorePackageUpdate отображалось значение true для обязательного обновления, необходимо пометить обновление как обязательное в Центре партнеров на странице "Пакеты".

Несколько вещей, которые следует отметить:

  • Если устройство возвращается в режим "в сети" после того, как обязательное обновление было заменено другим необязательным обновлением, оно по-прежнему будет отображаться на устройстве как обязательное, учитывая пропущенное обновление, прежде чем оно было обязательным.
  • Управляемые разработчиком обновления и обязательные обновления в настоящее время ограничены Магазином.