继续前面的话题,还是推送通知。上一篇文章中遗留了RAW通知的推送没有给各位演示,特特地留到现在,不为别的,只为这个RAW通知有点意思,玩起来会比较有意思。官方文档将RAW通知译为“原始通知”,这里还是沿用官方的翻译。

在开始吹牛之前,先说一说与推送通知相关的要点。

有人说,如果我有22222222个客户端,岂不是都要获取每个手机客户端的通道URL来推送吗?是的。于是有人想到了所谓的“极光推送”,忽悠人的,“极光”显然偷换了概念。我们得明确,在什么情况下才会考虑使用推送。

推送好比服务器与手机客户端的“私人对话”,即当我们要为每一位客户发送个性化的消息时,才叫推送,说白了,就是每个用户收到的消息不相同,比如QQ就是这情况,每人的聊天记录都不相同。要是你打算向所有客户发送相同的信息,就不应该使用推送,使用更简单处理的Socket通信、或干脆用Web/WCF服务,把消息放到服务上,每个客户端自动去读取。你可以结合后台任务,特别计划后台,可以控制信息更新的频率(比如每天获取一次),获取到更新信息再通过Toast或磁贴来提醒一下用户就好了。

==============================================================

好了,废话结束,下面是正文。

RAW通知比较灵活,它不像Toast、磁贴、锁屏通知那样需要严格遵守固定的XML格式,RAW通知的内容或结构都可以自己来定义,然后把通知内容POST到推送通道URL即可,在发送时建议使用UTF-8编码,这样遇到中文字符也不至于在客户端收到乱码,别然并不绝对地说一定会变成乱码,但是谨慎一点肯定不是坏事。

在手机客户端,一般我们会结合后台任务来接收RAW通知,这样做的好处在于:

1、后台任务可以独立、有计划、有条件地运行,既不受前台UI影响,也不至于影响系统性能。大家都知道,WP手机是必须保持它刷刷刷地流畅的,不能因为我们开发的应用让系统不再刷刷刷,这样很不好。

2、有了后台接收,就算应用不在运行,都可以保证收到通知,前提是要有网络可用。

好,我想一想,给大家做个什么演示好呢?这样吧,为了使示例更容易理解,假设我的服务器端是一个电子商务平台,专门销售山寨七匹林男装的,每当有新的山寨品上架,服务会自动通知指定客户优惠打折的通知,我们就用RAW通知来实现。

1、启动VS,新建一个WP 8.1 应用程序。

2、在解决方案中添加一个“Windows 运行时组件”的项目,如下图。

注意,是Windows运行时组件,不是类库,不要创建类库项目。

项目名字你自己取,比如叫“后台怪兽”也行。这个windows 运行时组件项目用来定义咱们的后台任务。

3、声明一个类,并且这个类必须实现Windows.ApplicationModel.Background.IBackgroundTask接口,这个接口包含一个Run方法,我们要实现这个方法。

    public sealed class NotifiBackTask:Windows.ApplicationModel.Background.IBackgroundTask
{
public void Run(Windows.ApplicationModel.Background.IBackgroundTaskInstance taskInstance)
{
// 在这里编写后台处理代码 }
}

下面是后台的实现代码。

        public void Run(Windows.ApplicationModel.Background.IBackgroundTaskInstance taskInstance)
{
// 在这里编写后台处理代码
Windows.Networking.PushNotifications.RawNotification notification = taskInstance.TriggerDetails as Windows.Networking.PushNotifications.RawNotification; if (notification != null)
{
// 获取RAW通知的内容
string message = notification.Content;
// 由于内容是以|作为分隔符的,所以我们要取得标题和内容
string[] items = message.Split('|');
// 保存数据
Windows.Storage.ApplicationData.Current.LocalSettings.Values["title"] = items[];
Windows.Storage.ApplicationData.Current.LocalSettings.Values["content"] = items[];
// 更新磁贴
Windows.Data.Xml.Dom.XmlDocument doc = Windows.UI.Notifications.TileUpdateManager.GetTemplateContent(Windows.UI.Notifications.TileTemplateType.TileSquare150x150Text02);
var nodes = doc.SelectNodes("tile/visual/binding/text");
if (nodes.Count >= )
{
// 修改XML值
((XmlElement)nodes[]).InnerText = items[];
((XmlElement)nodes[]).InnerText = items[];
}
// 更新磁贴
TileUpdateManager.CreateTileUpdaterForApplication().Update(new TileNotification(doc)); // 顺便也发一下Toast通知
XmlDocument doctoast = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var txtnodes = doctoast.GetElementsByTagName("text");
if (txtnodes.Count > )
{
// 修改XML值
((XmlElement)txtnodes[]).InnerText = items[];
((XmlElement)txtnodes[]).InnerText = items[];
}
// 发送Toast通知
ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(doctoast));
}

}

