Я несколько секунд стучал головой о монитор. Я разрабатываю приложение UWP для Windows Store (таргетинг 14393), и я использую рамки Prism/Unity для MVVM/IoC.TimeTrigger не срабатывает в однопроцессорном сценарии UWP
Поскольку данные, необходимые для обновления Live Tile, хранятся в классе, реализующем шаблон хранилища, и все управляется через 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();
Регистрация успешно завершена. Выполнение Get-AppBackgroundTask в PowerShell показывает обе задачи, как и должно быть. Однако TimeTrigger никогда не срабатывает. Переключение TimeTrigger с MaintenanceTrigger устраняет проблему, хотя смартфон необходимо подключить к зарядному устройству, которое не является приемлемым решением.
Выполнение задачи, выполняемой через VisualStudio или PowerShell (Start-AppBackgroundTask -TaskID), выполняется правильно, а плитка обновляется.
Есть ли у вас другой полезный отзыв?
Редактировать 12/01/2017 Я создал REPRO, содержащий Visual Studio Solution с двумя проектами:
- Живой Test Tile Простые: так просто, как это добирается, чтобы иметь обновление живой плитки каждые 15 минут с использованием UWP. Все работает так, как ожидалось.
- Призматический тест в реальном времени: снова, простое преобразование вышеупомянутого проекта с использованием Prism и Unity. Не работает, потому что, когда ОС пытается запустить приложение для обновления плитки, контейнер Unity имеет значение null (не инициализируется).
Это объясняет, почему у меня возникла проблема: Unity не инициализируется, я не могу получить данные через репозитории, сбой приложений и GG.
Теперь мне просто нужно понять, почему Unity недоступен в методе OnBackgroundActivated. Почти там ребята !!
Репро: https://github.com/eraser85/LiveTileTestRepro
Что касается этой переменной, это простой 'private const int TileUpdateFrequencyMinutes = 15;'. Я положил его за переменную, если бы захотел показать это значение на странице настроек. Но да, я уверен, что это 15 минут (я только что проверил ваш совет! :)). Что касается IsNetworkRequired, то в течение нескольких месяцев после моего сообщения я читал в Интернете те же самые проблемы, о которых вы упоминаете, и давно обновил код, и он в основном такой же, как тот, который вы предлагаете. К сожалению, у меня все еще есть проблемы. В любом случае, спасибо! – MicheleM
@ MicheleM Попробовали ли вы создать новое решение с другим проектом UWP, содержащим пустое приложение, которое настраивает и запускает фоновое задание с одним процессом, чтобы увидеть, работает ли оно там? Таким образом, вы, по крайней мере, сможете понять, что-то не так с вашим проектом приложения, в частности, с установкой VS или системными настройками или что-то еще. Я имею в виду, что ваш код с дополнительными изменениями, которые вы упомянули, выглядит на 100% прав для меня. – Sergio0694
Нет, еще нет. Полагаю, это единственный способ на этом этапе. Я собираюсь сделать два новых проекта, стандартный пустой проект с минимальным обновлением живой плитки, а другой с призмой, запеченной в: Я подозреваю, что проблема, с которой я связан, связана с ней каким-то образом. Спасибо, сейчас я обновляю этот пост, как только у меня есть что-то. – MicheleM