Windows phone Toast消息推送 学习笔记

简单介绍:

  Windows phone平台支持三种形式的推送通知:

    1.Tile——也就是在Start屏幕程序平铺图标

    2.Toast——创建一个显示在当前屏幕中的Toast弹出窗口

    3.Raw——有应用程序自己来处理的通知:对于用户是透明的。

  这三种推送的过程是相同的,都涉及到三方:Windows phone应用程序、基于云的通知服务(Notification Service,由微软提供)、通知源。
  推送通知的过程如下图所示:

  顺序如下:1、具有消息推送功能的应用发出消息推送
       2、向微软推送通知服务(MPNS)请求URI,并返回推送通知的URI(此URI是根据设备、手机应用程序、通道名称组合而成的唯一标识)
       3、应用拿到URI
       4、将拿到的URI告诉通知云服务(也就是通知源)
       5、如果云服务(通知源)有要传给Windows phone应用的通知,便通过此URI想MPNS发送Post请求,其中也就包含了推送的消息内容
       6、接着就是MPNS向对应URI的设备发送推送通知

Toast推送通知

    Toast推动通知显示的样式如下:

      它由三部分构成:1、Title。也就是截图中显示的 “标题” 部分。紧挨着你的应用的图标。在XML中(通知源发送过来的消息是将XML内容编码后传送的),该字符串定义为Text1属性

              2、Content。图中的 ”内容" 部分。在XML中,定义为Text2属性

              3、Parament。指的是参数,点击Toast后,会把这个参数传给你的应用程序。其中可以指示你要启动的你应用中的页面,还可以带有名称-值对,在应用中可以进行使用。在XML中定义为Param属性。

代码

  手机应用程序端
  

 1            /// 推送通知信道
 2             HttpNotificationChannel pushChannel;
 3
 4             // 信道的名称,可以自行命名
 5             string channelName = "ToastSampleChannel";
 6
 7             // 去找某个名称的信道,若是有返回一个HttpNotificationChannel类型的信道,没有找到几位null
 8             pushChannel = HttpNotificationChannel.Find(channelName);
 9
10             // 没找到的话,就以此名称创建一个信道
11             if (pushChannel == null)
12             {
13                 pushChannel = new HttpNotificationChannel(channelName);
14
15                 // 新到的Uri更新时触发该事件,此事件一定要注册
16                 pushChannel.ChannelUriUpdated +=PushChannel_ChannelUriUpdated;
17                 //为了提高系统的容错,可以进行错误的捕获
18                 pushChannel.ErrorOccurred += PushChannel_ErrorOccurred;
19
20                 // 这个事件注册是可选的,当推送通知来了,程序正在运行,则会引发该事件,在此处可随意对传来的消息进行处理
21                 pushChannel.ShellToastNotificationReceived += PushChannel_ShellToastNotificationReceived;
22                 //打开通道
23                 pushChannel.Open();
24
25                 // 将通道绑定到Toast推送通知,否则
26                 pushChannel.BindToShellToast();
27
28             }
29             else//通道已经存在,则不需要继续新建信道,直接注册时间即可
30             {
31                 pushChannel.ChannelUriUpdated += PushChannel_ChannelUriUpdated;
32                 pushChannel.ErrorOccurred += PushChannel_ErrorOccurred;
33
34                 pushChannel.ShellToastNotificationReceived += PushChannel_ShellToastNotificationReceived;
35
36                 // 当测试的时候显示通道的URI
37 System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString());
38
39             }
40         }
41
42         void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
43         {
44
45             Dispatcher.BeginInvoke(() =>
46             {
47                 // 当测试的时候显示通道的URI
48 System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());
49                 MessageBox.Show(String.Format("Channel Uri is {0}",
50                     e.ChannelUri.ToString()));
51
52             });
53         }
54         void PushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
55         {
56             // 推送通知中的错误处理,此处就是简单进行显示
57             Dispatcher.BeginInvoke(() =>
58                 MessageBox.Show(String.Format("A push notification {0} error occurred.  {1} ({2}) {3}",
59                     e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData))
60                     );
61         }
62         void PushChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
63         {
64             StringBuilder message = new StringBuilder();
65             string relativeUri = string.Empty;
66
67             message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());
68
69             // 显示传动过来的消息,以名称-值得方式
70             foreach (string key in e.Collection.Keys)
71             {
72                 message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);
73
74                 if (string.Compare(
75                     key,
76                     "wp:Param",
77                     System.Globalization.CultureInfo.InvariantCulture,
78                     System.Globalization.CompareOptions.IgnoreCase) == 0)
79                 {
80                     relativeUri = e.Collection[key];
81                 }
82             }
83
84             // Display a dialog of all the fields in the toast.
85             Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()));
86
87         }                

以上代码是微软给的示例代码,进行了简单的说明。

提醒:1、为了更方便的使用推送通知,可以将以上代码写在一个类中,还可以增强他的功能。比如程序中加入可以控制是否需要通知的CheckButton按钮等

     2、如果想在跳转到的页面中提取Param中的其他信息的话,可以使用类似这样的代码(其中NavigateFrom和Other是Param参数中加入的名称-值对中的名称,当然要随着通知源做相应的修改):

