-
Notifications
You must be signed in to change notification settings - Fork 432
Add API support matrix for packaging configurations #6236
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,143 @@ | ||
| # Windows App SDK API Support Matrix | ||
|
|
||
| This document provides a centralized reference showing which Windows App SDK APIs | ||
| are supported under each packaging and configuration combination. | ||
|
|
||
| ## Legend | ||
|
|
||
| | Symbol | Meaning | | ||
| |--------|---------| | ||
| | Y | Fully supported | | ||
| | N | Not supported | | ||
| | P | Partial support (see Notes) | | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. SUGGESTION: Change 'P' to as a reference to a footnote after the table e.g. | API | Packaged | Unpackaged | Self-Contained | Notes |
|
||
|
|
||
| ## Packaging and Configuration Combinations | ||
|
|
||
| | Combination | Description | | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| |-------------|-------------| | ||
| | **Packaged (MSIX)** | App deployed via MSIX Desktop Bridge with full package identity | | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Packaged Remove the (MSIX).
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm puzzled over this whole table. Rows 1+2 are orthogonal to 3+4. Let's start with the 1st row, **Packaged (MSIX)". Ignoring the "(MSIX)" part is redundant and misleading, the description for the phrase "Packaged" is incorrect and misleading.
There are many ways you can distribute and install and ultimately get a running process with package identity. Additionally, "MSIX Desktop Bridge" aka "Desktop Bridge" aka "packagedClassicApp" aka "Centennial app" isn't the only form of a running process with package identity. If you specify For another example, a packaged Service, specified via desktop6:Service in appxmanifest.xml also produces a running process with package identity and is equally a "Packaged" process, despite no There's also Packaged processes you get by running some non-MSIX installer to install classic unpackaged software and registered a package with a External Location pointing to that classic unpackaged software so when Packaged vs Unpackaged is already well defined at https://learn.microsoft.com/windows/apps/package-and-deploy/packaging/#packaged-vs-unpackaged-apps and is all about if a running process HAS or LACKS package identity in its process token. Rows 3+4 are an entirely independent concept - the form of the Windows App Runtime consumed by a process:
A more convenient set of lingo is If I make a packaged application using
If MyAwesomeApp is packaged but using
* Saying 'Framework-Dependent' or |
||
| | **Unpackaged** | App deployed without MSIX packaging, no package identity | | ||
| | **Self-Contained** | App bundles the WinAppSDK runtime, no framework package dependency | | ||
| | **Framework-Dependent** | App depends on the WinAppSDK framework package being installed | | ||
|
|
||
| ## App Notifications | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `AppNotificationManager.Register()` | Y | Y | Y | Packaged: uses manifest CLSID. Unpackaged: registers caller process as COM server | | ||
| | `AppNotificationManager.Register(String, Uri)` | N | Y | Y | Unpackaged only. Allows custom display name and icon | | ||
| | `AppNotificationManager.Show()` | Y | Y | Y | | | ||
| | `AppNotificationManager.GetAllAsync()` | Y | Y | Y | | | ||
| | `AppNotificationManager.RemoveAllAsync()` | Y | Y | Y | | | ||
| | `AppNotificationManager.Setting` | Y | Y | Y | `DisabledByManifest` status only applies to packaged apps | | ||
| | Image protocols in notifications | Y (ms-appx) | P (file:// only) | P (file:// only) | Unpackaged apps cannot use ms-appx:// protocol | | ||
|
|
||
| ## Push Notifications | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `PushNotificationManager.CreateChannelAsync()` | Y | Y | P | Self-contained may not support push due to API limitations | | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This (and other entries in this table) say 'P' but no explanation what it means |
||
| | `PushNotificationManager.Register()` | Y | Y | P | Unpackaged requires bootstrapper initialization | | ||
| | `PushNotificationManager.Unregister()` | Y | Y | P | | | ||
| | Raw push notifications | Y | Y | P | | | ||
| | Visual cloud toasts | Y | Y | P | | | ||
|
|
||
| ## App Lifecycle | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `AppInstance.GetCurrent()` | Y | Y | Y | | | ||
| | `AppInstance.FindOrRegisterForKey()` | Y | Y | Y | | | ||
| | `AppInstance.Restart()` | Y | Y | Y | | | ||
| | `AppInstance.GetActivatedEventArgs()` | Y | Y | Y | | | ||
| | `ActivationRegistrationManager` | Y | Y | Y | Registration mechanisms differ by app type | | ||
|
|
||
| ## MRT Core (Resources) | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `ResourceLoader` | Y | Y | Y | Unpackaged: loads from `[module].pri` or `resources.pri` | | ||
| | `ResourceManager` | Y | Y | Y | | | ||
| | `ApplicationLanguages.PrimaryLanguageOverride` | Y | Y | Y | Packaged: persisted across sessions. Unpackaged: process-lifetime only | | ||
| | `ApplicationLanguages.ManifestLanguages` | Y | N | N | Requires package manifest; returns empty list for unpackaged | | ||
|
|
||
| ## Application Data | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `ApplicationData.GetDefault()` | Y | N | N | Requires package identity | | ||
| | `ApplicationData.GetForUnpackaged()` | N | Y | Y | Unpackaged apps only | | ||
|
|
||
| ## Deployment | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `DeploymentManager.GetStatus()` | Y | Y | Y | | | ||
| | `DeploymentManager.Initialize()` | Y | Y | N | Not needed for self-contained | | ||
| | Bootstrap API (`MddBootstrapInitialize`) | N/A | Y | N/A | Framework-dependent unpackaged apps only | | ||
|
|
||
| ## Windowing | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `AppWindow` | Y | Y | Y | | | ||
| | `DisplayArea` | Y | Y | Y | | | ||
| | Placement APIs (experimental) | Y | Y | Y | Requires WinAppSDK 2.0 Experimental | | ||
|
|
||
| ## Version Info | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `ReleaseInfo` | Y | Y | Y | Available since WinAppSDK 1.8 stable | | ||
| | `RuntimeInfo` | Y | Y | Y | Available since WinAppSDK 1.8 stable | | ||
|
|
||
| ## Named Object Security | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `GetSecurityDescriptorForAppContainerNames` | Y | Y | Y | Primarily useful for sharing between packaged and Win32 processes | | ||
|
|
||
| ## Storage Pickers (Experimental) | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | `FolderPicker` | Y | Y | Y | WinAppSDK pickers support both packaged and unpackaged | | ||
| | `FileOpenPicker` | Y | Y | Y | | | ||
| | `FileSavePicker` | Y | Y | Y | | | ||
|
|
||
| ## Windows Copilot Runtime (WCR) | ||
|
|
||
| | API | Packaged | Unpackaged | Self-Contained | Notes | | ||
| |-----|----------|-----------|----------------|-------| | ||
| | Phi Silica / LanguageModel | Y | Y | N | Requires Copilot+ hardware; x64/ARM64 only (no x86) | | ||
| | ImageDescriptionGenerator | Y | Y | N | Requires Copilot+ hardware | | ||
| | TextRecognizer | Y | Y | N | Requires Copilot+ hardware | | ||
| | ImageSuperResolution | Y | Y | N | Requires Copilot+ hardware | | ||
|
|
||
| ## Key Considerations | ||
|
|
||
| ### Packaged vs Unpackaged | ||
|
|
||
| - **Packaged apps** have a package identity, which enables features like | ||
| ms-appx:// URI scheme, ApplicationData.GetDefault(), manifest-based | ||
| notification registration, and ManifestLanguages. | ||
| - **Unpackaged apps** must use alternative registration paths and cannot rely | ||
| on package identity. Some APIs provide unpackaged-specific alternatives | ||
| (e.g., `ApplicationData.GetForUnpackaged()`). | ||
|
|
||
| ### Self-Contained vs Framework-Dependent | ||
|
|
||
| - **Self-contained** apps bundle the WinAppSDK runtime and do not need the | ||
| framework package installed. However, some APIs that depend on framework | ||
| package services (Push Notifications, WCR) may have limited support. | ||
| - **Framework-dependent** apps require the WinAppSDK framework package to be | ||
| installed on the target machine. All APIs are available when the correct | ||
| framework version is present. | ||
|
|
||
| ### Minimum OS Version | ||
|
|
||
| - Windows App SDK generally requires Windows 10 version 1809 (build 17763) | ||
| or later. | ||
| - Some features require newer Windows versions. Check the individual API | ||
| documentation for specific version requirements. | ||
| - WCR features require Windows 11 with Copilot+ capable hardware. | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is problematic and increasingly so over time.
For one, only a fraction of feature areas are mentioned. I see nothing about Decimal, Dynamic Dependencies, Environment Manager, OAuth, Package Management, Runtime Compatibility or more.
For another, the level of detail is partial and asymmetric. For example, the Application Data table lists 2 of the 4 static methods and none of the instance methods. Nor is there any relation to apicontract version - 1 of the static methods mentioned is v2, the other and the others not mentioned are v1.
Furthermore, the standard is all Windows App SDK APIs are required to work on all supported platforms and in support supported configurations, unless exceptional justifications apply.
If you're seeking to ensure clear documentation of what is and isn't available, across all platforms and configurations, you'd be better off refocusing this document on the exceptions. That's a much smaller, tractable and maintainable list, and provides more value to the reader (just the exceptions, not cluttered with the far more numerous 'normal'/everywhere cases).
For example: