拡張 SDK でのプログラミング

Windows 10 によってユニバーサル Windows プラットフォーム (UWP) アプリがさまざまなクラスのデバイスを最も効果的にターゲットにする方法を理解するために、このトピックでは次の概念について説明します。

  • デバイス ファミリ
  • 拡張 SDK
  • API コントラクト

また、プログラミングでそれらを使用する方法についても説明します。

ビデオ— UWP とデバイスファミリの概要

 

デバイスファミリとアプリのターゲットデバイスファミリ

デバイス ファミリに基づいて、デバイスのクラス全体で想定できる API、システム特性、動作を特定します。

device families

デバイスファミリは、オペレーティングシステム (OS) の基礎となります。 たとえば、Pc やタブレットは、デスクトップ版の OS を実行し、デスクトップデバイスファミリに基づいています。 Iot デバイスは、iot デバイスファミリに基づく OS の IoT エディションを実行します。

各子デバイスファミリは、ユニバーサルデバイスファミリから継承する Api に独自の Api を追加します。 結果として得られる、子デバイスファミリ内の Api の統合は、そのデバイスファミリに基づく OS に存在することが保証されます。そのため、その OS を実行するすべてのデバイスで使用されます。

アプリが 対象 とするデバイスファミリ (またはファミリ) についての決定は、お客様が行うものです。 この決定はこれらの重要な点でアプリに影響します。 これは、

  • Microsoft Store からインストールするためにアプリに用意されているデバイスファミリ (およびアプリの UI を設計するときに考慮する必要があるフォームファクター)
  • アプリを実行しているデバイス (ホストデバイス) に存在することに依存できる Api の特定のセット。

存在すること に依存することにより、これらの api は、ホストデバイスに存在するかどうかを確認するために最初にテストする必要がなく、呼び出すことができます。 対象となるデバイスファミリは、(異なるデバイスファミリについて異なる保証を保証する) を提供します。

ターゲットデバイスファミリを構成する

アプリケーションパッケージのマニフェストソースファイル ( Package.appxmanifest ファイル) では、 TargetDeviceFamily 要素に Name 属性があります。 この属性の値は、アプリが対象とするデバイスファミリの名前です。 有効な値は次のとおりです。

  • Windows.Desktop
  • Windows.Holographic
  • Windows.IoT
  • Windows.Mobile
  • Windows.Team
  • Windows.Universal
  • Windows.Xbox

既定では、UWP アプリはユニバーサルデバイスファミリを対象としています (つまり、 TargetDeviceFamilyに対して指定 Windows.Universal Microsoft Visual Studio)。 これは、アプリをすべての Windows 10 デバイスにインストールできることと、ホストデバイス上に存在する大規模なコアの api セットに依存できることを意味します。 のようなアプリでは、さまざまなデバイスで実行できるため、高度にアダプティブな UI と包括的な入力機能が必要です。 このトピックで後述 する「さまざまな画面サイズでの UI のプレビュー 」を参照してください。

Microsoft Store からインストールするためにアプリが提供するデバイスのファミリを制限する場合は、デスクトップデバイスファミリ ( Windows.Desktop )、IoT デバイスファミリ ( Windows.IoT ) など、別のデバイスファミリをターゲットにすることを選択できます。 もちろん、アプリをホストできるデバイスの数は限られていますが、これらのデバイスに存在する多数の Api セット (ユニバーサルデバイスファミリのセットとターゲットデバイスファミリのセット) に依存することができますが、 通常、このようなアプリは適度に適応している必要があります。UI と入力機能は、特定の種類のデバイスでのみ実行できるため、多少特殊化されている場合があります。

ヒント

しかし、両方の長所を活用することもできます。 すべての Windows 10 デバイスで実行するようにアプリを構成することができます。また、実行中のデバイスが見つかった場合は、特定のファミリのデバイスの特殊な機能にアクセスすることもできます。 この2つの優れたシナリオでは、少し余分な作業が必要です。このトピックの後半で説明します。

ターゲットデバイスファミリのバージョンを構成する

api は時間の経過と共に Windows に追加されます。そのため、デバイスファミリを選択する別のディメンションでは、ターゲットにするバージョン (またはバージョン) を決定します。 Visual Studio の一部のプロジェクトの種類には、ターゲットプラットフォームのバージョンを構成できるプロパティページがあります。 ただし、すべてのプロジェクトの種類では、プロジェクトファイルでターゲットプラットフォームのバージョンを構成できます。

