2017-08-03 14 views
2

私は古いバージョンのWindows 10で利用できないいくつかの機能を使用するUWPアプリケーションで作業しています。したがって、Creators Updateがインストールされているかどうかを確認する必要があります。WACKテストが失敗するのを防ぐために、UWPアプリケーションでWindows 10 OSのバージョンを確認するにはどうすればよいですか?

AnalyticsInfo.VersionInfoを使用してアプリにバージョンチェックコードがあります。しかし、WACKテストの最新のラウンドは、次の失敗を与えた:

が見つかり プラットフォームのバージョンの発売 •エラーFAILED:高OSのバージョンの検証を以下の エラーを検出:

oはアプリの停止に失敗しましたAppName.group.mbb。

o Company.AppName_2.3.56045.0_x64__cx08jceyq9bcpアプリは、 プラットフォームバージョンの起動テストに失敗しました。

•修正されていない場合の影響:アプリケーションは、OSに固有の機能を提供するために、バージョン情報を に使用しないでください。

•修正方法:推奨される方法を使用して、OSの 機能を確認してください。詳細については、下のリンクを参照してください。 オペレーティングシステムのバージョン

私はthis questionを認識していますが、可能であれば、失敗を修正します。 私は今、このコードを持ってUWPアプリ「バージョン適応」here.

を作成する方法についてのMSDN上のアドバイスを見つけた:

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

を、私はそれが私のためにtrueを返すコードをテストしています。 –

+0

おかげさまでビジェイ。なぜ私はそれがいつも私に偽を与えたのか分かりません。 –

答えて

5

はたぶん少しヘルパークラスを試してみてください?これを呼び出すことはコストがかかるので、これを一度実行してデータをキャッシュすることをお勧めします。

更新:あなたはWindowsの組成APIを使用している場合は、ユーザーのデバイスやOSの状態に基づいてエフェクトのオンとオフを切り替えるためにそれらを使用することができますよう、あなたはAreEffectsFast and AreEffectsSupportedが参考になる私は公開するには、以下のクラスを拡張してきました。それらを2つの新しいプロパティとして表示します。)

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.csで右OnWindowCreatedた後、それを呼び出し、クラスを初期化します。

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; 

あなたはより多くの情報のためにも、デバイスモデル、DeviceManufacturerなど

のような他のシステム情報を取得することができ、これを使用する:SystemInformation

+0

ソースを確認すると、実際には@ Blueの答えが使用されています。 –

+0

@JustinXL私はこのコードをテストしました。 WACKテストに合格しました。 –

+0

WACKテストにも合格したAnalyticsInfo.VersionInfoを使用してコードを作成しました。しかし、失敗のエラーメッセージは、特にWindows.Foundation.Metadata.ApiInformationを使用するように指示します。私はこの失敗がなぜ起こったのか、なぜこのエラーでWACKテストに失敗したにもかかわらず、自分のアプリがWindows Storeで受け入れられたと他のポスターが言った理由を理解していません。私は自分のコードをできるだけ安全にしようとしています。 –

関連する問題