当Run方法被调用时,会把一个实现了IBackgroundTaskInstance接口的对象实例通过参数传递进来,它表示当前正在执行的后台任务的实例。接着通过访问taskInstance.TriggerDetails属性获得一个跟触发当前后台任务相关联的对象。

我们这个后台任务是由于RAW通知到达而触发的,因此,TriggerDetails属性所引用的对象就是一个RawNotification实例,再经过Content属性就能得到RAW通知的内容了。

我测试的时候,是用一个“|”符号把标题和正文分符开来,因此应用程序在收到通知后要对内容字符进行分割处理,以得到标题和正文。

最后,把收到的内容保存到本地存储中,并向用户发送Toast提醒,同时更新磁贴。

4、回到WP应用项目,添加对刚才的后台任务的引用。

5、打开清单文件,切换到“声明”选项卡,添加一个后台任务,触发器为“推送通知”,入口点为刚才定义的后台类的类名,包含命名空间名字。如下图。

6、修改清单文件仅仅是允许某个后台任务,要让后台任务真正运行起来,还需要在代码中进行注册。

            string taskName = "back_notifi"; //后台任务名称
string entryPoint = "RawNotificationBackgroundTask.NotifiBackTask"; //入口点
// 检查是否许后台任务
var result = await BackgroundExecutionManager.RequestAccessAsync();
if (result == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity)
{
// 检查是否已经注册后台任务
var task = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault((t) => t.Name == taskName);
// 如果未注册,则进行注册
if (task == null)
{
BackgroundTaskBuilder tb = new BackgroundTaskBuilder();
tb.TaskEntryPoint = entryPoint;
tb.Name = taskName;
// 触发器为推送通知触发器
tb.SetTrigger(new PushNotificationTrigger());
// 运行条件为网络可用
tb.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
// 注册
tb.Register();
}
}

var task = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault((t) => t.Name == taskName);一行代码是检查一下后台任务是否已经注册,如果已经注册了,就不要再注册了,后台任务的名字必须是唯一的,不能与其他后台任务重复。

记得:要将清单中的标识与应用商店中的信息同步,请参考上一篇文章。

7、现在,以管理员的身份运行我们前面开发的测试服务端,通知类型选择“自定义”。

发送通知后,在手机上就会收到相应的通知,请看下面的美图。

示例代码下载:http://files.cnblogs.com/tcjiaan/RawNotificationWPClientApp.rar

