Пакеты ресурсов

Пакеты ресурсов предлагают отличный способ сократить объем дисков пользователей путем сегментирования языка или масштабирования конкретного ресурса в отдельные пакеты, которые автоматически загружаются Windows в зависимости от конфигурации компьютера пользователей. Если пользователь добавляет новый язык в список языков ОС в параметрах региона и языка или изменяет конфигурацию дисплея в автоматическом обновлении хранилища, ос будет получить применимые пакеты ресурсов для всех установленных приложений на устройстве.

В Windows SDK 10.0.17095.0 AddResourcePackageAsync API позволяет разработчикам устанавливать пакет ресурсов для приложения по запросу.

Использование API AddResourcePackageAsync

  • AddResourcePackageAsync принимает PackageFamilyName приложения и идентификатор ресурса, который однозначно идентифицирует пакет ресурсов, который пытается скачать. Идентификатор ресурса соответствует элементу ResourceId в AppxManifest.xml пакета ресурсов.

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

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

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

Пример

 private async void DownloadGermanResourcePackage(object sender, RoutedEventArgs e)
{            
    // ResourceId that is unique to the resource package
    string resourceId = "split.language-de";
    // Warn user that application will need to restart.
    // To take update if available pass in the ApplyUpdateIfAvailable flag
    var packageCatalog = PackageCatalog.OpenForCurrentPackage();
    PackageCatalogAddResourcePackageResult result = await packageCatalog.AddResourcePackageAsync("29270depappf.CaffeMacchiato_gah1vdar1nn7a", resourceId, 
        AddResourcePackageOptions.ApplyUpdateIfAvailable | AddResourcePackageOptions.ForceTargetApplicationShutdown)
        .AsTask<PackageCatalogAddResourcePackageResult, PackageInstallProgress>(new Progress
        (progress =>;
        {
                // Draw progress
        }));

        if (result.ExtendedError != null)
        {
                //Display error or retry if needed
        }
}

Проверка

Для локальной проверки разработчики могут создать msixbundle или appxbundle и установить его на локальном диске, сетевом ресурсе или веб-сервере. Когда приложение вызывает API AddResourcePackageAsync, Windows получит пакет ресурсов из расположения, в котором было установлено исходное приложение. Это упрощает проверку. После работы приложение будет готово к развертыванию.

Удаление пакетов ресурсов

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

Пример

 private async void RemoveResourcePackage(object sender, RoutedEventArgs e)
{            
    var packageCatalog = PackageCatalog.OpenForCurrentPackage();
    List resourcePackagesToRemove = new List();
    resourcePackagesToRemove.Add("split.language-de");
    //Warn user that application will be restarted
    var removePackageResult = await packageCatalog.RemoveResourcePackagesAsync(resourcePackagesToRemove);
    if (removePackageResult.ExtendedError != null)
    {
        // display error
    }
}