Windows Phone开发(45):推送通知大结局之Raw通知

移动开发
Raw推送通知比起前面两种更简单,因为它没有规范的格式,只要你向指定URI POST一个字节流数组就OK,也就是说,只要能变成byte[]的东西都可以发送。不过,不应该发送过大的数据,一般用于发送一些简短的文本信息就行了,别想着用来发送文件!

为什么叫大结局呢?因为推送通知服务就只有三种,前面扯了两种,就剩下一种——Raw通知。

前面我们通过两节的动手实验,相信大家都知道了,推送通知其实并不复杂,为什么呢?你看到了的,不管是哪种方式,使用方法基本一样,如果你不愿意写代码的话,完全可以把代码Copy几下就完事了,三种推送通知的实现代码是一样的,而仅仅是发送的内容不同罢了。

Raw推送通知比起前面两种更简单,因为它没有规范的格式,只要你向指定URI POST一个字节流数组就OK,也就是说,只要能变成byte[]的东西都可以发送。不过,不应该发送过大的数据,一般用于发送一些简短的文本信息就行了,别想着用来发送文件!!

严重提醒:要接收Raw通知,你的WP应用程序必须在前台运行,不然是收不到的,之与Toast通知可不一样,如果你的程序不在前台运行,推送的通知就会被XX掉。

好了,F话就不说了,开始操练吧。

先做发送通知的服务器端,这回就用WPF来做吧,界面我先截个TU。

这就是用WPF的好处,截图中大家未必能看到窗口上用到哪些控件,设置了哪些属性,但是,如果我把XAML一贴,我想大家就懂了。

  1. <Window x:Class="RawNtfServer.MainWindow"   
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
  4.         Title="Raw通知服务器端" Height="350" Width="525">   
  5.     <Grid>   
  6.         <Grid.RowDefinitions>   
  7.             <RowDefinition Height="Auto" />   
  8.             <RowDefinition />   
  9.             <RowDefinition />   
  10.         </Grid.RowDefinitions>   
  11.         <Grid Grid.Row="0">   
  12.             <Grid.ColumnDefinitions>   
  13.                 <ColumnDefinition Width="auto"/>   
  14.                 <ColumnDefinition Width="*"/>   
  15.                 <ColumnDefinition Width="auto"/>   
  16.             </Grid.ColumnDefinitions>   
  17.             <TextBlock Grid.Column="0" Text="目标URI:" VerticalAlignment="Center"/>   
  18.             <TextBox Name="txtUri" Grid.Column="1" Margin="2" Background="#FFD8E4E4"/>   
  19.             <Button Grid.Column="2" Padding="8,3,8,3" Margin="7,2,3,2" Content="发送" Click="OnSend"/>   
  20.         </Grid>   
  21.         <GroupBox Grid.Row="1" Header="发送内容">   
  22.             <TextBox VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" Name="txtMsg" Background="#FFECF4D7" />   
  23.         </GroupBox>   
  24.         <GroupBox Grid.Row="2" Header="回应内容">   
  25.             <TextBox Name="txtResp" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" Background="#FFC9EDFA" />   
  26.         </GroupBox>   
  27.     </Grid>   
  28. </Window>   

好,前台干好了,去搞搞后台吧。

  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Text;   
  5. using System.Windows;   
  6. using System.Windows.Controls;   
  7. using System.Windows.Data;   
  8. using System.Windows.Documents;   
  9. using System.Windows.Input;   
  10. using System.Windows.Media;   
  11. using System.Windows.Media.Imaging;   
  12. using System.Windows.Navigation;   
  13. using System.Windows.Shapes;   
  14. using System.Net;   
  15. using System.IO;   
  16. using System.Net.Mime;   
  17. namespace RawNtfServer   
  18. {   
  19.     /// <summary>   
  20.     /// MainWindow.xaml 的交互逻辑   
  21.     /// </summary>   
  22.     public partial class MainWindow : Window   
  23.     {   
  24.         public MainWindow()   
  25.         {   
  26.             InitializeComponent();   
  27.         }   
  28.         private void OnSend(object sender, RoutedEventArgs e)   
  29.         {   
  30.             if (txtUri.Text==""||txtMsg.Text=="")   
  31.             {   
  32.                 MessageBox.Show("请输入必备的参数。"); return;   
  33.             }   
  34.             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(txtUri.Text);   
  35.             request.Method = WebRequestMethods.Http.Post;   
  36.             request.ContentType = MediaTypeNames.Text.Plain;   
  37.             // HTTP标头:   
  38.             // X-NotificationClass:3   
  39.             // 3:立即发送   
  40.             // 13:450秒后发送   
  41.             // 23:900秒后发送   
  42.             request.Headers.Add("X-NotificationClass""3");   
  43.             byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);   
  44.             request.ContentLength = buffer.Length;   
  45.             using (Stream s = request.GetRequestStream())   
  46.             {   
  47.                 s.Write(buffer, 0, buffer.Length);   
  48.             }   
  49.             // 接收响应   
  50.             HttpWebResponse response = (HttpWebResponse)request.GetResponse();   
  51.             string hds = "";   
  52.             foreach (string key in response.Headers.AllKeys)   
  53.             {   
  54.                 hds += key + " : " + response.Headers.Get(key) + "\r\n";   
  55.             }   
  56.             txtResp.Text = hds;   
  57.         }   
  58.     }   
  59. }   

