如何在 windows 8.1 中为用户显示推送通知?

How to display push notification for user in windows 8.1?

我目前正在研究 Windows 8.1 推送通知部分。我阅读了不同的链接,发现首先我们需要注册应用程序并获取所有信息,如 SID 和客户端密码,然后发送给我们的服务器团队,以便他们可以发送推送通知。

然后,我在这边实现了以下代码,从 WNS 获取该 Uri 的 channelUri 和到期日期。

  PushNotificationChannel channel = null;
        try
        {
            channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
            if (channel != null)
            {
                var notificationUri = channel.Uri;
                var expiration_time = channel.ExpirationTime;
            }
            channel.PushNotificationReceived += channel_PushNotificationReceived;
        }
        catch (Exception ex)
        {
            if (ex != null)
            {
                System.Diagnostics.Debug.WriteLine(ex.HResult);
            }
        } 

我已经完美地收到了所有的值,我的服务器团队添加了一个逻辑来向我发送推送通知。现在,我面临的问题是我不知道如何显示服务器发送给该用户的推送通知。另外,如果应用程序不在 运行 或在后台,我们可以显示通知吗?

后台任务解决了我的问题。

首先你需要创建一个WindowsRuntimeComponent项目并添加下面的代码

public sealed class PushNotification:IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        RawNotification notification = (RawNotification)taskInstance.TriggerDetails as RawNotification;
        if (notification != null)
        {
            ToastTemplateType toastTemplate = ToastTemplateType.ToastImageAndText01;
            XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
            var textElemets = toastXml.GetElementsByTagName("text");
            textElemets[0].AppendChild(toastXml.CreateTextNode(notification.Content));
            var imageElement = toastXml.GetElementsByTagName("image");
            imageElement[0].Attributes[1].NodeValue = "ms-appx:///Assets/50.png";
            ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(toastXml));
        }

    }
}

然后使用以下代码在任何页面(我在主页中添加)注册后台任务

private async void RegisterBackgroundTask()
    {

        await BackgroundExecutionManager.RequestAccessAsync();

        try
        {

            foreach (var task in BackgroundTaskRegistration.AllTasks)
            {
                try
                {
                    task.Value.Unregister(false);
                }
                catch
                {
                    //
                }
            }
            BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
            builder.Name = "Push Notifcation Task";
            builder.TaskEntryPoint = typeof(PushNotification).FullName;
            builder.SetTrigger(new PushNotificationTrigger());
            builder.Register();
        }
        catch(Exception e)
        {
            if(e != null)
            {
                System.Diagnostics.Debug.WriteLine(e.HResult);
                System.Diagnostics.Debug.WriteLine(e.InnerException);
            }
        }
    }

请不要忘记在 Package.appmanifest 文件的声明部分添加此后台任务,Entry Point 的名称应与 builder.TaskEntryPoint = typeof(PushNotification).FullName; 否则你会得到异常。

希望对大家有所帮助。