リソース パッケージ

リソース パッケージを利用すると、ユーザーのマシン構成に応じて、言語やスケールに固有の資産を個別のパッケージに分割して、Windows で自動的にダウンロードすることにより、ユーザーのディスク使用量を減らすことができます。 ユーザーが [地域の言語] 設定で、OS 言語の一覧に新しい言語を追加したり、表示構成を変更したりすると、OS はストアの自動更新全体で、デバイスにインストールされているすべてのアプリに対して適用可能なリソース パッケージをフェッチします。

Windows SDK 10.0.17095.0 で AddResourcePackageAsync API を使用すると、開発者は必要に応じてアプリに対応したリソース パッケージをインストールできます。

AddResourcePackageAsync API の使用方法

  • AddResourcePackageAsync は、アプリケーションの PackageFamilyName と、ダウンロードしようとしているリソース パッケージを一意に識別するリソース ID を取得します。 リソース ID は、リソース パッケージの AppxManifest.xmlResourceId 要素に対応します。

  • アプリケーションで使用可能なすべてのリソースがマージされたビューを取得するには、アプリケーションを再起動する必要があります。 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 を作成し、ローカル ドライブ、ネットワーク共有、または Web サーバーからインストールできます。 アプリが AddResourcePackageAsync API を呼び出すと、Windows は元のアプリケーションがインストールされていた場所からリソース パッケージを取得します。 これにより、検証が単純になります。 これが正常に完了すると、アプリをデプロイする準備が整います。

リソース パッケージの削除

アプリでは、RemoveResourcePackageAsync API を使用してダウンロードしたリソース パッケージを削除することを選択できます。 ただし、ユーザーまたはデバイス全体に適用できるリソース パッケージをアンインストールすることはできません。

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