有没有觉得代码很熟悉?和前两节中的例子像不?

好了,服务器端Done,下面轮到WP客户端了。

布局不用TU了,放心,无图有真相。上XAML。

  1. <!--ContentPanel - 在此处放置其他内容-->   
  2. <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">   
  3.     <ListBox Name="lbMsg"/>   
  4. </Grid> 

简单吧,就一个控件——ListBox,待会儿我们接受到的通知,就扔到它里面。

OK,看看后台的C#代码。

  1.     using System;   
  2.     using System.Collections.Generic;   
  3.     using System.Linq;   
  4.     using System.Net;   
  5.     using System.Windows;   
  6.     using System.Windows.Controls;   
  7.     using System.Windows.Documents;   
  8.     using System.Windows.Input;   
  9.     using System.Windows.Media;   
  10.     using System.Windows.Media.Animation;   
  11.     using System.Windows.Shapes;   
  12.     using Microsoft.Phone.Controls;   
  13.     using Microsoft.Phone.Notification;   
  14.     namespace WPClient   
  15.     {   
  16.         public partial class MainPage : PhoneApplicationPage   
  17.         {   
  18.             // 构造函数   
  19.             public MainPage()   
  20.             {   
  21.                 InitializeComponent();   
  22.                 HttpNotificationChannel Channel = null;   
  23.                 string ChannelName = "raw";   
  24.                 Channel = HttpNotificationChannel.Find(ChannelName);   
  25.                 if (Channel==null)   
  26.                 {   
  27.                     Channel = new HttpNotificationChannel(ChannelName);   
  28.                     Channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(Channel_ChannelUriUpdated);   
  29.                     Channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(Channel_ErrorOccurred);   
  30.                     Channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(Channel_HttpNotificationReceived);   
  31.                     Channel.Open();   
  32.                 }   
  33.                 else   
  34.                 {   
  35.                     Channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(Channel_ChannelUriUpdated);   
  36.                     Channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(Channel_ErrorOccurred);   
  37.                     Channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(Channel_HttpNotificationReceived);   
  38.                     System.Diagnostics.Debug.WriteLine("URI: {0}", Channel.ChannelUri.ToString());   
  39.                 }   
  40.             }   
  41.             void Channel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)   
  42.             {   
  43.                 string msg = "";   
  44.                 using (System.IO.Stream stream=e.Notification.Body)   
  45.                 {   
  46.                     System.IO.StreamReader rd = new System.IO.StreamReader(stream, System.Text.Encoding.UTF8);   
  47.                     msg = rd.ReadToEnd();   
  48.                 }   
  49.                 Dispatcher.BeginInvoke(() =>   
  50.                     {   
  51. this.lbMsg.Items.Add(DateTime.Now.ToLongTimeString() + "  " + msg);   
  52.                     });   
  53.             }   
  54.             void Channel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)   
  55.             {   
  56.                 Dispatcher.BeginInvoke(() =>   
  57.                     {   
  58.                         MessageBox.Show(e.Message);   
  59.                     });   
  60.             }   
  61.             void Channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)   
  62.             {   
  63.                 Dispatcher.BeginInvoke(() =>   
  64.                     {   
  65.                         System.Diagnostics.Debug.WriteLine("URI: {0}",e.ChannelUri.ToString());   
  66.                     });   
  67.             }   
  68.         }   
  69.     }   

避免有朋友说代码看不懂,这回我是Ctrl + A后再贴出来的。

下面来执行一下,首先运行WP端,可以同时运行,随你喜欢。但至少要让WP模拟器或手机收到云服务器分配的URI。

把这个URI复制,填到服务器端的窗口中,然后输入你要发送的东东,点击“发送”。

嗯,就是这样用,应该不复杂吧?

在收发消息的过程中,编码时建议使用UTF-8,貌似这个不会有乱码。

哈,牛就吹到这了,下一节我们玩一玩比较恐怖的东西——Socket。

责任编辑:闫佳明 来源: oschina
相关推荐

2013-04-25 14:15:53

Windows PhoWindows PhoWindows Pho

2012-08-16 11:31:30

Windows Pho

2013-04-25 14:05:20

Windows PhoWindows PhoWindows Pho

2011-08-03 16:45:09

iPhone APNS 推送通知

2020-03-04 14:35:34

戴尔

2011-04-06 09:33:40

Push动互联网

2020-03-11 16:00:55

戴尔

2013-11-27 10:52:48

360腾讯

2013-07-31 13:13:50

Windows PhoMVVM模式

2010-08-01 15:16:41

Android

2013-04-24 13:43:10

Windows Pho动画PointAnim

2013-04-19 17:11:02

Windows PhoWindows Pho

2013-04-24 13:31:59

Windows Pho动画之ColorAni

2013-04-24 13:19:06

Windows Pho动画DoubleAni

2011-07-18 13:56:19

2011-05-04 14:40:57

推送通知iOS

2013-04-23 16:55:15

Windows Pho路径之其它Geomet

2013-07-31 13:36:07

Windows PhoVS调试技巧Windows Pho

2019-06-11 17:53:35

技术

2024-03-12 10:05:04

应用程序推送通知
点赞
收藏

51CTO技术栈公众号