如何在Windows 8.1中显示用户的推送通知?

时间:2015-07-08 09:09:44

标签: c# push-notification windows-8.1 wns

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

之后,我在我这边实现了以下代码,以便从WNS获得该Uri的channelUri和Expiration日期。

  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);
            }
        } 

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

1 个答案:

答案 0 :(得分:0)

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

首先,您需要创建 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;匹配,否则您将获得异常。

希望它有所帮助。