Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Při odesílání aplikace jako MSIX můžete programově spustit aktualizaci aplikace. Pokud nasadíte aplikaci mimo Store, stačí jen zkontrolovat, jestli váš server nemá novou verzi aplikace, a nainstalovat novou verzi. Způsob instalace aktualizace závisí na tom, jestli nasazujete balíček aplikace pomocí souboru Instalační služby aplikací nebo ne. Aby bylo možné použít aktualizace z kódu, musí balíček aplikace deklarovat packageManagement schopnost. Mějte na paměti, že to je nutné pro scénář mezi vydavateli, a přitom správa vlastní aplikace by měla fungovat, aniž by bylo nutné deklarovat tuto schopnost.
Tento článek obsahuje příklady, které ukazují, jak deklarovat funkci v manifestu balíčku packageManagement a jak provést aktualizaci z vašeho kódu. V první části se dozvíte, jak to udělat, pokud používáte soubor Instalační služby aplikací, a druhá část se zabývá tím, jak to udělat, když nepoužíváte soubor Instalační služby aplikace. V poslední části se dozvíte, jak zajistit restartování aplikace po instalaci aktualizace.
Přidání funkce PackageManagement do manifestu balíčku
Pokud chcete používat PackageManager rozhraní API, musí vaše aplikace deklarovat packageManagementomezenou schopnost v manifestu balíčku.
<Package>
...
<Capabilities>
<rescap:Capability Name="packageManagement" />
</Capabilities>
...
</Package>
Aktualizace balíčků nasazených pomocí souboru instalačního programu aplikace
Pokud nasazujete aplikaci pomocí souboru Instalační služba aplikací, musí všechny aktualizace řízené kódem, které provedete, používat rozhraní API souborů Instalační služby aplikací. Tím zajistíte, že vaše běžné aktualizace souborů instalačního programu aplikací budou i nadále fungovat. Pro iniciování aktualizace založené na instalačním programu aplikace z kódu můžete použít PackageManager.AddPackageByAppInstallerFileAsync nebo PackageManager.RequestAddPackageByAppInstallerFileAsync. Pomocí rozhraní API Package.CheckUpdateAvailabilityAsync můžete zkontrolovat, jestli je k dispozici aktualizace. Níže je příklad kódu:
using Windows.Management.Deployment;
public async void CheckForAppInstallerUpdatesAndLaunchAsync(string targetPackageFullName, PackageVolume packageVolume)
{
// Get the current app's package for the current user.
PackageManager pm = new PackageManager();
Package package = pm.FindPackageForUser(string.Empty, targetPackageFullName);
PackageUpdateAvailabilityResult result = await package.CheckUpdateAvailabilityAsync();
switch (result.Availability)
{
case PackageUpdateAvailability.Available:
case PackageUpdateAvailability.Required:
//Queue up the update and close the current instance
await pm.AddPackageByAppInstallerFileAsync(
new Uri("https://trial3.azurewebsites.net/HRApp/HRApp.appinstaller"),
AddPackageByAppInstallerOptions.ForceApplicationShutdown,
packageVolume);
break;
case PackageUpdateAvailability.NoUpdates:
// Close AppInstaller.
await ConsolidateAppInstallerView();
break;
case PackageUpdateAvailability.Unknown:
default:
// Log and ignore error.
Logger.Log($"No update information associated with app {targetPackageFullName}");
// Launch target app and close AppInstaller.
await ConsolidateAppInstallerView();
break;
}
}
Aktualizace balíčků nasazených bez souboru instalačního programu aplikace
Vyhledání aktualizací na serveru
Pokud k nasazení balíčku aplikace nepoužíváte soubor Instalační služby aplikací, prvním krokem je přímo zkontrolovat, jestli je k dispozici nová verze vaší aplikace. Následující příklad zkontroluje, jestli je verze balíčku na serveru větší než aktuální verze aplikace (tento příklad odkazuje na testovací server pro demonstrační účely).
using Windows.Management.Deployment;
//check for an update on my server
private async void CheckUpdate(object sender, TappedRoutedEventArgs e)
{
WebClient client = new WebClient();
Stream stream = client.OpenRead("https://trial3.azurewebsites.net/HRApp/Version.txt");
StreamReader reader = new StreamReader(stream);
var newVersion = new Version(await reader.ReadToEndAsync());
Package package = Package.Current;
PackageVersion packageVersion = package.Id.Version;
var currentVersion = new Version(string.Format("{0}.{1}.{2}.{3}", packageVersion.Major, packageVersion.Minor, packageVersion.Build, packageVersion.Revision));
//compare package versions
if (newVersion.CompareTo(currentVersion) > 0)
{
var messageDialog = new MessageDialog("Found an update.");
messageDialog.Commands.Add(new UICommand(
"Update",
new UICommandInvokedHandler(this.CommandInvokedHandler)));
messageDialog.Commands.Add(new UICommand(
"Close",
new UICommandInvokedHandler(this.CommandInvokedHandler)));
messageDialog.DefaultCommandIndex = 0;
messageDialog.CancelCommandIndex = 1;
await messageDialog.ShowAsync();
} else
{
var messageDialog = new MessageDialog("Did not find an update.");
await messageDialog.ShowAsync();
}
}
Poznámka:
Představuje targetPackageFileName úplný název zabalené aplikace. (Příklad: Contoso.HeadTrax_1.0.0.0_x64__PublisherHash)
Instalace aktualizace
Jakmile zjistíte, že je aktualizace dostupná, můžete ji zařadit do fronty ke stažení a instalaci pomocí rozhraní AddPackageAsync API. Měla by také fungovat instalace volitelného balíčku, pokud už je na zařízení nainstalovaný hlavní balíček. Aktualizace se použije při příštím vypnutí aplikace. Po restartování aplikace bude nová verze uživateli k dispozici. Níže je příklad kódu:
// Queue up the update and close the current app instance.
private async void CommandInvokedHandler(IUICommand command)
{
if (command.Label == "Update")
{
PackageManager packagemanager = new PackageManager();
await packagemanager.AddPackageAsync(
new Uri("https://trial3.azurewebsites.net/HRApp/HRApp.msix"),
null,
AddPackageOptions.ForceApplicationShutdown
);
}
}
Automatické restartování aplikace po aktualizaci
Pokud je vaše aplikace UWP aplikace, předání AddPackageByAppInstallerOptions.ForceApplicationShutdown NEBO AddPackageOptions.ForceTargetAppShutdown při instalaci aktualizace by mělo naplánovat restartování aplikace po jejím vypnutí a aktualizaci. Pro aplikace bez UPW musíte před instalací aktualizace volat RegisterApplicationRestart .
Než se aplikace začne vypínat, musíte volat RegisterApplicationRestart. Níže je příklad použití služeb vzájemné spolupráce k volání nativní metody v jazyce C#:
// Register the active instance of an application for restart in your Update method
uint res = RelaunchHelper.RegisterApplicationRestart(null, RelaunchHelper.RestartFlags.NONE);
Příklad pomocné třídy pro volání nativní metody RegisterApplicationRestart v jazyce C#:
using System;
using System.Runtime.InteropServices;
namespace MyEmployees.Helpers
{
class RelaunchHelper
{
#region Restart Manager Methods
/// <summary>
/// Registers the active instance of an application for restart.
/// </summary>
/// <param name="pwzCommandLine">
/// A pointer to a Unicode string that specifies the command-line arguments for the application when it is restarted.
/// The maximum size of the command line that you can specify is RESTART_MAX_CMD_LINE characters. Do not include the name of the executable
/// in the command line; this function adds it for you.
/// If this parameter is NULL or an empty string, the previously registered command line is removed. If the argument contains spaces,
/// use quotes around the argument.
/// </param>
/// <param name="dwFlags">One of the options specified in RestartFlags</param>
/// <returns>
/// This function returns S_OK on success or one of the following error codes:
/// E_FAIL for internal error.
/// E_INVALIDARG if rhe specified command line is too long.
/// </returns>
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern uint RegisterApplicationRestart(string pwzCommandLine, RestartFlags dwFlags);
#endregion Restart Manager Methods
#region Restart Manager Enums
/// <summary>
/// Flags for the RegisterApplicationRestart function
/// </summary>
[Flags]
internal enum RestartFlags
{
/// <summary>None of the options below.</summary>
NONE = 0,
/// <summary>Do not restart the process if it terminates due to an unhandled exception.</summary>
RESTART_NO_CRASH = 1,
/// <summary>Do not restart the process if it terminates due to the application not responding.</summary>
RESTART_NO_HANG = 2,
/// <summary>Do not restart the process if it terminates due to the installation of an update.</summary>
RESTART_NO_PATCH = 4,
/// <summary>Do not restart the process if the computer is restarted as the result of an update.</summary>
RESTART_NO_REBOOT = 8
}
#endregion Restart Manager Enums
}
}