2016-10-07 9 views
0

私はここ数日間、モニターに対して頭を抱えています。私はWindowsストア用のUWPアプリを開発しています(14393をターゲットにしています)、MVVM/IoC用のPrism/Unityフレームワークを使用しています。シングルプロセスUWPシナリオでTimeTriggerが起動しない

ライブタイルを更新するために必要なデータは、リポジトリパターンを実装するクラスに保存されているため、すべてが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を交換すると問題は解決しますが、スマートフォンを充電器に接続する必要がありますが、これは問題のある回避策ではありません。

タスクを強制的にVisualStudioまたはPowerShell(Start-AppBackgroundTask -TaskID)経由で実行すると、正しく実行され、タイルが更新されます。

共有する他の便利なヒントはありますか?

編集2017年12月1日 私は2つのプロジェクトとVisual Studioのソリューションを含むリプロを作成しました:

  • ライブタイルのテストシンプル:それはライブタイルの更新を持つようになるような単純なUWPを使用して15分ごとにすべてが期待どおりに機能します。
  • ライブタイルテストプリズム:もう一度、プリズムとユニティを使って上記のプロジェクトを簡単に変換します。 OSが、Unityコンテナがnullである(初期化されない)タイルを更新するためにアプリケーションを起動しようとするため、動作しません。

これは私が問題を抱えている理由を説明しています。Unityが初期化されず、リポジトリ経由でデータを取得できず、アプリケーションがクラッシュし、GGです。

これで、UnityがOnBackgroundActivatedメソッドで利用できない理由を理解する必要があります。ほとんどみんなそこに!

リプロ:https://github.com/eraser85/LiveTileTestRepro

答えて

0

OK:

は、ここでのサンプルです。

述べたように、問題は、プリズムから茎:OnBackgroundActivated()経由でOSによって起動し、入力するときに、基本的にはIoCコンテナは初期化されていませんでした。

解決策は、実際には完全に実行可能で正しい(IMHO!)ということです。OnBackgroundActivated()では、すべてをゼロから始めるように初期化するだけです(実装の詳細についてはPrism's Sourceをご覧ください)。私の具体的なケースでは、私はCreateAndConfigureContainer()を呼び出して、OnInitializeAsync()(例:repos、services .. )。

私はdevsとopened an issueをしました。たぶん解決策がすでに出ているかもしれませんが、その間にこれがすべきです。

0

コードは、私はここに変更しようとするだろう唯一のものは、あなたが一定と確信している、IsNetwokRequested財産とTimeTrigger周波数値を使用している私には正常に見える/変数ます」使用しているのは15以上ですか?私は最終的に解決策を考え出すてきたいくつかのより多くのテストの後になるよう

BackgroundTaskBuilder builder = new BackgroundTaskBuilder { Name = "YourBgTaskName" }; 
builder.SetTrigger(new TimeTrigger(15, false)); 
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable)); 
builder.Register(); 
+0

この変数については、単純な 'private const int TileUpdateFrequencyMinutes = 15;'です。この値を設定ページに公開したい場合は、変数の後ろに置きます。しかし、はい、私はそれが15分であると確信しています(私はちょうどあなたの助言に従ってチェックした!:))。 IsNetworkRequiredに関しては、私の投稿の次の月に、私はあなたが言及している同じ懸念をオンラインで読んだことがあり、更新されたコードからずっと前にあなたが示唆しているものと基本的に同じです。残念ながら私はまだ悩みがあります。とにかくありがとうございました! – MicheleM

+0

@MicheleM別のUWPプロジェクトで新しいソリューションを作成しようとしましたが、空のアプリケーションが含まれていて、単一プロセスのバックグラウンドタスクを設定して実行していますか?こうすることで、特にあなたのアプリケーションプロジェクトやVSインストールやシステム設定などに間違いがあるかどうかを少なくとも理解することができます。つまり、言及した追加の変更を加えたコードは、私には100%正しいと思われます。 – Sergio0694

+0

いいえ、まだありません。私はそれがこの時点で唯一の方法だと思います。私は2つの新しいプロジェクトを作成するつもりですが、ライブのタイルを更新するための最小限の空白のプロジェクトと、プリズムのプリズムを追加したもう1つの空のプロジェクトを作成します:私が持っている問題は何らかの方法でリンクされていると思われます。 ありがとう、私は何かを持ってすぐにこの投稿を更新します。 – MicheleM

関連する問題