if (NavigationContext.QueryString.TryGetValue("NavigateFrom", out _navigateFrom))
 {
     _otherThing= NavigationContext.QueryString["Other"];
}

  通知源端

  这部分的代码就不贴了,大家可以参考MSDN中相应的内容
  看一下发送的消息的格式:

         string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<wp:Notification xmlns:wp=\"WPNotification\">" +
                   "<wp:Toast>" +
                        "<wp:Text1>" + TextBoxTitle.Text.ToString() + "</wp:Text1>" +
                        "<wp:Text2>" + TextBoxSubTitle.Text.ToString() + "</wp:Text2>" +
                        "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +
                   "</wp:Toast> " +
                "</wp:Notification>";

其中就包含了上面所说的Toast含有的三个属性:Text1(标题)、Text2(内容)、Param(参数)。

  注意:1、Param中可以有一个.xaml页面,就是即将跳转到的页面;后面跟的就是名称-值对(可以包含多对,但每个名称-值对之间要使用 “&amp” 来加以区分;如果此处Param中名称-值对使用的是 “&” ,就还需要代码进行转义符处理)。

     2、如果想推送中文的消息,注意在编码的时候使用UTF8进行编码,如同

byte[] notificationMessage = Encoding.UTF8.GetBytes(toastMessage);

3、还要注意推送消息的长度也有一定的限制,否则会产生现实问题、或是推送不了等。

用时:1h15m  (哎写的太慢了)

时间: 2024-09-28 16:37:12

Windows phone Toast消息推送 学习笔记的相关文章

消息推送学习一、原生Socket的使用

消息推送也是客户端和服务器连接然后进行交互的一种形式,但是不同于HTTP的连接,这种连接需要长时间的进行,当有消息时可以及时推送到客户端.除此之外还有多个用户,可能需要针对其身份进行不同的推送等等要求.而这种连接的形式在Java中可以使用Socket进行实现. 一.第一版: 1.首先是服务器部分,重要的操作说明 ①使用ServerSocket可以开启服务器上的一个端口进行连接监听,类似于服务器监听80端口. ②使用accept(),阻塞式的等待客户端的接入.接入成功时返回连接的Socket对象.

Android开发笔记(一百零四)消息推送SDK

推送的集成 常用概念 推送:从服务器把消息实时发到客户端app上,这就是推送,推送可用于发送系统通知.发送推荐信息.发送聊天消息等等. 别名:用于给移动设备取个好记的名字,比如电脑有计算机名,可以把别名理解为开发者给移送设备起的外号.不过,多个移动设备可以起一样的别名,这几个设备就会同时收到发给该别名的消息. 标记:用于给移动设备打标签,可以理解为分类,比如超市里的泰国大米既可以打上"粮食制品"的标签,也可以打上"进口商品"的标签.服务器可以统一给某个种类的移动设备

Xamarin学习系列之极光消息推送

一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin.Forms(Android)怎么集成极光推送 准备工作: 1.了解极光推送原理:https://docs.jiguang.cn/jpush/client/Android/android_sdk/ 2.下载极光官方Android SDK :https://docs.jiguang.cn/jpush/r

redis 学习 五 消息推送

<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publish.php */ //发布 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('msg', '来自msg频道的推送'); echo "msg频道消息推送成功- \n"; $re

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo

使用swoole进行消息推送通知,配合vb.net进行客户端开发一样爽

在以前的项目中,就曾听说过swoole的大名,想用来进行消息推送,但是当时只是有了初步的了解,并不敢大胆的运用到线上产品.所谓 识不足则多虑,威不足则多怒.所以就是怕,只能跟领导说了运用极光的推送功能,而且还说出了一定的理由,领导自然也只有相信了,那就用极光推送吧! 最近闲来无事,又重新温习了一下swoole的消息通知功能,虽然在项目开发当时,也曾实现过简单的操作的,但是这次温习更加深了学习,配合vb.net进行开发,感觉还是棒棒哒,下面是一套实现过程,如有需要参考,请拿去,不谢! 首先,我的开

友盟消息推送初试

注册与下载sdk略过,直接贴代码 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.monta.paopao" android:versionCode="1" android:versionName=

Ios 消息推送

手把手教你做iOS推送 http://www.cocoachina.com/industry/20130321/5862.html http://www.cnblogs.com/cdts_change/p/3240893.html OS消息推送机制的实现 http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html IOS学习笔记—苹果推送机制APNs http://www.cnblogs.com/taintain1984/p

背水一战 Windows 10 (121) - 后台任务: 推送通知

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 推送通知 示例演示如何接收推送通知/WebApi/PushNotificationController.cs /* * 演示如何向 app 推送通知 * 由于本例没有上商店,所以本例是无法演示的,需要看演示效果的话运行一下自己写的“打字通”的 /TypingGame/PushNotification/Sample.xaml,然后用其生成的 channel 地址在 /WebApi/Controllers/Push