Ressourcenpakete

Ressourcenpakete bieten eine hervorragende Möglichkeit, den Speicherplatzbedarf für Benutzer zu reduzieren, indem Sie die Sprache segmentieren oder bestimmte Ressourcen in separate Pakete skalieren, die automatisch von Windows je nach Computerkonfiguration des Benutzers heruntergeladen werden. Wenn der Benutzer der Liste der Betriebssystemsprachen in Region & Spracheinstellungen eine neue Sprache hinzufügt oder die Anzeigekonfiguration ändert, ruft das Betriebssystem über ein automatisches Speicherupdate die entsprechenden Ressourcenpakete für alle installierten Apps auf dem Gerät ab.

In Windows SDK 10.0.17095.0 ermöglicht die AddResourcePackageAsync-API Entwicklern die Installation eines Ressourcenpakets für eine App bei Bedarf.

Verwenden der AddResourcePackageAsync-API

  • AddResourcePackageAsync übernimmt den PackageFamilyName der Anwendung und die Ressourcen-ID, die das Ressourcenpaket eindeutig identifiziert, das heruntergeladen werden soll. Die Ressourcen-ID entspricht dem ResourceId-Element im AppxManifest.xml des Ressourcenpakets.

  • Die Anwendung muss neu gestartet werden, um eine zusammengeführte Ansicht aller Ressourcen zu erhalten, die für die Anwendung verfügbar sind. Die API bietet die ForceTargetApplicationShutdown-Option, die übergeben werden kann, um die Anwendung neu zu starten.

  • Wenn beim Herunterladen des Ressourcenpakets ein Update für die Anwendung verfügbar ist, schlägt die API fehl, da die ältere Version der App nicht mehr verfügbar ist. Durch Übergeben des ApplyUpdateIfAvailable-Flags aktualisiert die API die App und erhält das angeforderte Ressourcenpaket im Rahmen desselben Downloads.

  • Die API gibt einen Fortschritt für den Download zurück, der in der Anwendung angezeigt werden kann. Beachten Sie außerdem, dass für Apps, die im Store veröffentlicht werden, der Ressourcenpaketerwerb auf der Seite "Downloads und Updates" Microsoft Store und als Update für Ihre Anwendung angezeigt wird. Der Endbenutzer kann den Download des Ressourcenpakets aus dem Microsoft Store anhalten oder abbrechen.

Beispiel

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

Überprüfung

Für die lokale Überprüfung können Entwickler eine MSIXBUNDLE- oder APPXBUNDLE-Datei erstellen und über Ihr lokales Laufwerk, Ihre Netzwerkfreigabe oder Ihren Webserver installieren. Wenn die App die AddResourcePackageAsync-API aufruft, ruft Windows das Ressourcenpaket vom Speicherort ab, an dem die ursprüngliche Anwendung installiert wurde. Dies vereinfacht die Überprüfung. Sobald dies funktioniert, kann die App bereitgestellt werden.

Entfernen von Ressourcenpaketen

Die App kann entfernen, um die Ressourcenpakete zu entfernen, die sie über die RemoveResourcePackageAsync-APIheruntergeladen hat. Ressourcenpakete, die für den Benutzer oder das Gerät als Ganzes gelten, können jedoch nicht deinstalliert werden.

Beispiel

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