ここ数日、モニターに頭をぶつけていました。Windows ストア (14393 をターゲット) 用の UWP アプリを開発しており、MVVM / IoC 用に Prism/Unity フレームワークを使用しています。
ライブ タイルの更新に必要なデータはリポジトリ パターンを実装するクラスに格納され、すべてが Unity を介して管理されるため、バックグラウンド実行用の別のプロセスを作成していないため、BGTask 登録プロセス全体を簡素化しています。
実際の BGTask 登録コードは次のとおりです。
var servicingTaskAlreadyRegistered = false;
var tileUpdaterTaskAlreadyRegistered = false;
foreach (var t in BackgroundTaskRegistration.AllTasks)
{
if (t.Value.Name == Constants.BgTileUpdaterTaskName)
tileUpdaterTaskAlreadyRegistered = true;
else if (t.Value.Name.Equals(Constants.BgServicingTaskName))
servicingTaskAlreadyRegistered = true;
}
var reqAccess = await BackgroundExecutionManager.RequestAccessAsync();
if (reqAccess == BackgroundAccessStatus.Denied ||
reqAccess == BackgroundAccessStatus.DeniedBySystemPolicy ||
reqAccess == BackgroundAccessStatus.DeniedByUser ||
reqAccess == BackgroundAccessStatus.Unspecified)
return false;
if (!servicingTaskAlreadyRegistered)
{
var servicingTaskBuilder = new BackgroundTaskBuilder();
servicingTaskBuilder.Name = Constants.BgServicingTaskName;
servicingTaskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.ServicingComplete, false));
servicingTaskBuilder.Register();
}
if (tileUpdaterTaskAlreadyRegistered)
return true;
var builder = new BackgroundTaskBuilder();
builder.Name = Constants.BgTileUpdaterTaskName;
builder.SetTrigger(new TimeTrigger(TileUpdateFrequencyMinutes, false));
//builder.SetTrigger(new MaintenanceTrigger(TileUpdateFrequencyMinutes, false));
builder.IsNetworkRequested = true;
builder.Register();
登録が正常に完了します。PowerShell で Get-AppBackgroundTask を実行すると、両方のタスクが表示されます。ただし、TimeTrigger は起動しません。TimeTrigger を MaintenanceTrigger に交換すると問題は解決しますが、スマートフォンを充電器に接続する必要がありますが、これは許容できる回避策ではありません。
VisualStudio または PowerShell (Start-AppBackgroundTask -TaskID) を介してタスクを強制的に実行すると、正しく実行され、タイルが更新されます。
他に役立つヒントはありますか?
編集 2017 年 12 月1 日 2 つのプロジェクトを持つ Visual Studio ソリューションを含む Repro を作成しました。
- ライブ タイル テスト シンプル: UWP を使用してライブ タイルを 15 分ごとに更新するのと同じくらい簡単です。すべてが期待どおりに機能します。
- Live Tile Test Prism: 繰り返しますが、上記のプロジェクトを Prism と Unity を使用して単純に変換したものです。OS がアプリを起動してタイルを更新しようとすると、Unity コンテナーが null (初期化されない) になるため、機能しません。
これは、私が問題を抱えている理由を説明しています: Unity が初期化されない、リポジトリ経由でデータを取得できない、アプリがクラッシュして GG.
Unity が OnBackgroundActivated メソッドで利用できない理由を理解する必要があります。もうすぐだ!