DEV Community

Muhammad Azeez
Muhammad Azeez

Posted on • Edited on • Originally published at mazeez.dev

Enabling automatic updates for sideloaded UWP apps

Recently we wanted to enable auto-updates for an app that we were developing for a client. The app is developed in UWP and it's sideloaded into the client's computers. Although Microsoft has added an auto-update functionality in the 1803 build of Windows, we had a few issues with it:

  • It was not very reliable
  • We didn't have much control over it beside a simple auto-update policy that specified how often it should check for updates.
  • Troubleshooting was very hard as there were no clear way to find out why the auto-updater was not working properly.

So I found an article from 2016 and decided to improve upon it and put it a nuget package. The library is open-source and is available on GitHub.

How to use

  1. First, configure the IIS server and create a web app. You can also take a look at the sample web app.
  2. Install the nuget package: Dwrandaz.AutoUpdateComponent in the UWP app.
  3. Set minimum version of the app to 1803
  4. Open the package manifest .appmanifest file of the main app and declare an app service:
    • Name: The default values is Dwrandaz.AutoUpdate. However, you can change it to any name you like but you should note that this name is important and it should be passed to AutoUpdateManager.TryToUpdateAsync if you don't use the default name.
    • Entry point: Dwrandaz.AutoUpdateComponent.UpdateTask
  5. Right click on the package manifest .appmanifest file and click on View Code.
  6. Add this namespace declaration: xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  7. Add rescap to the IgnorableNamespaces, for example: IgnorableNamespaces="uap mp rescap"
  8. Inside the Package tag, make sure these elements exist:
<Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="packageManagement" />
</Capabilities>

For more information, take a look at the sample apps manifest file.

  1. Example usage:
var path = "http://localhost:5000/install/AwesomeApp.appinstaller";
var info = await AutoUpdateManager.CheckForUpdatesAsync(path);
if (!info.Succeeded)
{
    // There was an error in getting the update information from the server
    // use info.ErrorMessage to get the error message
    return;
}

if (!info.ShouldUpdate)
{
    // The app is already up-to-date :)
    return;
}

// You can use info.MainBundleVersion to get the update version

var result = await AutoUpdateManager.TryToUpdateAsync(info);
if (!result.Succeeded)
{
    // There was an error in updating the app
    // use result.ErrorMessage to get the error message
    return;
}

// Success! The app was updated, it will restart soon!

For more infromation take a look at the Sample app.

Creating update packages

  1. Make sure you select the Release configuration
  2. Right click on the main app project and click Store > Create App Packages...
  3. Select I want to create packages for sideloading.And check the Enable automatic updates checkbox
  4. Click on Next
  5. Check the Automatically Incremenent checkbox under version.
  6. Select Always under Generate App bundle
  7. Click on Next
  8. Write the update location path and Select Check every 1 Week or more so that the native auto-update mechanism doesn't mess with our auto-update mechanism.
  9. Click on Create
  10. Upload the .appinstaller, .index.html and the package folder to the web app in the path that was used in AutoUpdateManager.CheckForUpdatesAsync.

Top comments (2)

Collapse
 
frogslegs profile image
FrogsLegs

Hi Muhammad, first off great article and thank you for packaging this into a NuGet package. I'm going to take a look at this tonight as we're facing similar issues with the auto-updater from 1803.

Quick question, did you manage to test this out in Assigned Access (Kiosk) mode?

Collapse
 
mhmd_azeez profile image
Muhammad Azeez

I have not tested it myself, but someone else did. The app would crash in Assigned Access mode if the app checked for updates at startup, they found out that introducing a little bit of delay fixed the problem.