【WP 8.1开发】自定义(RAW)通知的使用的更多相关文章

  1. 【WP 8.1开发】推送通知测试服务端程序

    所谓推送通知,用老爷爷都能听懂的话说,就是: 1.我的服务器将通知内容发送到微软的通知服务器,再由通知服务器帮我转发消息. 2.那么,微软的推送服务器是如何知道我的服务器要发消息给哪台手机呢?手机客户 ...

  2. 【WP 8.1开发】手机客户端应用接收推送通知

    上一篇文章中,已经完成了用于发送通知的服务器端,接下来我们就用这个服务端来测试一下. 在开始测试之前,我们要做一个接收通知的WP应用. 1.启动VS Express for Windows,新建项目, ...

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

    原文:Windows Phone开发(45):推送通知大结局--Raw通知 为什么叫大结局呢?因为推送通知服务就只有三种,前面扯了两种,就剩下一种--Raw通知. 前面我们通过两节的动手实验,相信大家 ...

  4. 【WP 8.1开发】How to 图像处理

    在今天的吹牛节目开始之前,先交代一件事: 关于玩WP 8.1开发所使用的VS版本问题.对版本的要求是2013的Update2,这是最低要求,只要是这个版本或以上都可以,而update3,update4 ...

  5. 在 Visual C++ 中开发自定义的绘图控件

    本文讨论的重点介于两者 之间 — 公共控件赋予您想要的大部分功能,但控件的外观并不是您想要的.例如,列表视图控件提供在许多视图风格中显示数据列表的方式 — 小图标.大图标.列表和详细列表(报告).然而 ...

  6. Android开发自定义View

    Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在 ...

  7. [转]jquery开发自定义的插件总结

    本文转自:http://www.cnblogs.com/Jimmy009/archive/2013/01/17/jquery%E6%8F%92%E4%BB%B6.html 前几天在玩jquery,今天 ...

  8. 基于Spring的可扩展Schema进行开发自定义配置标签支持

    一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...

  9. BizTalk开发系列(二十二) 开发自定义Map Functoid

    尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况.<BizTalk开发系列 Map扩展开发>介绍了通过使用自定义 XSL ...

随机推荐

  1. u3d avatar部件的理解

    u3d中带动画的fbx文件导入的时候,就会显示一个avatar组件,这个到底干嘛的一直没能很好的理解,翻看网上的介绍,基本都是告诉你,设置humanoid类型动画时,拖拉过去之类,但是这玩意到底存储了 ...

  2. Swift的基本类型和流程控制

    Swift  是一门静态的强类型语言.它以简单.干净.可读性好等特点著称. 1. 为什么是静态语言? 首先静态语言比之动态语言,更具有安全性.它不允许类型之间自动的进行转换,必须要显示的转换.Swif ...

  3. JavaWeb的学习之Servlet(转载自孤傲苍狼)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  4. C++ 非阻塞套接字的使用 (3)

    异步非阻塞套接字避免了死循环的接收问题,但是软件用起来体验还是很差.究其原因,软件在指令的发送.接收上, 采取了一种不合理的方式:在指令的发送后,立刻调用接收函数,等待回令. 若是采用同步阻塞套接字, ...

  5. Redis主从复制深入剖析

    Redis是一个开源的,遵守BSD许可协议的key/value缓存系统,并由其高效的响应速度以及丰富的数据结构而闻名.Redis在京东的使用也是非常普遍的,包括很多关键业务上的 使用,由于Redis官 ...

  6. 编译PHP5缺t1lib包安装

    t1lib_doc.dvi Error解决: 1. 下载t1lib-5.1.2.tar.gz2. 解决依赖关系:sudo apt-get build-dep t1lib 3. 安装:./configu ...

  7. FreeRTOS和Ucos在任务优先级的区别

    而ucos的任务优先级是任务优先级的数组越小,任务优先级越高.和STM32的中断优先级保持一样的分析,和freeRTOS相反.

  8. 程序员必须知道的几个Git代码托管平台

    上一篇博客中2015继续任性——不会Git命令,照样玩转Git我们简单的介绍了在VS2013中使用Git,和GitHub客户端的使用.那么使用Git到底有什么好处呢?最为明显的是支持Git代码托管的平 ...

  9. 博客的QQ群群规

    本人博客园博客夏天的森林相关的QQ群一共有3个,它们分别是Web前端及Web开发技术群(群号:262413025).JS及Web前端技术群(群号:35079861)和Web服务端技术群(群号:3414 ...

  10. 【原创】三分钟教你学会MVC框架——基于java web开发(2)

    没想到我的上一篇博客有这么多人看,还有几位看完之后给我留言加油,不胜感激,备受鼓励,啥都别说了,继续系列文章之第二篇.(如果没看过我第一篇博客的朋友,可以到我的主页上先浏览完再看这篇文章,以免上下文对 ...