RawPushNotification when app not 运行 Windows Phone 8.1

RawPushNotification when app not running Windows Phone 8.1

我一直在尝试编写将原始推送通知显示为 toast 的后台任务。当应用程序为 运行.

时,我收到了推送通知

这是我的后台任务class:

public sealed class BackgroundNotificationsTask : IBackgroundTask
{

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
        string content = notification.Content;

        Debug.WriteLine("Background raw notification obtained!");

        //SendNotification(content);
    }

    private void SendNotification(string text)
    {
        XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);

        XmlNodeList elements = toastXml.GetElementsByTagName("text");
        foreach (IXmlNode node in elements)
        {
            node.InnerText = text;
        }

        ToastNotification notification = new ToastNotification(toastXml);
        ToastNotificationManager.CreateToastNotifier().Show(notification);
    }

}

然后我在MainPage.xaml.cs

注册
    private void RegisterTasks()
    {
        BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

        var taskRegistered = false;
        var exampleTaskName = "NotificationsBackground";

        foreach (var task in BackgroundTaskRegistration.AllTasks)
        {
            if (task.Value.Name == exampleTaskName)
            {
                taskRegistered = true;
                break;
            }
        }

        if(!taskRegistered)
        {
            var builder = new BackgroundTaskBuilder();

            builder.Name = exampleTaskName;
            builder.TaskEntryPoint = "BackgroundTasks.NotificationsBackground";
            builder.SetTrigger(new Windows.ApplicationModel.Background.PushNotificationTrigger());

            try
            {
                BackgroundTaskRegistration task = builder.Register();

                Debug.WriteLine("Background Task registered.");
            }
            catch (Exception e)
            {
                Debug.WriteLine("Background Task register exception: " + e.ToString());
            }
        }
    }

现在,在 appxmanifest 中,我已将 'Lock screen notifications' 设置为徽章,然后在声明中,我添加了后台任务,并选择了属性推送通知并将入口点设置为 BackgroundNotificationsTask.cs

![屏幕][2]

我是不是做错了什么或者我遗漏了什么?

编辑:

现在,当我收到推送通知时,应用程序关闭...有人知道为什么吗?

你有几处做错了。

1) 将您的 BackgroundTask 放在一个单独的项目中

BackgroundTask 项目应该是 Windows 运行时组件。还要确保您的后台任务驻留在可访问的命名空间下。不要忘记从您的应用程序项目中引用后台任务项目。

2) 注册正确的class

注册后台任务时,始终使用完全限定的 class 名称而不是文件名:

BackgroundTasks.BackgroundNotificationsTask

这是您必须在程序包清单文件和代码中使用的入口点(假定任务 class 在 1 下解释的项目中)并且命名空间称为 BackgroundTasks).

3) 调用 RequestAccessAsync()

确保在注册任何任务之前调用它:

BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

编辑:MSDN 上有一个很好的演练 https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh977055.aspx