関連するプロパティをプロジェクトファイルに表示する例を次に示します。

<!-- MyProject.Xxxproj -->
<PropertyGroup Label="Globals">
    ...
    <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
    <WindowsTargetPlatformMinVersion>10.0.17134.0</WindowsTargetPlatformMinVersion>
    ...
</PropertyGroup>

ビルド時に、これらの値 (から Package.appxmanifestTargetDeviceFamily@Nameの値と共に) が、プロジェクトの出力フォルダーに生成されるファイルに AppxManifest.xml コピーされます。 次に例を示します。

<!-- AppxManifest.xml -->
<Dependencies>
    <TargetDeviceFamily Name="Windows.Universal"
        MaxVersionTested="10.0.19041.0"
        MinVersion="10.0.17134.0" />
    ...
</Dependencies>

Maxversiontested では、アプリが対象としているデバイスファミリの最大バージョンを指定します。 および MinVersion は、アプリが対象としているデバイスファミリの最小バージョンを指定します。 詳細については、「 TargetDeviceFamily」を参照してください。

重要

これらのバージョン番号は、Visual Studio プロジェクトのプロパティページか、プロジェクトファイルのwindowstargetplatformversionwindowstargetplatformversionの値によって構成する必要があります。 ビルドによってそのファイルが上書きされるので、編集 AppxManifest.xml しないでください。 また、アプリケーションパッケージマニフェストソースファイル ( Package.appxmanifest ファイル) 内の TargetDeviceFamily 要素のMinVersionおよびmaxversiontested属性を編集しないでください。これらの値は無視されるためです。

拡張機能 Sdk とその参照方法

Visual Studio プロジェクトで、ターゲットをユニバーサルデバイスファミリから他のデバイスファミリに変更する場合は、そのデバイスファミリに対応する拡張 SDK への参照を追加する必要があります。 これにより、そのデバイスファミリ内の Api をプロジェクトで使用できるようになります。

たとえば、IoT デバイスファミリを対象としている場合は (ソリューションエクスプローラーでプロジェクトノードを選択)、[参照> の追加] をクリックProject> ます。ユニバーサル Windows>拡張機能。 UWP 用の適切なバージョンのWindows IoT Extensionsを選択します。 たとえば、呼び出す最新の IoT API がバージョン10.0.17134.0 で導入された場合、そのバージョンを選択します。

Select the IoT extension SDK

これは、プロジェクトファイルで参照がどのように表示されるかを示しています。

<ItemGroup>
    <SDKReference Include="WindowsIoT, Version=10.0.17134.0" />
</ItemGroup>

名前とバージョン番号は、SDK がインストールされている場所にあるフォルダーと一致します。 たとえば、上記の情報はという名前のフォルダーに一致します。

\Program Files (x86)\Windows Kits\10\Extension SDKs\WindowsIoT\10.0.17134.0

その他の拡張 sdk には、uwp 用のWindows デスクトップ拡張機能 Windows、uwp 用のモバイル拡張機能uwp 用の Windows チーム拡張機能が含まれています。

ユニバーサルデバイスファミリを対象とするアプリを使用したままにした場合でも、1つ以上の拡張機能 Sdk への参照を追加できます。 呼び出しの対象となる追加の Api が含まれている拡張 Sdk を参照します。 ユニバーサルデバイスファミリを対象としているので、これらの Api のみを 使用できます 。 参照した拡張 SDK の Api については、実行時にホストデバイス上に存在することをテストする必要があります (このトピックで後述する「 コードの記述 」を参照してください)。 もちろん、このテストをユニバーサルデバイスファミリの Api に対して実行する必要はありません。 これは、前のセクションで説明した、最も優れたシナリオです。

拡張 SDK を使用すると、特定のデバイスファミリに固有の Api を対象にすることができ、それによって特殊な機能にアクセスできます。 これは、対応するデバイスファミリをターゲットにするかどうかにかかわらず、行うことができます。

API コントラクトとそれらを確認する方法

デバイスファミリ内の Api は、API コントラクトと呼ばれるグループに分割されます。 新しいバージョンのデバイスファミリがリリースされると、その新しいバージョンは基本的に、そのデバイスファミリに属するすべての API コントラクトの新しいバージョンのコレクションだけを表します。

