Windows 8.1 における Microsoft Store デバイス アプリのデバイスの同期と更新
Windows 8.1 では、UWP アプリは、デバイス バックグラウンド タスクを使用して、周辺機器上のデータを同期できます。 アプリがデバイス メタデータに関連付けられている場合、その UWP デバイス アプリは、デバイス バック グラウンド エージェントを使用して、ファームウェアの更新などのデバイスの更新を実行することもできます。 デバイスのバックグラウンド エージェントには、ユーザーの同意を確保したり、デバイスの同期時と更新時にバッテリ寿命の維持に役立ったりするポリシーが適用されます。
デバイスの同期と更新の操作を実行するには、DeviceUseTrigger と DeviceServicingTrigger を使用するデバイスのバックグラウンド タスクをそれぞれ作成します。 カスタム USB デバイスのサンプルでこれを実施する方法については、「デバイス バックグラウンド タスクの作成」を参照してください。
Note
Windows ランタイム デバイス API には、メタデータは必要ありません。 つまり、UWP デバイス アプリでなくても、アプリでそうした API を使用できるということです。 UWP アプリはこれらの API を使用して、USB、ヒューマン インターフェイス デバイス (HID)、Bluetooth デバイスなどにアクセスできます。 詳しくは、「デバイスの統合」を参照してください。
デバイス バックグラウンド タスクの概要
ユーザーが UWP アプリを画面外に移動すると、Windows はアプリをメモリ内で中断します。 これにより、別のアプリがフォアグラウンドになります。 アプリは一時停止されるとメモリ内に常駐し、Windows によって実行が停止されます。 これが発生すると、デバイス バックグラウンド タスクの助けがなければ、同期や更新などの継続的なデバイス操作が中断されます。 Windows 8.1 には、アプリが中断したとしても、周辺機器での長期の同期と更新の操作をバックグラウンドで安全に実行できるようにする、2 つの新しいバックグラウンド タスク トリガー (DeviceUseTrigger と DeviceServicingTrigger) が用意されています。 アプリの中断の詳細については、「起動、再開、マルチタスク」を参照してください。
バックグラウンド タスク トリガー | デバイス メタデータの必要性 | 説明 |
---|---|---|
DeviceUseTrigger | いいえ | アプリが中断されている間、周辺機器との間で長期の同期操作を可能にします。 バックグラウンドでデバイスを同期するには、ユーザーがアプリによるバックグラウンド同期を承認している必要があります。 デバイスは、アクティブな I/O を使用して PC に接続するか、PC とペアリングする必要があり、最大 10 分間のバックグラウンド アクティビティが許可されます。 ポリシーの適用の詳細については、このトピックの後半で説明します。 |
DeviceServicingTrigger | はい | アプリが中断されている間に、設定の転送やファームウェアの更新など、長期のデバイス更新プログラムを可能にします。 バックグラウンドでデバイスを更新する場合、バックグラウンド タスクが使用されるたびにユーザーの承認が求められます。 DeviceUseTrigger バックグラウンド タスクとは異なり、DeviceServicingTrigger バックグラウンド タスクでは、デバイスの再起動と切断が可能で、最大 30 分のバックグラウンド アクティビティが許可されます。 ポリシーの適用の詳細については、このトピックの後半で説明します。 |
DeviceServicingTrigger では、デバイスの更新操作を実行するためにアプリを特権アプリとして指定する必要があるため、デバイス メタデータが必要です。
アプリの特権
長期のデバイス更新など一部の重要なデバイス操作は、特権アプリによってのみ実行できます。 特権アプリとは、デバイスの製造元がこれらの操作の実行を承認しているアプリです。 デバイス メタデータは、デバイスの特権アプリとして指定されているアプリ (存在する場合) を指定します。
デバイス メタデータ ウィザードを使用してデバイス メタデータを作成する場合は、[UWP デバイス アプリ情報を指定する] ページでアプリを指定します。 詳細については、「手順 2: UWP デバイス アプリのデバイス メタデータを作成する」を参照してください。
サポートされるプロトコル
DeviceUseTrigger と DeviceServicingTrigger を使用するデバイス バックグラウンド タスクを使用すると、システムによってトリガーされるタスク (UWP アプリが通常使用するもの) でサポートされていないプロトコル経由でアプリが周辺機器と通信できるようになります。
Protocol | DeviceServicingTrigger | DeviceUseTrigger | システム トリガー |
---|---|---|---|
USB | ![]() |
![]() |
![]() |
HID | ![]() |
![]() |
![]() |
Bluetooth RFCOMM | ![]() |
![]() |
![]() |
Bluetooth GATT | ![]() |
![]() |
![]() |
MTP | ![]() |
![]() |
![]() |
ワイヤード (有線) ネットワーク | ![]() |
![]() |
![]() |
ネットワーク Wi-Fi | ![]() |
![]() |
![]() |
IDeviceIOControl | ![]() |
![]() |
![]() |
アプリ パッケージ マニフェストでのバックグラウンド タスクの登録
アプリは、バックグラウンド タスクの一部として実行されるコードで同期操作と更新操作を実行します。 このコードは、IBackgroundTask を実装する Windows ランタイム クラス (または JavaScript アプリ専用の JavaScript ページ) に埋め込まれています。 デバイス バックグラウンド タスクを使用するには、システムによってトリガーされるバックグラウンド タスクに対して行う場合と同様に、フォアグラウンド アプリのアプリ マニフェスト ファイルでアプリがそれを宣言する必要があります。
アプリ パッケージ マニフェスト ファイルのこの例では、DeviceLibrary.SyncContent と DeviceLibrary.UpdateFirmware はフォアグラウンド アプリからのエントリ ポイントです。 DeviceLibrary.SyncContent は、DeviceUseTrigger を使用するバックグラウンド タスクのエントリ ポイントです。 DeviceLibrary.UpdateFirmware は、DeviceServicingTrigger を使用するバックグラウンド タスクのエントリ ポイントです。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.SyncContent">
<BackgroundTasks>
<m2:Task Type="deviceUse" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.UpdateFirmware">
<BackgroundTasks>
<m2:Task Type="deviceServicing" />
</BackgroundTasks>
</Extension>
</Extensions>
デバイス バックグラウンド タスクによるデバイスの使用
DeviceUseTrigger と DeviceServicingTrigger のバックグラウンド タスクを活用するアプリを開発するには、この基本的な一連の手順に従います。 バックグラウンド タスクの詳細については、「バックグラウンド タスクによるアプリのサポート」をご覧ください。
アプリは、アプリ マニフェストにバックグラウンド タスクを登録し、IBackgroundTask を実装する Windows ランタイム クラスまたは JavaScript アプリ専用の JavaScript ページにバックグラウンド タスク コードを埋め込みます。
アプリは起動すると、適切な種類のデバイス トリガー オブジェクト (DeviceUseTrigger または DeviceServicingTrigger) を作成して構成し、今後の使用のためにトリガー インスタンスを格納します。
アプリは、バックグラウンド タスクが既に登録されているかどうかを確認し、登録されていない場合はデバイス トリガーに対して登録します。 アプリでは、このトリガーに関連付けられているタスクに条件を設定できないことにご注意ください。
アプリは、バックグラウンド タスクをトリガーする必要がある場合、デバイス トリガー オブジェクトで RequestAsync アクティブ化メソッドを呼び出します。
バックグラウンド タスクは、他のシステム バックグラウンド タスクと同様に調整されません (CPU 時間クォータはありません) が、フォアグラウンド アプリの応答性を維持するために優先順位を下げて実行されます。
その後、Windows はトリガーの種類に基づいて、必要なポリシーが満たされていること (バックグラウンド タスクの開始前に操作についてユーザーの同意を要求することなど) を確認します。
Windows はシステム条件とタスク ランタイムを監視し、必要な条件が満たされなくなった場合、必要に応じてタスクを取り消します。
バックグラウンド タスクが進行状況または完了を報告すると、アプリは登録済みタスクの進行状況と完了したイベントを通じてこれらのイベントを受け取ります。
デバイス バックグラウンド タスクを使用する際に考慮すべき重要な点
DeviceUseTrigger と DeviceServicingTrigger を使用するバックグラウンド タスクをプログラムでトリガーする機能は、Windows 8.1 で導入され、デバイス バックグラウンド タスクのみに限定されています。
周辺機器の更新時にユーザーの同意を確保するため、特定のポリシーが Windows によって適用されます。 周辺機器の同期時と更新時にユーザーのバッテリ寿命を維持するために、追加のポリシーが適用されます。
DeviceUseTrigger と DeviceServicingTrigger を使用するバックグラウンド タスクは、最大バックグラウンド時間 (実時間) などの特定のポリシー要件が満たされなくなると、Windows によって取り消される可能性があります。 これらのバックグラウンド タスクを使用して周辺機器と対話する場合は、これらのポリシー要件を考慮することが重要です。
ヒント
これらのバックグラウンド タスクのしくみを確認するには、サンプルをダウンロードしてください。 カスタム USB デバイスのサンプルは、DeviceUseTrigger とのデバイス同期を実行するバックグラウンド タスクを示します。
ユーザーの同意
DeviceUseTrigger または DeviceServicingTrigger を使用する場合、Windows 8.1 はポリシーを適用して、コンテンツの同期と更新のためにバックグラウンドでデバイスにアクセスするアクセス許可をユーザーが確実にアプリに付与するようにします。 また、周辺機器の同期時と更新時にユーザーのバッテリ寿命を維持するためのポリシーも適用されます。
デバイスの同期に関するユーザーの同意
DeviceUseTrigger を使用するバックグラウンド タスクでは、アプリがバックグラウンドで同期することを許可する、1 回限りのユーザーの同意が必要です。 この同意は、アプリ モデルごと、およびデバイス モデルごとに格納されます。 ユーザーは、フォアグラウンドにあるアプリがデバイスにアクセスできるように同意する場合と同じように、アプリがバックグラウンドでデバイスにアクセスできるようにすることに同意します。
次の例では、"Tailspin Toys" という名前のアプリがバックグラウンドで同期するためにユーザー アクセス許可を取得するところです。
ユーザーは後で気が変われば、[設定] でアクセス許可を取り消すことができます。
デバイスの更新に関するユーザーの同意
DeviceUseTrigger を使用するタスクとは異なり、DeviceServicingTrigger バックグラウンド タスクを使用するバックグラウンド タスクでは、バックグラウンド タスクがトリガーされるたびにユーザーの同意が必要です。 この同意は、DeviceUseTrigger の場合のようには格納されません。 これは、デバイス ファームウェアの更新に伴うリスクの高い操作と、デバイスの更新に必要な時間が長くなるためです。 Windows は、ユーザーの同意を得るだけでなく、デバイスの更新に関する情報 (更新が終了するまでデバイスの接続状態を維持し、PC が充電されていることを確認するよう促す警告など)、および概算の操作実行時間 (アプリで提供される場合) をユーザーに提供します。
頻度とフォアグラウンドの制限
アプリが操作を開始できる頻度に制限はありませんが、アプリで一度に実行できるのは DeviceUseTrigger または DeviceServicingTrigger のいずれか 1 つのバックグラウンド タスクであり (これは他の種類のバックグラウンド タスクには影響しません)、アプリがフォアグラウンドにある間のみバックグラウンド タスクを開始できます。 アプリがフォアグラウンドにない場合、DeviceUseTrigger または DeviceServicingTrigger でバックグラウンド タスクを開始できません。 アプリでは、最初のバックグラウンド タスクが完了する前に、2 番目のデバイス バックグラウンド タスクを開始することはできません。
デバイス バックグラウンド タスクに関するポリシー
アプリがデバイス バックグラウンド タスクを使用する場合、Windows ではポリシーが適用されます。 これらのポリシーが満たされないと、DeviceUseTrigger または DeviceServicingTrigger を使用するバックグラウンド タスクは取り消される場合があります。 デバイス バックグラウンド タスクを使用して周辺機器と対話する場合は、これらのポリシー要件を考慮することが重要です。
タスク開始に関するポリシー
次のテーブルは、各バックグラウンド タスク トリガーに適用されるタスク開始ポリシーを示しています。
ポリシー | DeviceServicingTrigger | DeviceUseTrigger |
---|---|---|
バックグラウンド タスクをトリガーすると、UWP アプリがフォアグラウンドになります。 | ![]() |
![]() |
デバイスはシステムに接続されています (またはワイヤレス デバイスの範囲内にあります)。 | ![]() |
![]() |
バックグラウンド タスクでは、画面がロックされている場合は 1 分ごとに、画面がロックされていない場合は 5 分ごとに、400 ミリ秒の CPU 時間 (1 GHz CPU を想定) が消費されます。 このポリシーを満たしていないと、タスクが取り消される可能性があります。 | ![]() |
![]() |
デバイスは、デバイス周辺 API (USB、HID、Bluetooth などのWindows ランタイム API) を使用してアプリにアクセスできます。 アプリがデバイスにアクセスできない場合、バックグラウンド タスクへのアクセスは拒否されます。 | ![]() |
![]() |
アプリによって提供されるバックグラウンド タスクのエントリ ポイントは、アプリ パッケージ マニフェストに登録されます。 | ![]() |
![]() |
ユーザーは、続行するためのアクセス許可をタスクに与えています。 | 毎回。 | 初回時、その後はアプリのアクセス許可によって制御されます。 |
アプリが示す推定所要時間は 30 分未満です。 | ![]() |
![]() |
アプリは、デバイスの特権アプリとして指定されます。 (デバイス コンテナーのデバイス メタデータにある特権アプリの一覧と、アプリ ID が完全に一致している必要があります) | ![]() |
![]() |
コンピューターのバッテリ容量が 33% を超えているか、AC 電源がオンになっています。 | ![]() |
![]() |
操作の種類ごとに実行されているデバイスのバックグラウンド タスクは 1 つだけです。 | ![]() |
![]() |
ランタイム ポリシーの確認
Windows では、タスクがバックグラウンドで実行されている間、次のランタイム ポリシー要件が適用されます。 ランタイム要件のいずれかが満たされなくなると、Windows はデバイス バックグラウンド タスクを取り消します。
次のテーブルは、各バックグラウンド タスク トリガーに適用されるランタイム ポリシーを示しています。
ポリシー確認 | DeviceServicingTrigger | DeviceUseTrigger |
---|---|---|
実時間の制限 – アプリのタスクをバックグラウンドで実行できる合計時間。 | 30 分 | 10 分 |
デバイスはシステムに接続されています (またはワイヤレス デバイスの範囲内にあります)。 | ![]() |
![]() |
タスクは、デバイスに対して通常の I/O を実行しています (5 秒ごとに 1 回の I/O)。 | ![]() |
![]() |
アプリはタスクを取り消していません。 | ![]() |
![]() |
アプリが終了していません。 | ![]() |
![]() |
ベスト プラクティス
デバイス バックグラウンド タスクを使用する UWP デバイス アプリのベスト プラクティスを次に示します。
デバイス バックグラウンド タスクのプログラミング モデル
アプリから DeviceUseTrigger または DeviceServicingTrigger のバックグラウンド タスクを使用すると、ユーザーがアプリを切り替え、フォアグラウンド アプリが Windows によって中断された場合でも、フォアグラウンド アプリから開始された同期またはデバイス更新の操作がバックグラウンドで引き続き実行されます。 バックグラウンド タスクを登録、トリガー、登録解除するには、この全体的なモデルに従うことをお勧めします。
トリガーを要求する前に、バックグラウンド タスクを登録します。
進行状況と完了イベントのハンドラーをトリガーに接続します。 アプリが中断から復帰すると、Windows は、バックグラウンド タスクの状態を判断するために使用できる、キューに登録されている進行状況または完了イベントをアプリに提供します。
DeviceUseTrigger または DeviceServicingTrigger のバックグラウンド タスクをトリガーするときに、開いているデバイス オブジェクトを閉じて、それらのデバイスをバックグラウンド タスクで自由に開いて使用できるようにします。
トリガーを登録します。
タスクが完了したら、バックグラウンド タスクの登録を解除します。 バックグラウンド タスクが完了したら、バックグラウンド タスクの登録を解除し、UWP アプリからデバイスを再度開いて定期的に使用することができます。
バックグラウンド タスク クラスから取り消しイベントを登録します。 取り消しイベントを登録すると、実行中のバックグラウンド タスクが Windows またはフォアグラウンド アプリで取り消されたときに、バックグラウンド タスク コードで完全に停止することができます。
アプリの (中断ではなく) 終了時に、実行中のタスクの登録を解除して取り消します。
アプリが終了したら、実行中のタスクの登録を解除して取り消します。
アプリが終了すると、バックグラウンド タスクは取り消され、既存のイベント ハンドラーが既存のバックグラウンド タスクから切断されます。 これにより、バックグラウンド タスクの状態を判断できなくなります。 バックグラウンド タスクの登録を解除して取り消すと、取り消しコードでバックグラウンド タスクを完全に停止できます。
ヒント
カスタム USB デバイスのサンプルでこれを実施する方法の詳細については、「デバイスのバックグラウンド タスクの作成」を参照してください。
バックグラウンド タスクの取り消し
フォアグラウンド アプリからバックグラウンドで実行されているタスクを取り消すには、アプリで使用する BackgroundTaskRegistration オブジェクトの Unregister メソッドを使用して、DeviceUseTrigger または DeviceServicingTrigger バックグラウンド タスクを登録します。 BackgroundTaskRegistration で Unregister メソッドを使用してバックグラウンド タスクの登録を解除すると、バックグラウンド タスク インフラストラクチャでバックグラウンド タスクが取り消されます。
Unregister メソッドはさらにブール (true または false) 値を使って、バックグラウンド タスクの現在実行中のインスタンスを終了させずに取り消す必要があるかどうかを示します。 詳細については、BackgroundTaskRegistration.Unregister の API リファレンスを参照してください。