Pacotes de recursos

Os pacotes de recursos oferecem uma ótima maneira de reduzir o espaço em disco dos usuários segmentando o idioma ou dimensionando o ativo específico em pacotes separados que são baixados automaticamente pelo Windows dependendo da configuração do computador dos usuários. Se o usuário adiciona um novo idioma à sua lista de idiomas do sistema operacional em Configurações de idioma da região ou altera a & configuração de exibição, em uma atualização automática do armazenamento, o sistema operacional buscará pacotes de recursos aplicáveis para todos os aplicativos instalados no dispositivo.

No Windows SDK 10.0.17095.0 AddResourcePackageAsync API permite que os desenvolvedores instalem um pacote de recursos para um aplicativo sob demanda.

Como usar a API AddResourcePackageAsync

  • AddResourcePackageAsync utiliza o PackageFamilyName do aplicativo e a ID do recurso que identifica exclusivamente o pacote de recursos que está tentando baixar. A ID do recurso corresponde ao elemento ResourceId noAppxManifest.xml do pacote de recursos.

  • O aplicativo deve ser reiniciado para obter uma exibição mesclada de todos os recursos que estão disponíveis para o aplicativo. A API oferece a opção ForceTargetApplicationShutdown que pode passar para reiniciar o aplicativo.

  • Se houver uma atualização disponível para o aplicativo quando o pacote de recursos estiver sendo baixado, a API falhará, pois a versão mais antiga do aplicativo não está mais disponível. Ao passar o sinalizador ApplyUpdateIfAvailable , a API atualizará o aplicativo, bem como obterá o pacote de recursos solicitado como parte do mesmo download.

  • A API retorna um progresso para o download que pode ser exibido no aplicativo. Observe também que, para aplicativos publicados na loja, a aquisição do pacote de recursos aparece na página Microsoft Store downloads e atualizações e aparece como uma atualização para seu aplicativo. O usuário final pode optar por pausar ou cancelar o download do pacote de recursos do Microsoft Store.

Exemplo

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

Validação

Para validação local, os desenvolvedores podem criar um .msixbundle ou .appxbundle e instalar da unidade local, do compartilhamento de rede ou do servidor Web. Quando o aplicativo chama a API AddResourcePackageAsync, Windows adquirirá o pacote de recursos do local em que o aplicativo original foi instalado. Isso torna a validação simples. Quando isso funcionar, o aplicativo estará pronto para ser implantado.

Removendo pacotes de recursos

O aplicativo pode optar por remover para remover os pacotes de recursos baixados por meio da API RemoveResourcePackageAsync. No entanto, pacotes de recursos aplicáveis ao usuário ou ao dispositivo como um todo não podem ser desinstalados.

Exemplo

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