資源套件

資源套件提供一個絕佳的方式,可藉由分割語言或調整特定資產,將特定資產分割成 Windows 根據使用者電腦設定自動下載的個別套件,來減少使用者的磁碟使用量。 如果使用者在地區和語言設定中將新語言新增至其操作系統語言清單,或變更顯示組態,則操作系統會針對裝置上所有已安裝的應用程式擷取適用的資源套件。

在 Windows SDK 10.0.17095.0 AddResourcePackageAsync API 中,可讓開發人員視需要安裝應用程式的資源套件。

如何使用 AddResourcePackageAsync API

  • AddResourcePackageAsync 會取得 應用程式的 PackageFamilyName ,以及可唯一識別嘗試下載之資源套件的資源標識碼。 資源標識符會對應至資源套件之 AppxManifest.xml 中的 ResourceId 元素。

  • 應用程式必須重新啟動,才能取得應用程式可用之所有資源的合併檢視。 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
    }
}