Would it be possible for the MSIX team to upgrade the "force app to shutdown" implementation? I noticed that when Windows shut downs an app so it can be upgraded (when AddPackageByAppInstallerOptions::ForceTargetAppShutdown is specified) there is a pause that's always exactly 30 seconds in length. It feels like rather than poll to find out when the app shutdown has finished and the package is no longer in use, whoever wrote this code just whacked the moral equivalent of a Thread.sleep(30_000) in there or something. It's quite an ugly UX as a consequence because the user is simply left waiting. The installs do complete, so it's not technically a bug, but it seems kinda disrespectful to make the user stare at a progress bar for 30 seconds.
And yes, I have submitted a feedback hub entry about this - https://aka.ms/AAhkqj7 - complete with screen recording so hopefully you can see what I mean (this install uses a custom UI but it's the AppInstaller API behind the scenes).
I've solved this for now by simply shutting the app down myself without relying on the force shutdown flag anymore, before invoking the custom UI I have that wraps the PackageManager API. Then it's all very nice and snappy.