wp推送消息笔记

最近想给应用添加推送消息,主要是toast消息,所以就打算去了解一下wp消息推送机制以及实现方法,过程中,查了许多资料,也遇到过一些问题,做完后,自己就做个小笔记,总结一下,好记性不如烂笔头嘛,以后可以回头看看,也方便多了,废话不多说!

wp消息推送机制

用一幅图说明,因为官方是英文的,自己在上面添加了一些中文的解析上去,方便大家去理解!

这幅图的核心内容是,当你的应用请求手机Uri(注意:这里uri相当于一个ip或者一个物理地址,是唯一性的一个标识),手机的客户端服务会与微软推送中心联系,然后返回一个uri给客户端推送服务,然后客户端服务再把这个uri给你的应用,你的应用再把这个uri发回来给你的服务器,然后你的服务器再把这个uri和需要发送的消息发送给微软推送中心,最后微软推送中心再根据这个uri,把消息推送到指定的手机!

toast消息推送(wp端)

这个我不想多解释,直接上推送代码,下面的代码主要是查看在应用程序的早期实例中是否已设置 Toast 通知通道。如果找到通知通道,则通知通道连接到通知事件。如果未找到通知通道,则创建通知通道,然后将其连接到通知事件

 // 构造函数
        public MainPage()
        {
            HttpNotificationChannel myChannel = null;
            // 推送信道的名字,随便取一个就行了
            string ChannelName = "ToastChannel";
            InitializeComponent();
            // Find静态方法可以根据名字查找信道
            myChannel = HttpNotificationChannel.Find(ChannelName);
            // 因为系统有时候会删除通道,所以要判断是否存在,如果找不到,就要创建一个了
            if (myChannel == null)
            {
                myChannel = new HttpNotificationChannel(ChannelName);
                // 注册事件
                myChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
                myChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);
                myChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(myChannel_ShellToastNotificationReceived);
                // 打开信道
                myChannel.Open();
                // 绑定Toast通知,这样在程序不在前台时才会显示
                // 屏幕上方的通知提示条
                myChannel.BindToShellToast();
            }
            else
            {
                // 如果存在,还要注册一次事件,因为在程序被扔到后台后可能会删除事件绑定
                myChannel.ChannelUriUpdated+=new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
                myChannel.ErrorOccurred+=new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);
                myChannel.ShellToastNotificationReceived+=new EventHandler<NotificationEventArgs>(myChannel_ShellToastNotificationReceived);  

                // 在“输出”窗输出URL,因为我们只是测试,这样一来方便一点
                System.Diagnostics.Debug.WriteLine("通道URI为:{0}", myChannel.ChannelUri.ToString());
            }
        }  

        void myChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
        {
//这里主要是当用户正在使用你的应用,而你刚好推送消息过来,执行此方法
            string msg = "";
            foreach (string key in e.Collection.Keys)
            {
                msg += key + " : " + e.Collection[key] + "\r\n";
            }
            Dispatcher.BeginInvoke(() =>
                {
                    this.txtInfo.Text = msg;
                });
        }  

        void myChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
        {
            Dispatcher.BeginInvoke(() => MessageBox.Show(e.Message));  //错误产生的时候,执行这里面内容,实际情况,可以根据 自己需要处理
        }  

        void myChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
        {
            // 当URL发生改变后,还要输出一次
            // 保证我们得到的是最新版本的URI
            Dispatcher.BeginInvoke(() =>
            {
                System.Diagnostics.Debug.WriteLine("通道URI:{0}", e.ChannelUri.ToString());
            });
        }  

toast消息推送(server端)

这里我创建一个 ASP.NET 网页,该网页使用在设备上创建推送通道时返回的 URI 来发送 Toast 通知,当然你可以使用任何能发送网络消息的应用来推送,如winform jsp  php等等

