我正在开发一个UWP应用程序,它使用了旧版Windows 10中无法使用的一些功能。因此,我需要检查是否安装了Creators Update。
使用AnalyticsInfo.VersionInfo在应用程序中有版本检查代码。然而,最新一轮的WACK测试给出了以下失败:
FAILED 平台版本发布 •发现错误:高操作系统版本验证检测到以下内容 错误:
o无法停止应用AppName.group.mbb。
o应用公司.AppName_2.3.56045.0_x64__cx08jceyq9bcp失败 平台版本启动测试。
•影响如果不修复:应用程序不应使用版本信息 提供特定于OS的功能。
•如何修复:请使用推荐的方法检查可用的方法 操作系统中的功能。有关更多信息,请参阅以下链接。 操作系统版本
我知道this question,但如果可能的话,宁愿修复失败。 我在MSDN上找到了关于如何制作UWP应用程序"版本自适应" here.
我现在有了这段代码:
using Windows.Foundation.Metadata;
if (ApiInformation.IsMethodPresent("Windows.Networking.Connectivity.ConnectionProfile", "GetNetworkUsageAsync"))
{
//do stuff
}
我的Windows版本是1703 15063.483,并且GetNetworkUsageAsync在代码中的其他位置成功使用。但是对IsMethodPresent的调用总是返回false。
我的代码有什么问题?
还有更好的功能可以检查,知道是否安装了Creators Update?
更新: 我遵循Microsoft针对上述失败的指导原则,并将版本检查从AnalyticsInfo.VersionInfo更改为Windows.Foundation.Metadata.ApiInformation。该应用程序仍然无法通过WACK测试失败,并出现同样的错误。
2ND更新:
将Windows10更新为Creators Update,Build 16251.0后,此错误在我的计算机上消失。
答案 0 :(得分:9)
也许这样的帮助类?注意调用它可能代价很高,因此建议一次执行此操作并缓存数据。
(更新:如果您使用 Windows Composition API ,您会发现AreEffectsFast
and AreEffectsSupported
非常有用,因为您可以根据用户使用它们来打开和关闭效果#39;设备和操作系统条件。我已经扩展了下面的类,将它们作为两个新属性公开。)
public class BuildInfo
{
private static BuildInfo _buildInfo;
private BuildInfo()
{
if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 5))
{
Build = Build.FallCreators;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 4))
{
Build = Build.Creators;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 3))
{
Build = Build.Anniversary;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 2))
{
Build = Build.Threshold2;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 1))
{
Build = Build.Threshold1;
}
else
{
Build = Build.Unknown;
}
if (!BeforeCreatorsUpdate)
{
var capabilities = CompositionCapabilities.GetForCurrentView();
capabilities.Changed += (s, e) => UpdateCapabilities(capabilities);
UpdateCapabilities(capabilities);
}
void UpdateCapabilities(CompositionCapabilities capabilities)
{
AreEffectsSupported = capabilities.AreEffectsSupported();
AreEffectsFast = capabilities.AreEffectsFast();
}
}
public static Build Build { get; private set; }
public static bool AreEffectsFast { get; private set; }
public static bool AreEffectsSupported { get; private set; }
public static bool BeforeCreatorsUpdate => Build < Build.Creators;
public static BuildInfo RetrieveApiInfo() => _buildInfo ?? (_buildInfo = new BuildInfo());
}
public enum Build
{
Unknown = 0,
Threshold1 = 1507, // 10240
Threshold2 = 1511, // 10586
Anniversary = 1607, // 14393 Redstone 1
Creators = 1703, // 15063 Redstone 2
FallCreators = 1709 // 16299 Redstone 3
}
要初始化课程,请在OnWindowCreated
App.xaml.cs
之后立即拨打电话。
protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
BuildInfo.RetrieveBuildInfo();
要使用它,只需致电
if (BuildInfo.Build == Build.Anniversary) { ... }
if (BuildInfo.BeforeCreatorsUpdate) { ... }
if (BuildInfo.AreEffectsFast) { ... }
答案 1 :(得分:2)
试试这个
string deviceFamilyVersion= AnalyticsInfo.VersionInfo.DeviceFamilyVersion;
ulong version = ulong.Parse(deviceFamilyVersion);
ulong major = (version & 0xFFFF000000000000L) >> 48;
ulong minor = (version & 0x0000FFFF00000000L) >> 32;
ulong build = (version & 0x00000000FFFF0000L) >> 16;
ulong revision = (version & 0x000000000000FFFFL);
var osVersion = $"{major}.{minor}.{build}.{revision}";
来源:
答案 2 :(得分:2)
使用UWPCommunityToolkit的SystemInformation Helper。在使用之前安装Microsoft.Toolkit.Uwp Nuget包。
public OSVersion OperatingSystemVersion => SystemInformation.OperatingSystemVersion;
使用此功能,您可以获得其他系统信息,如DeviceModel,DeviceManufacturer等
了解更多信息:SystemInformation