0

ここ数日、モニターに頭をぶつけていました。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 メソッドで利用できない理由を理解する必要があります。もうすぐだ!

再現: https://github.com/eraser85/LiveTileTestRepro

4

2 に答える 2

0

コードは問題ないように見えます。ここで変更しようとしているのは、IsNetwokRequestedプロパティとTimeTrigger頻度の値の使用だけです。使用している定数/変数が 15 以上であることは確かですか?

サンプルは次のとおりです。

BackgroundTaskBuilder builder = new BackgroundTaskBuilder { Name = "YourBgTaskName" };
builder.SetTrigger(new TimeTrigger(15, false));
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.Register();
于 2017-01-11T18:00:01.687 に答える