如何发送推送通知 windows phone 8 应用程序?

Posted

技术标签:

【中文标题】如何发送推送通知 windows phone 8 应用程序?【英文标题】:How to send push notifications windows phone 8 app? 【发布时间】:2015-05-26 13:30:38 【问题描述】:

我是 windows phone 的新手。我正在开发一个应用程序。在这个应用程序中我想发送 pushnotifications。如何使用 c# 在 windows phone 8 中发送和接收 pushnotifications。请帮助我。

public string SendNotificationToWindows(string message, string notificationId)
        
            try
            

                //string subscriptionUri = "http://db3.notify.live.net/throttledthirdparty/01.00/AwYAAACKB3Noan4l%2bojXM5%2f3TDodPTegXbZxtTAzRktj3eWFOYmjjN1FPIdkuduXrwYZByFKLxy1gXy8rCmf1FSM6GH92rva7ecbQ%2b1%2bnGYxLWxoAI0GL03fZbV29p%2fu%2fJYrHQI%3d";
                 string subscriptionUri = "http://db3.notify.live.net/throttledthirdparty/01.00/aHR0cHM6Ly9zaW4ubm90aWZ5LndpbmRvd3MuY29tLz90b2tlbj1Bd1lBQUFEQjE1TzJMQWMlMmZBQldlUlpQendHMlglMmJRNWlPbzVUOVF3UUtXeUFQJTJic2clMmZFREhuSHM0bDBVN2tFN2prSXVJYU1hWEZIdmJYR2t6cEpQJTJiaCUyYldJSVJFTjBSd244TzJRNFV5RUs0OFJKZDdLSWJPeXVUMXFNWVNwa0Y3bmlBak5kZmslM2Q=";

                //string subscriptionUri = "https://hk2.notify.windows.com/?token=AwYAAACKB3Noan4l%2bojXM5%2f3TDodPTegXbZxtTAzRktj3eWFOYmjjN1FPIdkuduXrwYZByFKLxy1gXy8rCmf1FSM6GH92rva7ecbQ%2b1%2bnGYxLWxoAI0GL03fZbV29p%2fu%2fJYrHQI%3d";


                //string subscriptionUri = "http://sn1.notify.live.net/throttledthirdparty/01.00/aHR0cHM6Ly9zaW4ubm90aWZ5LndpbmRvd3MuY29tLz90b2tlbj1Bd1lBQUFEckVzRmdhR2phMXQ1aVo5MGdvRzAzejR5cE1SJTJiMHIwR2ZQc0Q0U0xzYnJOY2V3JTJmdU5pek1kZER4ZG9UdE5CM05PbjQ4dU9yUktzakN0U2JJa2lObmdBQVljQzdScDZ0blRBZlBDWjB4OWlZMDJRSDF3JTJieHM1ZzVMSTlWSXdGZWslM2Q=";

              //  string subscriptionUri = "https://sin.notify.windows.com/?token=AwYAAADrEsFgaGja1t5iZ90goG03z4ypMR%2b0r0GfPsD4SLsbrNcew%2fuNizMddDxdoTtNB3NOn48uOrRKsjCtSbIkiNngAAYcC7Rp6tnTAfPCZ0x9iY02QH1w%2bxs5g5LI9VIwFek%3d";




                var sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);

                // Create an HTTPWebRequest that posts the toast notification to the Microsoft Push Notification Service.
                // HTTP POST is the only method allowed to send the notification.
                sendNotificationRequest.Method = "POST";

                // The optional custom header X-MessageID uniquely identifies a notification message. 
                // If it is present, the same value is returned in the notification response. It must be a string that contains a UUID.
                // sendNotificationRequest.Headers.Add("X-MessageID", "<UUID>");

                // Create the toast message.
                var toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                   "<wp:Notification xmlns:wp=\"WPNotification\">" +
                      "<wp:Toast>" +
                           "<wp:Text1>" + message + "</wp:Text1>" +
                      "</wp:Toast> " +
                   "</wp:Notification>";
                // Set the notification payload to send.
                byte[] notificationMessage = Encoding.Default.GetBytes(toastMessage);

                // Set the web request content length.
                sendNotificationRequest.ContentLength = notificationMessage.Length;
                sendNotificationRequest.ContentType = "text/xml";
                sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");
                sendNotificationRequest.Headers.Add("X-NotificationClass", "2");


                using (var requestStream = sendNotificationRequest.GetRequestStream())
                
                    requestStream.Write(notificationMessage, 0, notificationMessage.Length);
                

                // Send the notification and get the response.
                var response = (HttpWebResponse)sendNotificationRequest.GetResponse();
                var notificationStatus = response.Headers["X-NotificationStatus"];
                var notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
                var deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];

                // Display the response from the Microsoft Push Notification Service.  
                // Normally, error handling code would be here. In the real world, because data connections are not always available,
                // notifications may need to be throttled back if the device cannot be reached.
                var rep = notificationStatus + " | " + deviceConnectionStatus + " | " + notificationChannelStatus;
                return rep;
            
            catch (Exception ex)
            
                return ex.ToString();
                // TextBoxResponse.Text = "Exception caught sending update: " + ex.ToString();
            