たとえば、という名前 Windows.Foundation.UniversalApiContract の API コントラクトは、ユニバーサルデバイスファミリのバージョン10.0.17134.0 に付属していた場合、バージョン6.0 になりました。 しかし、同じデバイスファミリのバージョン10.0.19041.0 に同梱されていた同じコントラクトはバージョン10.0 でした。

WinRT API の API コントラクトを参照する

特定の Windows ランタイム api の api コントラクト名とバージョン番号を検索する方法を見てみましょう。 このトピックで後述する「 コードの記述 」では、その情報を使用する理由と方法について説明します。

最初の例として、 Storagefolder. TryGetChangeTracker メソッドを取得します。 このトピックの「 Windows 10 の要件」セクションでは、 storagefolder. trygetchangetrackerは、の Windows.Foundation.UniversalApiContract バージョン6.0 で初めて導入されました。

次に、 TryGetItemAsync メソッドのトピックを見てみましょう。 このトピックにはWindows 10 の要件はありません。 代わりに、 Storagefolder クラス自体のトピックを参照してください。 「 Windows 10 の要件」セクションに回答があります。 TryGetItemAsyncトピックは異なるものとは言えないため、その親クラスとの要件を共有することになります。 そのため、 TryGetItemAsync は、の Windows.Foundation.UniversalApiContract バージョン1.0 で初めて導入されました。

ターゲットにするデバイスファミリを選択する方法

ここでは、対象とするデバイスファミリを決定する際に役立ついくつかの考慮事項について説明します。 詳細については、「 TargetDeviceFamily」を参照してください。

アプリのリーチを最大限に活用

アプリを使用してデバイスの最大範囲を達成し、その結果、可能な限り多くのデバイスで実行されるようにするには、アプリがユニバーサルデバイスファミリを対象にする必要があります。 具体的には、前述のように、ユニバーサルデバイスファミリのさまざまなバージョンを対象とします。

アプリを1つの種類のデバイスに制限する

アプリをさまざまなデバイス フォーム ファクターで実行したくない場合があります。デスクトップ PC や Xbox コンソールに特化している可能性があります。 その場合は、子デバイス ファミリの 1 つを対象にすることもできます。

アプリを、考えられるすべてのデバイスのサブセットに制限する

ユニバーサル デバイス ファミリをターゲットにしたり、子デバイス ファミリの 1 つをターゲットにしたりするのではなく、2 つ (または複数の) 子デバイス ファミリをターゲットにできます。 デスクトップとモバイルをターゲットに設定すると、アプリに意味がある場合があります。 または、デスクトップとチーム。 または、Desktop、Mobile、Team などです。

デバイス ファミリの特定のバージョンのサポートを除外する

まれに、特定のバージョンの特定のデバイス ファミリを持つデバイスを除くすべての場所でアプリを実行したい場合があります。 たとえば、アプリがユニバーサル デバイス ファミリのバージョン 10.0.x.0 を対象とするとします。 将来、オペレーティング システムのバージョンが 10.0.x.2 に変更された場合、アプリをユニバーサルの 10.0.x.0 と Xbox の 10.0.x.2 にターゲット設定することで、Xbox のバージョン 10.0.x.1 を除くすべての場所でアプリを実行するように指定できます。 その後、アプリは Xbox 10.0.x.1 以前のデバイス ファミリのバージョンのセットでは使用できなくなります。

コードの記述

コードの多くが、すべてのデバイスで同じように実行されるという意味で汎用的になります。 ただし、特定のデバイス ファミリに合わせて調整されたコードの場合は、アダプティブ コードを使用するオプションがあります。 これらの異なるケースについて考えしましょう。

ターゲット デバイス ファミリによって実装されている API を呼び出す

UWP アプリで API を呼び出す場合は常に、アプリがターゲットとするデバイス ファミリによって API が実装されているかどうかを知る必要があります。 Visual Studio IntelliSense には、ユニバーサル デバイス ファミリの API と、参照した拡張機能 SDK で使用できる API が表示されます。

API Windows ランタイムドキュメントでは、API が含まれるデバイス ファミリを示します。 Windows ランタイム API の API リファレンス トピックを参照し、Windows 10 の要件セクションを探す場合は、実装しているデバイス ファミリと、その API が最初に表示されるデバイス ファミリのバージョンが表示されます。 [要件] Windows 10がない場合は、メンバーの所有クラスを確認し、このセクションの「Windows 10 の要件」セクションの情報を参照してください。 その情報は、メンバーにも適用されます。

