【学习笔记】WP7推送通知(Notification)

这篇文章是从自己的个人网站转过来的,因为3月份个人网站就要关了





 //创建Channel
           httpChannel = new HttpNotificationChannel(channelName, "NotificationServers");

           //注册channel事件
           httpChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(httpChannel_ChannelUriUpdated);
  

在 ChannelUriUpdated 事件信息的 e中获取地址:          
	  void httpChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
     	  {
       	  Debug.WriteLine(e.ChannelUri);
     	  }

剩下的就是注册 Raw Toast Tile 以及Toast 和Tile的绑定(当程序没有运行的时候,在手机的主界面显示推送信息)

httpChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(httpChannel_ErrorOccurred);

            httpChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(httpChannel_HttpNotificationReceived);

            httpChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(httpChannel_ShellToastNotificationReceived);

            httpChannel.Open();

            //程序如果没有运行 则绑定消息 弹出对话框
            httpChannel.BindToShellToast();

            httpChannel.BindToShellTile();
        }

        void httpChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
        {
            string msg = "";
            foreach (var key in e.Collection.Keys)
            {
                msg += key + ":" + e.Collection[key] + Environment.NewLine;
            }
            Dispatcher.BeginInvoke(() =>
            {
                txt_msg.Text = msg;
            });
        }

        void httpChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
        {
            using (var reader=new StreamReader(e.Notification.Body))
            {
                string msg = reader.ReadToEnd();
                Dispatcher.BeginInvoke(() =>
                {
                    txt_msg.Text = msg;
                });
            }
        }

        void httpChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
        {
            Dispatcher.BeginInvoke(() =>
            {
                txt_msg.Text = e.Message;
            });
        }

 模拟一个服务器 像microsoft发送信息




switch (type)
            {
                case "Raw":
                    msg = Encoding.UTF8.GetBytes(txtSendMsg.Text);
                    break;
                case "Tile":
                    {
                        string tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                                                                    "<wp:Notification xmlns:wp=\"WPNotification\">"+
                                                                      "<wp:Tile>" +
                                                                        "<wp:BackgroundImage>/Images/Cloudy.png</wp:BackgroundImage>" +
                                                                        "<wp:Count>28</wp:Count>"+
                                                                        "<wp:Title>AnthemSord</wp:Title>" +
                                                                      "</wp:Tile>"+
                                                                    "</wp:Notification>";
                        msg = Encoding.UTF8.GetBytes(tileMessage);
                        notificationType = NotificationType.Tile;
                    }
                    break;
                case "Toast":
                    {
                        string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                                                                  "<wp:Notification xmlns:wp=\"WPNotification\">" +
                                                                    "<wp:Toast>" +
                                                                      "<wp:Text1>AnthemSord:</wp:Text1>" +
                                                                      "<wp:Text2>"+txtSendMsg.Text+"</wp:Text2>" +
                                                                    "</wp:Toast>" +
                                                                  "</wp:Notification>";
                        msg = Encoding.UTF8.GetBytes(toastMessage);
                        notificationType = NotificationType.Toast;
                    }
                    break;
                default:
                    break;
            }
            SendNotifications(msg,notificationType);
  
 
 下面是post数据对request的一些格式参考,我直接把SendNotifications 函数的代码全部写上吧,不难看,很简单

          
private void SendNotifications(byte[] msg,NotificationType type)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(txtUri.Text);
            
            request.Method = WebRequestMethods.Http.Post;
            
            request.Headers["X-MessageID"] = Guid.NewGuid().ToString();
            
            request.ContentType = "text/xml;charset=utf-8";

            switch (type)
            {
                case NotificationType.Raw:
                    {
                        //3:立即发送
                        //13:等待450秒后发送
                        //23:等待900秒后发送
                        request.Headers.Add("X-NotificationClass", "3");
                    }
                    break;
                case NotificationType.Tile:
                    {
                        //1:立即发送
                        //11:等待450秒后发送
                        //21:等待900秒后发送
                        request.Headers.Add("X-WindowsPhone-Target", "token");
                        request.Headers.Add("X-NotificationClass", "1");
                    }
                    break;
                case NotificationType.Toast:
                    {
                        //2:立即发送
                        //12:等待450秒后发送
                        //22:等待900秒后发送
                        request.Headers.Add("X-WindowsPhone-Target", "toast");
                        request.Headers.Add("X-NotificationClass", "2");
                    }
                    break;
                default:
                    break;
            }
            

            using (Stream stream=request.GetRequestStream())
            {
                stream.Write(msg, 0, msg.Length);
            }

            HttpWebResponse respones = (HttpWebResponse)request.GetResponse();
            string notificationStatus = respones.Headers["X-NotificationStatus"];
            string notificationChannelStatus = respones.Headers["X-SubscriptionStatus"];
            string deviceConnectionStatus = respones.Headers["X-DeviceConnectionStatus"];
            MessageBox.Show(string.Format("通知状态:{0},管道状态:{1},连接状态:{2}",notificationStatus,notificationChannelStatus,deviceConnectionStatus));
        }

看过林永坚哥哥的视频应该很熟悉这个,我对推送这个东西非常有感觉,所以也自己动手试一试,不知道我为什么就对推送这么“兴奋” --!可能受iPhone的影响吧~当然这篇文章是作为笔记发表的,哈哈:)


个人网站的水印我现在发现很恶心啊~


现在楼主再用WPF开发项目,所以都木有很多时间来了解WP7的东东,很希望和大家交流和请教大家额~:)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值