BackgroundTaskRegistration trigger property is null

僤鯓⒐⒋嵵緔 提交于 2019-12-08 04:36:23

问题


Hi want to receive push notifications on background task for that i have created Portable library here is my Background task class

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Windows.ApplicationModel.Background;
using Windows.Data.Xml.Dom;
using Windows.Networking.PushNotifications;
using Windows.Storage;
using Windows.UI.Notifications;

namespace BackgroundTask
{
    public sealed class NotificationTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {

            // Get the background task details
            ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
            string taskName = taskInstance.Task.Name;

            Debug.WriteLine("Background " + taskName + " starting...");

            // Store the content received from the notification so it can be retrieved from the UI.
            ToastNotification notification = (ToastNotification )taskInstance.TriggerDetails;
            settings.Values[taskName] = notification.Content;
            NotificationTask.AddTostNotification(notification.Content);

            Debug.WriteLine("Background " + taskName + " completed!");
        }



    private static void AddTostNotification(String xmlDocument)
    {

        List<string> messageSection = NotificationTask.GetMessageAndLandingPage(xmlDocument, "toast");

        if (messageSection == null) { return; }

        ToastTemplateType toastTemplate = ToastTemplateType.ToastText01;

        XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
        XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
        toastTextElements[0].AppendChild(toastXml.CreateTextNode(messageSection[0]));
        //  toastTextElements[1].AppendChild(toastXml.CreateTextNode(message));

        IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
        ((XmlElement)toastNode).SetAttribute("launch", messageSection[1]);

        XmlElement audio = toastXml.CreateElement("audio");
        audio.SetAttribute("src", "ms-appx:///Assets/Play-Guitar.wav");
        //audio.SetAttribute("loop", "true");
        toastNode.AppendChild(audio);

        //launch tost immediatly
        ToastNotification toast = new ToastNotification(toastXml);
        ToastNotificationManager.CreateToastNotifier().Show(toast);

    }

Here i am registering Task

    internal async void InitChannel()
    {

        // Applications must have lock screen privileges in order to receive raw notifications
        BackgroundAccessStatus backgroundStatus = await BackgroundExecutionManager.RequestAccessAsync();

        // Make sure the user allowed privileges
        if (backgroundStatus != BackgroundAccessStatus.Denied && backgroundStatus != BackgroundAccessStatus.Unspecified)
        {
            Windows.Storage.ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.LocalSettings;

            try
            {
                var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

                if (channel != null)
                {

                    roamingSettings.Values["ExistingPushChannel"] = channel.Uri;

                    dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
                    channel.PushNotificationReceived += OnPushNotificationReceived;

                    UnregisterBackgroundTask();
                    RegisterBackgroundTask();

                }
                else
                {
                    roamingSettings.Values["ExistingPushChannel"] = "Failed to create channel";
                }
            }
            catch
            {
                roamingSettings.Values["ExistingPushChannel"] = "Failed to create channel";
            }
        }

    }
   private void RegisterBackgroundTask()
    {
        BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
        PushNotificationTrigger trigger = new PushNotificationTrigger();

        taskBuilder.SetTrigger(trigger);

        // Background tasks must live in separate DLL, and be included in the package manifest
        // Also, make sure that your main application project includes a reference to this DLL

        taskBuilder.TaskEntryPoint = "BackgroundTask.NotificationTask";
        taskBuilder.Name = "PlaypushNotification";

        try
        {
            BackgroundTaskRegistration task = taskBuilder.Register();
            task.Completed += BackgroundTaskCompleted;
        }
        catch 
        {             
            UnregisterBackgroundTask();
        }
    }

    private bool UnregisterBackgroundTask()
    {
        foreach (var iter in BackgroundTaskRegistration.AllTasks)
        {
            IBackgroundTaskRegistration task = iter.Value;
            if (task.Name == "PlaypushNotification")
            {
                task.Unregister(true);
                return true;
            }
        }
        return false;
    }

In my Manifest file

  <Extensions>
    <Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTask.NotificationTask">
      <BackgroundTasks>
        <Task Type="pushNotification" />
      </BackgroundTasks>
    </Extension>
  </Extensions>

PushNotification Trigger is not firing, when i debug i found that trigger property of BackgroundTaskRegistration is null. what is the issue? What wrong is going here?

来源:https://stackoverflow.com/questions/29338750/backgroundtaskregistration-trigger-property-is-null

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!