2017-08-03 158 views
2

我正在使用一些UWP應用程序,該應用程序使用的某些功能在舊版本的Windows 10中不可用。因此,我需要檢查是否安裝了創作者更新。如何在UWP應用程序中檢查Windows 10操作系統版本以消除WACK測試失敗?

使用AnalyticsInfo.VersionInfo在應用程序中有版本檢查代碼。然而,最新一輪的WACK試驗給出以下故障:

失敗 平臺版本推出 •發現錯誤:高OS版本驗證檢測以下 錯誤:

Ø無法停止的應用程序AppName.group.mbb。

o應用程序Company.AppName_2.3.56045.0_x64__cx08jceyq9bcp失敗 平臺版本啓動測試。

•影響如果不是固定的:應用程序不應該使用版本信息到 提供特定於OS的功能。

•如何解決:請使用推薦的方法檢查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。

我的代碼有什麼問題?
是否有更好的功能來檢查,知道是否安裝了創作者更新?

更新: 我按照上述失敗的Microsoft準則,並將版本檢查從AnalyticsInfo.VersionInfo更改爲Windows.Foundation.Metadata.ApiInformation。該應用程序仍然無法通過相同錯誤的WACK測試。

2ND更新:
將Windows10更新到創建者更新,生成16251.0後,此錯誤消失在我的電腦上。

+0

我已經測試你的代碼,這對我來說返回true。 –

+0

謝謝維傑。我不知道爲什麼它總是給我虛假的。 –

回答

5

也許有點輔助類也是這樣嗎?請注意,調用此代碼可能代價高昂,因此建議您只執行一次並緩存數據。

更新:如果使用的Windows構成API,你會發現AreEffectsFast and AreEffectsSupported有益,因爲你可以用它們來切換基於用戶的設備和操作系統環境上的影響和關閉我已經延長下面的類暴露。他們是兩個新的屬性。)

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 
} 

初始化類,調用它在你的App.xaml.csOnWindowCreated之後。

protected override void OnWindowCreated(WindowCreatedEventArgs args) 
{ 
    BuildInfo.RetrieveBuildInfo(); 

要使用它,只需調用UWPCommunityToolkit

if (BuildInfo.Build == Build.Anniversary) { ... } 

if (BuildInfo.BeforeCreatorsUpdate) { ... } 

if (BuildInfo.AreEffectsFast) { ... } 
+0

謝謝!我想試試這個。對於單個方法使用IsMethodPresent,你覺得這是一個非首發嗎? –

+0

我通常只是** F12 **的方法,並檢查其api合同編號,以獲得它運行的構建,並沒有特別使用這樣的個別檢查。但隨意添加它在同一個助手類。規則只是你只想做一次檢查。 –

+0

我必須爲企業支持不同的Windows版本,是的,我們只檢查一次! –

0

試試這個

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}"; 
+0

正如我在問題中所說,這段代碼似乎導致WACK測試失敗。 –

2

使用SystemInformation助手。在使用之前安裝Microsoft.Toolkit.Uwp Nuget包。

public OSVersion OperatingSystemVersion => SystemInformation.OperatingSystemVersion; 

使用這個你可以得到其他系統的信息也很喜歡DeviceModel,DeviceManufacturer等

欲瞭解更多信息:SystemInformation

+0

如果你檢查它的來源,它實際上是使用@藍色的答案,但下面。 –

+0

@JustinXL我測試過這段代碼。它成功通過了WACK測試。 –

+0

儘管我們已經使用了已通過WACK測試的AnalyticsInfo.VersionInfo的代碼。但是,失敗的錯誤消息明確告訴您使用Windows.Foundation.Metadata.ApiInformation。我不明白爲什麼這個失敗來來去去,或者爲什麼另一個海報說他們的應用程序在Windows應用商店被接受,儘管WACK測試不通過這個錯誤。我只是儘可能讓我的代碼儘可能安全。 –

相關問題