UWP技术问询:如何以编程方式读取Package.appxmanifest中的Windows协议值
在UWP中编程读取AppManifest的协议扩展值
我之前刚好做过类似的需求,UWP里其实不用手动去解析AppManifest的XML文件,系统提供了专门的API来安全访问清单内容,非常方便。
读取当前应用的协议扩展
核心思路是利用Windows.ApplicationModel.Package类获取当前应用的包信息,然后遍历扩展列表筛选出协议类型的项,再读取对应的属性值。
下面是完整的C#代码示例:
using Windows.ApplicationModel; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public async Task<List<string>> GetCurrentAppProtocolSchemesAsync() { var protocolSchemes = new List<string>(); // 获取当前应用的包实例 var currentPackage = Package.Current; // 遍历应用的所有扩展 var allExtensions = currentPackage.Applications.SelectMany(app => app.Extensions); foreach (var extension in allExtensions) { // 筛选出协议类型的扩展(Kind为windows.protocol) if (extension.Kind.Equals("windows.protocol")) { // 读取协议的Scheme名称 var scheme = extension.Properties["Name"] as string; if (!string.IsNullOrWhiteSpace(scheme)) { protocolSchemes.Add(scheme); } // 若需要读取DisplayName等其他属性,可直接访问Properties对应键值 // var displayName = extension.Properties["DisplayName"] as string; } } return protocolSchemes; }
读取其他应用的协议扩展
如果你需要读取其他已安装应用的协议扩展,就需要用到PackageManager类,不过要注意在清单中声明packageQuery权限。代码示例如下:
using Windows.Management.Deployment; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public async Task<List<string>> GetOtherAppProtocolSchemesAsync(string packageFamilyName) { var protocolSchemes = new List<string>(); var packageManager = new PackageManager(); // 根据包家族名查找目标应用包 var targetPackage = packageManager.FindPackagesForUser(string.Empty, packageFamilyName).FirstOrDefault(); if (targetPackage != null) { var allExtensions = targetPackage.Applications.SelectMany(app => app.Extensions); foreach (var extension in allExtensions) { if (extension.Kind.Equals("windows.protocol")) { var scheme = extension.Properties["Name"] as string; if (!string.IsNullOrWhiteSpace(scheme)) { protocolSchemes.Add(scheme); } } } } return protocolSchemes; }
注意事项
- 访问当前应用的清单信息不需要额外权限,直接调用即可。
- 访问其他应用的清单时,必须在
Package.appxmanifest中添加packageQuery权限(在“功能”选项卡中勾选“包查询”)。 - 如果需要更底层的XML操作,可以访问
extension.ExtensionXml属性获取扩展的XML节点,但一般使用Properties就能满足大部分需求。
内容的提问来源于stack exchange,提问作者theNoob
相关产品推荐
相关产品推荐

