在 Windows 8.1 中使用启动参数发送推送通知 (Toasts)

Send Push notifications (Toasts) with launch parameters in Windows 8.1

我有一个 WinJS 项目,它在 Runtime Component 中有一个 BackgroundTask,它在发送推送通知时触发(来自我自己的网络服务的原始通知)。 那个后台服务会创建一个本地 toasts 并将其显示在操作通知中心。

 public static void ShowNotification(int notificationId, string ToastTitle, int messageType, string messageDetails)
    {
        string messageText = String.Empty;
        ToastTemplateType toastTemplate = ToastTemplateType.ToastText04;
        XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
        XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");

        toastTextElements[0].AppendChild(toastXml.CreateTextNode(ToastTitle));//Toast notification title
        toastTextElements[1].AppendChild(toastXml.CreateTextNode(messageText));
        toastTextElements[2].AppendChild(toastXml.CreateTextNode(messageDetails));

        var launchAttribute = toastXml.CreateAttribute("launch");
        IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
        ((XmlElement)toastNode).SetAttribute("duration", "short");
        toastNode.Attributes.SetNamedItem(launchAttribute);

        //Launch params
        var toastNavigationUriString = messageDetails;
        var toastElement = ((XmlElement)toastXml.SelectSingleNode("/toast"));
        toastElement.SetAttribute("launch", toastNavigationUriString);

        ToastNotification toast = new ToastNotification(toastXml);
        toast.Tag = notificationId.ToString();
        toast.ExpirationTime = DateTimeOffset.UtcNow.AddDays(3);

        if (true)
        {
            toast.SuppressPopup = false;//to send notification directly to action center without displaying a popup on phone.
        }

        ToastNotificationManager.CreateToastNotifier().Show(toast);
    }

我在 JS 中处理这些祝酒词:

WinJS.Application.addEventListener("activated", onActivatedHandler, true);

function onActivatedHandler(args) {
    if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
        messageDetails = args.detail.arguments;
        PhonegapService.setNotificationMessage(messageDetails, function () {
            window.location.href = "index.html";
        });
    }
}

XML 这种情况下我的网络服务使用的格式是:

string rawMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
            "<root>" +
                "<Value1>" + "Hello" + "<Value1>" +
                "<Value2>" + "Raw" + "<Value2>" +
            "</root>";

现在推送通知略有变化。我想直接从我的网络服务发送推送通知 (Toasts) 而不是发送原始消息。

我的问题是:

  1. 如何将 launch 参数和 message 附加到网络服务中我的 toast 通知上,这与我们在创建本地 toast 时所做的类似。
  2. 收到 toasts 后如何处理点击事件并获取随该通知附加的有用消息。

XML 在这种情况下是这样的:

string toast1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?> ";

           string toast2 = string.Format(@"<toast>
                       <visual>
                           <binding template=""ToastText04"">
                               <text id=""1"">{0}</text>
                               <launch></launch>
                           </binding>
                       </visual>
                   </toast>",message);
           string xml = toast1 + toast2;

更新 1

我在网络服务中使用了以下 XML。但我收到的通知格式与我预期的不同:

 string toast1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?> ";
 string message = "some json";
                string toast2 = string.Format(@"<toast launch= ""{0}"">
                         <visual version=""1"">
                             <binding template=""ToastText02"">
                                 <text id=""1"">{1}</text>
                                   <text id=""2"">{2}</text>
                             </binding>
                         </visual>
                     </toast>", message, "Alert", "Test");

您需要创建一个具有与以下结构相同的结构的 XML(有或没有自定义音频):

<toast launch=\"$param\">
   <audio src=\"ms-appx:///Assets/Sounds/$sound.wav\"/>
   <visual>
       <binding template=\"ToastText04\">
           <text id=\"1\">$title</text>
           <text id=\"2\">$msg</text>
       </binding>
   </visual>
</toast>

请注意 launch<toast> 标签的成员。

你可以像之前一样在应用启动时处理点击事件,你得到的字符串就是launch的值。