这是我在 uri 上向该服务发送的服务,但我不知道何时响应它会抛出异常“远程服务器返回错误:(400)错误请求。”但我不知道是什么uri 的类型将给出。在此 uri 中发送一个密钥,但将发送哪种类型的密钥请任何人回复我

【问题讨论】:

你试过谷歌吗? 是的@glorfindel。但我找不到任何有用的答案。请给我任何示例 您学习了哪个教程?哪里出了问题? @glorfindel。请找到上面的代码 你最好使用像 PushSharp 这样的公共库(就像下面的 @Rohit 建议的那样。)不要重新发明***! 【参考方案1】:

您可以查看PushSharp 它似乎已针对 Windows Phone 8 中的新通知负载格式进行了更新。Here 是用于从服务器发送推送通知的服务器代码,在此 link 您可以找到Windows Phone 的实现。

基本上,您的应用可能在 Windows Phone 8.1 中使用两种类型的推送通知。

    MPNS: Microsoft Push Notification Service

    WNS: Windows Notification Service.

MPNS 是在 Windows Phone 7 和 8 中使用的旧式通知服务。WNS 是 Windows 8 式通知,适用于专门针对 Windows Phone 8.1 的应用程序。 (Windows Phone Silverlight 8.1 应用和 Windows Phone 8.1(Windows 运行时)应用。

PushSharp 似乎支持两种类型的通知服务,PushSharp.WindowsPhone 库中的 MPNS 和 PushSharp.Windows 库中的 WNS。

同样值得一试 Azure。 这是相同的教程 => Send push notifications to authenticated users

【讨论】:

感谢 rohit,但我在 PushSharp 上面找不到任何链接,它会显示空白页面。请给我示例代码。实际上我使用的是 windows 运行时而不是 silverlight 模板。 请找到答案的更新。否则检查此链接 => github.com/Redth/PushSharp/blob/master/Client.Samples/…【参考方案2】:

以下是push notification for windows phone 所需的步骤。

    您的应用从推送客户端服务请求推送通知 URI。 Push 客户端服务与 Microsoft Push Notification Service (MPNS) 协商,MPNS 向 Push 客户端服务返回一个通知 URI。 Push 客户端服务将通知 URI 返回到您的应用程序。 然后您的应用可以将通知 URI 发送到您的云服务。 当您的云服务有信息要发送到您的应用时,它会使用通知 URI 向 MPNS 发送推送通知。 MPNS 将推送通知路由到您的应用。

请参阅this MSDN 页面以详细了解推送通知。

【讨论】:

【参考方案3】:

我尝试使用以下代码手动发送通知:

void SendToastMessage(string pushUri, string message)
        
            HttpWebRequest request =
                (HttpWebRequest)WebRequest.Create(pushUri);
            request.ContentType = "text/xml";
            request.Method = "POST";
            request.Headers.Add("X-MessageID", Guid.NewGuid().ToString());
            request.Headers.Add("X-NotificationClass", "2");
            request.Headers.Add("X-WindowsPhone-Target", "toast");
            string toastMessage = @"<?xml version=""1.0"" encoding=""utf-8""?>
                          <wp:Notification
                              xmlns:wp=""WPNotification"">
                              <wp:Toast>
                                <wp:Text1>0</wp:Text1>
                                <wp:Text2>1</wp:Text2>
                              </wp:Toast>
                          </wp:Notification>";
            string toastXml = string.Format(toastMessage,
                                  "sample:",
                                  message);
            byte[] notificationMessage = Encoding.UTF8.GetBytes(toastXml);
            request.ContentLength = notificationMessage.Length;
            using (Stream requestStream = request.GetRequestStream())
            
                requestStream.Write(notificationMessage,
                          0,
                          notificationMessage.Length);
            
            try
            
                HttpWebResponse response =
                (HttpWebResponse)request.GetResponse();

                return;
            
            catch (Exception ex)
            
                return;
            
        

一年前这段代码对我来说非常好用,现在仍然如此。但请确保您的 pushUri 正确。

【讨论】:

感谢@deeiip,但我不知道你会发送什么类型的 pushuri。请给我任何示例 uri

以上是关于如何发送推送通知 windows phone 8 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

通过asp.net windows phone 8发送推送通知

Windows Phone 8 推送通知 (MPNS) 服务器代码

使用 Azure 在 Windows phone 8 中推送通知

使用 Worklight 6.1 在 Windows Phone 8 上推送通知的 Toast

推送通知后台任务崩溃 Windows Phone 8.1 模拟器/设备

IBM Worklight 6.1 - 来自推送通知的磁贴徽章从未在 Windows Phone 8 上清除