Получить аргументы toast из фоновой задачи, используя ToastNotificationActionTrigger

Я пытаюсь получить аргументы из всплывающего уведомления в фоновой задаче, однако рекомендуемый метод на веб-сайте Microsoft не работает.

Я регистрирую задачу, как показано ниже, в методе OnInitialize() моего основного приложения UWP, как показано ниже:

foreach (var task in BackgroundTaskRegistration.AllTasks)
{
      if (task.Value.Name.Equals(taskName))
      {
           task.Value.Unregister(true);
      }
}

BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

BackgroundTaskBuilder builder = new BackgroundTaskBuilder()
{
      Name = taskName,
      TaskEntryPoint = "AppNamespace.GetQuestionsBackground"
};

Тост-уведомление, которое я отправляю на устройство, выглядит следующим образом:

var toast = "<?xml version=\"1.0\" encoding=\"utf - 8\"?>" +
            $"<toast launch=\"questionId:{question.ToString()}:{journal.Id.ToString()}:{staffId.ToString()}\">" +
            "<visual><binding template=\"ToastImageAndText02\">" +
            "<text id=\"1\">New Question</text>" +
            "<text id=\"2\">There is a question waiting to be answered</text>" +
            "<image id=\"1\" src=\"ms-appx:///Assets/DailyQuestion32.png\" />" +
            "</binding></visual>" +
            "<actions>" +
            $"<action activationType=\"foreground\" content=\"Answer now\" arguments=\"now:{question.ToString()}:{journal.Id.ToString()}:{staffId.ToString()}\"/>" +
            $"<action activationType=\"background\" content=\"Answer later\" arguments=\"later:{question.ToString()}:{journal.Id.ToString()}:{staffId.ToString()}\"/>" +
            "</actions>" +
            "</toast>";

И фоновая задача (которая находится в отдельном проекте компонента среды выполнения Windows) выглядит следующим образом:

public sealed class GetQuestionsBackground : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        _deferal = taskInstance.GetDeferral();

        this.container = this.diBootStaraaper.BootStrap(applicationData);

        var details = taskInstance.TriggerDetails as ToastNotificationActionTriggerDetail;

        if (details.Argument != null)
        {
            var argList = details.Argument.Split(':');

            IDataProvider dataProvider = DependencyHelper.Resolve<IDataProvider>();
            await dataProvider.SaveQuestion(argList[1], argList[2], argList[3]);
            dataProvider.SaveSettings();

        }
        _deferal.Complete();
    }
}

Манифест пакета также имеет фоновую задачу, зарегистрированную следующим образом:

<Extension Category="windows.backgroundTasks" EntryPoint="AppNamespace.GetQuestionsBackground">
      <BackgroundTasks>
        <Task Type="systemEvent" />
      </BackgroundTasks>
</Extension>

Переменная details просто пуста, но если условие оператора истинно? Кроме того, Visual Studio не может просматривать текущее состояние taskInstance.triggerDetails, когда я делаю точку останова в коде и прохожу через нее...

Любая помощь будет оценена, спасибо!

ОБНОВЛЕНИЕ: я остановился на фоновой задаче, когда нажимал на кнопку уведомления о тосте и просматривал переменные в Visual Studio, и я могу видеть нужные мне данные в переменной m_argument внутри _PiEventDetails в собственной реализации. Так что я знаю, что данные есть, но, похоже, не работает получатель.

1 ответ

Решение

Вот и получается, что я на самом деле пытался сделать:

    var arguments = details.argument;
    arguments.split(':');

вместо того, чтобы пытаться получить доступ к details.argument напрямую, и это было явно недействительным.

Спасибо @jay-zuo-msft за помощь в реализации этого.

Другие вопросы по тегам