Web server doesn't support HTTP Range requests¶
Windows installs MSIX packages incrementally using the Windows Background Intelligent Transfer Service. This requires the web server to advertise support for byte range HTTP requests. Almost all web servers do, but watch out for these exceptions:
- The Python built in web server. Consider using
- AWS S3 when using the default static serving endpoint, which looks like
https://bucketname.s3-website-us-east-1.amazonaws.com/package.msix. Use the object URL that ends in
https://bucketname.s3.amazonaws.com/package.msix). For unclear reasons, Amazon don't advertise the
Accept-Range: bytesheader when using the first form.
Where to store files¶
Windows apps installed with Conveyor (MSIX) run inside an app container that prevents modification of the program's installed files. It also prevents listing of the
c:\Program Files\WindowsApps directory where apps are located. To view the installed program files in Explorer and get other useful packaging related features, grab MSIX Hero. Then select your package and use the toolbar to open an Explorer inside the right directory.
Also make sure your app follows these rules:
- Store transient files like logs and cached data in the directory pointed to by the
- Store important files that should be backed up and follow the user around, but removed on uninstallation, in the directory pointed to by the
APPDATAenvironment variable. On networked Windows computers things stored here will be copied to local storage when the user logs in, so apps can run offline.
- Store user created files that should not be removed even if the user uninstalls, like work the user has created, in the user's home directory. You can get this by reading the
user.homesystem property or (when packaged) the
HOMEenvironment variable. Don't create dot-folders here, if you're tempted to hide files from the user then probably means you should be storing those files in
Always use the environment variables
Windows programs you start from your app that aren't a part of your package will not run inside the same container. As a consequence, if you pass redirected
AppData file paths to them the other program won't be able to find those files, as it's not running in the same filesystem namespace. Using the value of the
LOCALAPPDATA environment variables will fix this, because they'll be set to the targets of the redirects and the targets are visible to all programs.
Windows discards stdout/stderr by default, even when an app is run from the command line. When
app.windows.console = true running the app will either use the terminal you started it from, or cause a console window to open, so you can see the output.
"The application has experienced an internal error and must quit."¶
This error dialog from JVM apps on Windows indicates that an exception escaped the main method. The first lines of the exception are in the message box and the full stack trace is printed to
stdout. You won't be able to see that by default due to the way Windows separates CLI and GUI apps. See println debugging above for how to view the full stack trace.
If you get errors about missing runtime Visual C++ runtime DLLs you may need to bundle them with your app.
PowerShell error about missing AppX modules¶
PowerShell 7 isn't backwards compatible with PowerShell 6 (a.k.a. "Windows PowerShell"). When self-signing, the
install.ps1 scripts must
be run from the default PowerShell that comes with Windows. This issue is planned to be worked around in a future Conveyor release.
My HSM PIN has expired¶
Some CAs configure their HSMs to require frequent passphrase changes. If you're using a hardware device to hold your signing key and get a message about "PIN expiry" then you need to follow the instructions found in the HSM section of the docs to change your HSM passphrase and then also your software passphrase. They must be kept aligned.
Old versions of Windows have a caching bug that will cause install/update failure if you change the size of a file in your download/update site. Conveyor puts version numbers into file names and ensures the size of the
.appinstaller file is constant, but if you change your package without changing the version number you may encounter install failures. Conveyor will error out if you try this, but you can override that error and if you do this problem may occur.
The workaround is to always ensure you change your version number for any new upload, even whilst testing. Alternatively you can reboot Windows to clear the buggy cache.