Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Amikor MSIX-ként szállítja az alkalmazást, programozott módon elindíthatja az alkalmazás frissítését. Ha az alkalmazást az Áruházon kívül helyezi üzembe, mindössze annyit kell tennie, hogy ellenőrzi a kiszolgálót, hogy van-e az alkalmazás új verziója, és telepítse az új verziót. A frissítés alkalmazásának módjától függ, hogy az alkalmazáscsomagot app Installer-fájllal telepíti-e. A kódból származó frissítések alkalmazásához az alkalmazáscsomagnak deklarálnia kell a packageManagement képességet. Vegye figyelembe, hogy ez a közzétevők közötti forgatókönyvekhez szükséges, de a saját alkalmazás kezelésének anélkül kell működnie, hogy deklarálnia kellene a képességet.
Ez a cikk példákat tartalmaz, amelyek bemutatják, hogyan deklarálhatja a packageManagement csomagjegyzékben található képességet, és hogyan alkalmazhat frissítést a kódból. Az első szakasz azt vizsgálja, hogyan teheti ezt meg, ha az App Installer-fájlt használja, a második szakasz pedig arról szól, hogyan teheti meg, ha nem használja az App Installer-fájlt. Az utolsó szakasz azt vizsgálja, hogyan biztosítható, hogy az alkalmazás újrainduljon a frissítés alkalmazása után.
Adja hozzá a PackageManagement képességet a csomagjegyzékhez
Az PackageManager API-k használatához az alkalmazásnak deklarálnia kell a packageManagementkorlátozott képességet a csomagjegyzékben.
<Package>
...
<Capabilities>
<rescap:Capability Name="packageManagement" />
</Capabilities>
...
</Package>
App Installer-fájllal üzembe helyezett csomagok frissítése
Ha az alkalmazást az App Installer-fájl használatával telepíti, a végrehajtott kódvezérelt frissítéseknek az App Installer fájl API-jait kell használniuk. Ezzel biztosítja, hogy a rendszeres App Installer-fájlfrissítések továbbra is működjenek. Az App Installer-alapú frissítés kódból való initimizálásához használja a PackageManager.AddPackageByAppInstallerFileAsync vagy a PackageManager.RequestAddPackageByAppInstallerFileAsync parancsot. Ellenőrizheti, hogy elérhető-e frissítés a Package.CheckUpdateAvailabilityAsync API-val. Az alábbi példakód:
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;
}
}
App Installer-fájl nélkül üzembe helyezett csomagok frissítése
Frissítések keresése a kiszolgálón
Ha nem az App Installer-fájlt használja az alkalmazáscsomag üzembe helyezéséhez, az első lépés az, hogy közvetlenül ellenőrizze, hogy elérhető-e az alkalmazás új verziója. Az alábbi példa ellenőrzi, hogy a csomag verziója nagyobb-e, mint az alkalmazás jelenlegi verziója (ez a példa egy tesztelési kiszolgálóra hivatkozik bemutató céljából).
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();
}
}
Megjegyzés:
Ez targetPackageFileName a csomagolt alkalmazás teljes nevét képviseli. (Példa: Contoso.HeadTrax_1.0.0.0_x64__PublisherHash)
A frissítés alkalmazása
Miután megállapította, hogy elérhető egy frissítés, az AddPackageAsync API használatával várhatja le és telepítheti. Lehetségesnek kell lennie az opcionális csomag telepítésének, amennyiben a fő csomag már telepítve van az eszközön. A frissítés az alkalmazás következő leállításakor lesz alkalmazva. Az alkalmazás újraindítása után az új verzió elérhetővé válik a felhasználó számára. Az alábbi példakód:
// 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
);
}
}
Az alkalmazás automatikus újraindítása frissítés után
Ha az alkalmazás UWP-alkalmazás, az AddPackageByAppInstallerOptions.ForceApplicationShutdown VAGY Az AddPackageOptions.ForceTargetAppShutdown alkalmazással történő frissítéskor az alkalmazásnak a leállítás + frissítés után újra kell indulnia. Nem UWP-alkalmazások esetén a frissítés alkalmazása előtt meg kell hívnia a RegisterApplicationRestartot .
Az alkalmazás leállítása előtt meg kell hívnia a RegisterApplicationRestartot. Az alábbiakban egy példa látható arra, hogy interop-szolgáltatások használatával hívja meg a Natív metódust a C#-ban:
// Register the active instance of an application for restart in your Update method
uint res = RelaunchHelper.RegisterApplicationRestart(null, RelaunchHelper.RestartFlags.NONE);
Példa a natív RegisterApplicationRestart metódus C#-ban való meghívására szolgáló segédosztályra:
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
}
}