ターゲット デバイス ファミリによって実装されていない API を呼び出す

参照した拡張機能 SDK で API を呼び出したいが、その API がターゲットとするデバイス ファミリの一部ではない場合があります。

たとえば、ユニバーサル デバイス ファミリをターゲットにしている場合でも、アプリがデスクトップ デバイスで実行されている場合は常に呼び出すデスクトップ API があります。

または、アプリでデバイス ファミリの初期バージョンがサポートされている場合がありますが、呼び出す API は、同じデバイス ファミリの最新バージョンでのみ使用できます。

このような場合は、これらの API を安全に呼び出すアダプティブ コードを記述することを選択できます。 次のセクションでは、その方法について説明します。

ApiInformation を使用してアダプティブ コードを記述する

アダプティブ コードを使用して条件付きで API を呼び出す場合は、2 つの手順が必要です。 最初の手順では、API をプロジェクトで使用できます。 これを行うには、API を所有するデバイス ファミリを表す拡張 SDK への参照を追加します。

2 番目の手順では、コード内の条件で ApiInformation クラスを使用して、呼び出す API の存在をテストします。 この条件は、アプリが実行される場所とたびに評価されます。 ただし、API が存在 true し、そのため呼び出し可能なデバイスでのみ に評価されます。

ほんの数の API を呼び出す場合は、 次のように ApiInformation.IsTypePresent メソッドを使用できます。

// Cache the value, instead of querying it multiple times.
bool isHardwareButtonsAPIPresent =
    Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons");

if (isHardwareButtonsAPIPresent)
{
    Windows.Phone.UI.Input.HardwareButtons.CameraPressed += HardwareButtons_CameraPressed;
}

この場合、 HardwareButtons クラスが存在すると 、CameraPressed イベントが存在する可能性があります。これは、クラスとメンバーの要件情報が同じなのでです。 ただし、時間内に、新しいメンバーが既に導入されているクラスに追加され、それらのメンバーは後でバージョン番号 導入されます。 このような場合、IsTypePresent を使う代わりに、IsEventPresentIsMethodPresentIsPropertyPresent、および同様のメソッドを使って個々のメンバーの存在をテストすることができます。 次に例を示します。

bool isHardwareButtons_CameraPressedAPIPresent =
    Windows.Foundation.Metadata.ApiInformation.IsEventPresent
        ("Windows.Phone.UI.Input.HardwareButtons", "CameraPressed");

ご存知のように、デバイス ファミリ内の API のセットは、API コントラクトと呼ばれるサブディビジョンにさらに分割されます。 API コントラクトの存在をテストするには、ApiInformation.IsApiContractPresent メソッドを使うことができます。 これは、1 つの条件を効率的に実行して、すべてが同じバージョンの API コントラクトに属する多数の API の存在または存在を知る効率的な方法です。

最初に関心のある API を導入した API コントラクトを決定する方法については、このトピックの前の「 WinRT API の API コントラクトを参照する」セクションを参照してください。

その情報を取得したら、アダプティブ コードにプラグインできます。 たとえば、API Windows.Devices.Scanners.ScannerDeviceContractコントラクトの名前が で、そのメジャー バージョン番号とマイナー バージョン番号がそれぞれ 1 と 0 の場合、条件は次の例のようになります。

bool isWindows_Devices_Scanners_ScannerDeviceContract_1_0Present =
    Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent
        ("Windows.Devices.Scanners.ScannerDeviceContract", 1, 0);

さまざまな画面サイズで UI をプレビューする

アプリのリーチを最大化することをお勧めします。 ただし、1 種類のデバイス フォーム ファクターのみを対象とする場合でも、アプリが表示される可能性がある画面のサイズが異なる可能性があります。

アプリがどのように表示され、特定のサイズの画面にレイアウトされるのか確認する準備ができたら、Visual Studio のデバイス プレビュー ツール バーを使用して、小規模または中規模のモバイル デバイス、PC、または大きなテレビ画面で UI をプレビューします。 そうすることで、XAML のアダプティブ レイアウト機能を使用した場合 (「チュートリアル : アダプティブ レイアウトを作成する」を参照)、それをテストできます。

visual studio 2015 device preview toolbar

サポートするデバイスの種類ごとに事前に決定する必要はない。 プロジェクトには、いつでもデバイス のサイズを追加できます。

関連項目