具体推送消息代码如下:

    private void SendMsg()
        {
            //txtUrl.Tex该参数是手机的uri,要推送消息,首先要确定你要推送用户手机的uri
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(txtUrl.Text);
            myRequest.ContentType = "text/xml";
            myRequest.Headers.Add("X-WindowsPhone-Target", "toast");
            /*
             *   X-NotificationClass 处理间隔
             *   2 - 立即发送
             *   12 - 450秒内发送
             *   22 - 900秒内发送
             */
            myRequest.Headers.Add("X-NotificationClass", "2");

            // 要发送的内容  txtValue1.Text:标题,txtValue2.Text:推送内容,txtParam.Text:当用户点击消息的时候,导航的页面,如mainpage.xaml
            string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
            "<wp:Notification xmlns:wp=\"WPNotification\">" +
                "<wp:Toast>" +
                    "<wp:Text1>" + txtValue1.Text + "</wp:Text1>" +
                    "<wp:Text2>" + txtValue2.Text + "</wp:Text2>" +
                    "<wp:Param>" + txtParam.Text + "</wp:Param>" +
                "</wp:Toast>" +
            "</wp:Notification>";

            byte[] buffer = Encoding.UTF8.GetBytes(toastMessage);//注意此处官方是Encoding.default.GetBytes(toastMessage),我在使用的过程中,老是报错,下面会说原因

            myRequest.ContentLength = buffer.Length;
            myRequest.Method = "POST";

            using (Stream stream = myRequest.GetRequestStream())
            {
                stream.Write(buffer, 0, buffer.Length);
            }

            // 发送消息和获取回应
            HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse();
            string notificationStatus = response.Headers["X-NotificationStatus"];
            string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
            string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];

           //判断是否成功推送到微软推送服务中心
            // TextBoxResponse.Text = notificationStatus + " | " + deviceConnectionStatus + " | " + notificationChannelStatus;
            if (notificationStatus == "Received" && deviceConnectionStatus == "Connected" && notificationChannelStatus == "Active")
            {
                success++;
            }
        }

总结和注意

(1)  其中<wp:Param>" + txtParam.Text + "</wp:Param>,当param内容为空时,可以省略不写这一节点。同时,在xml中一些字符是要进行转换的:

<Text1> 和 <Text2> 都采用字符串格式。

<Param> 值允许以下格式:

  • /page1.xaml – 定义应用程序启动时导航到的应用程序中的页面。该页面必须以“/”开头。
  • /page1.xaml?value1=1234 &amp;value2=9876 – 定义应用程序启动时导航到的页面,以及信息的名称/值对。该页面必须以“/”开头。
  • ?value1=1234 &amp;value2=9876 – 包含传递给应用程序默认开始页面的信息名称/值对。该页面必须以“?”开头。

字符


XML 编码


<


&lt;


>


&gt;


&


&amp;



&apos;



&quot;

(2)  当服务端发送的toast通知中有xml格式错误或者非法内容时,微软推送服务会关闭此通道,并提示出错。我在运行时老是报错(“The XML payload contains invalid or improperly formatted XML or the notification type specified in the header does not match the payload type used.  The channel has been closed.  Check your XML payload for errors and reopen the channel to obtain a new URI.”)。

经过查资料,我把里面的Encoding.default.GetBytes(toastMessage)改为Encoding.UTF8.GetBytes(toastMessage),这样就把不报错了,此处可能是官方示例代码有些问题。

(3)  我们Server端想统计推送的成败情况的话,会比较困难。因为从微软推送服务中返回的相应代码中,只是简单的反映了推送通知到达代理服务器的情况,而非通知到达客户端时的结果。比如微软的代理服务器返回了响应码200,我们Server端只是知道了信息已经成功到达了它那里,并且符合转发到客户端程序的条件;至于客户端最终是否真的收到了通知,无法从这里获知。当然,当客户端程序接收到了通知后,可以向Server端汇报,但这并不准确,因为有些信息可能因为程序不在前台运行同时又被用户忽略了,此处我直接以三个信息头X-NotificationStatus  X-SubscriptionStatus  X-DeviceConnectionStatus来判断是否成功发到微软的推送中心来判断是否发送成功,至于有其他更准确方案,知道的话,请告诉我!

wp推送消息笔记

时间: 2024-10-06 00:48:12

wp推送消息笔记的相关文章

Windows phone Toast消息推送 学习笔记

简单介绍: Windows phone平台支持三种形式的推送通知: 1.Tile——也就是在Start屏幕程序平铺图标 2.Toast——创建一个显示在当前屏幕中的Toast弹出窗口 3.Raw——有应用程序自己来处理的通知:对于用户是透明的. 这三种推送的过程是相同的,都涉及到三方:Windows phone应用程序.基于云的通知服务(Notification Service,由微软提供).通知源. 推送通知的过程如下图所示: 顺序如下:1.具有消息推送功能的应用发出消息推送 2.向微软推送通

(转)移动端主动推送消息原理

转:https://www.zhihu.com/question/19628406/answer/77205019 一.服务端主动推送消息到客户端过程 作者:谢泽帆   李琰链接:https://www.zhihu.com/question/24938934/answer/85359794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 服务端主动推送到客户端是怎么一个过程 目前服务端给客户端推送,普遍做法是客户端与服务端维持一个长连接,客户端定时向服务端发送心跳以

signalr推送消息

参考:Tutorial: Getting Started with SignalR 2 and MVC 5 环境:vs2013,webapi2,entity framework6.0 实现效果:当用户上传一个文件时候,推送消息给关注此用户的其他用户,告知此用户上传了一个新的文件. 推送原理:当前端用户打开网页时候,SignalR 服务端会自动生成一个guid类型的ConnectionId.此ConnectionId用来连接确定用户端,用来确定发送给哪个当前在线用户.当要推送消息时候,后端方法会根

DWR实现服务器向客户端推送消息

原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人.只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始: 第一.在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下: <servlet> <servlet-name>dwr-invoker</servle

点击推送消息跳转处理(iOS)

当用户点击收到的推送消息时候,我希望打开APP,并且跳转到对应的界面,这就需要在AppDelegate里面对代理方法进行处理. 当用户点击推送消息打开APP的时候会调用 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions launchOptions中会有推送消息的userInfo信息,此时我们可以通过 NSDictionary* rem

推送消息

APNS(Apple Push Notification Services)苹果专门的推送服务器 接收我们自己应用服务器需要被推送的消息 然后推送到我们的手机 手机通知我们的应用程序 注册的大概流程: 1 设备需要向APNS服务器注册 2 注册成功后返回device_token值 3 将这个token值发送给我们自己的服务器 4 有需要推送的消息时  自己的服务器将消息按一定的格式打包 结合token值发送给APNS服务器 5 由于App与APNS维持一个基于TCP的长连接 APNS将消息推送到

iOS极光推送 点击推送消息跳转页面

文章来自:http://www.jianshu.com/p/eaf07c4372a8 AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1 if ([[UIDevice currentDevice].s

ios如何实现远程推送消息

远程推送可以解决 当用户关闭程序的时候 不能收到推送消息.当客户端使用了远程推送的功能,不管用户有没有关闭程序,都能收到 服务器推送的消息. 苹果实现远程推送 是基于长连接的, 默认情况下 苹果的所有设备都是和 苹果的apns服务器建立长连接的, 只要设备已经联网. 长连接的好处: 苹果服务器可以主动向 客户端发送消息, 也可以找回我的设备(当设备丢失时). 远程推送的步骤: 客户端向苹果服务器获取deviceToken步骤:客户端将 BundleId 和 设备UDID 发送给苹果Apns服务器

Qt通过极光推送向app推送消息

简介 最近在做个项目,当客服端收到防盗的消息通知时向手机app推送一个消息,告知有防盗报警.这么小的功能没必要自己写个推送端,极光推送免费而且推送的成功率高,已经能满足我们的需求了. 极光推送的文档大家可以到极光推送的官网查看(http://docs.jiguang.cn/),由于我们这是是使用Qt C++开发的极光推送并没有提供c++的封装,这里我们选择rest API的方式推送,rest API的推送方式的demo以及json格式在http://docs.jiguang.cn/server/