`
izuoyan
  • 浏览: 9197444 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Windows Phone 7 不温不火学习之《推送通知服务》

阅读更多

Windows Phone 中的 Microsoft Push Notification Service 向第三方开发人员提供了一个弹性,专注,而且持续的渠道,使得开发人员可以从Web Service 向移动应用程序发送信息和更新。

  过去移动应用程序需要经常主动访问相应的WEB服务,以了解是否有任何等待处理的通知。这样做是有效的,但会导航手机无线设备频繁打开,从而对电池续航时间或者用户的流量带来负面 影响。使用推送通知的方式取代主动调查,Web Service 能够提醒应用程序获取所需要的重要理更新。

  当一个Web Service 有信息要发送到应用程序,它先发送一个通知到Push Notification Service ,该服务随后将通知应用程序,应用程序的标题明显地更新或者显示一个Toast 通知。然后,如果需要的话,应用程序可以使用自己的的协议联系Web service 以获取更新。

  关于推送通知服务,看了Jake Lin 的视频他说的“好莱坞原则”己经说得很清楚了,不过我自己从现实中的淘宝购物也产生了一定的理解,下面跟大家分享一下,给出图示:

  如上图,我们可以把推送通知理解成,一部手机就相当于我们一个用户,在淘宝注册了帐号并填写了送货地址(URI),在购买完自己需要的物品后,通知淘宝商家发货了,这时淘宝商家接收到我们给出的URI,就把货品打包,可以使用万能打包把什么东西都放进去(Raw)或者根据我们的要求要打包成礼品的样子(Tokens或者Toast 需要的XML格式 ),之后通知快递公司(--》不同的是,微软是免费的帮我们快递 ) 。而当我们收到快递公司给予我们的通知后,如打电话说:“先生,你的货品己经到达,请接收”,之后我们就根据打包方式进行接收啦。

  大意的理解是这样的。

Push notification 发送方式

  如上一段文字出现了几个英文单词就是Push notification 的三种发送方式,分别为:

  •  Raw Notification
    1.可以发送任何格式的数据
    2.应用程序可以根据需要加工数据
    3.应用程序相关(application-specific)通知消息
    4.只有在应用程序运行时,才发送。
  • Toast Notification
    1.发送的数据为指定的XML 格式
    2.如果应用程序正在运行,内容发送到应用程序中
    3.如果应用程序没有运行,弹出Toast 消息框显示消息
    3.1App 图标加上两个描述文本
      3.2打断用户当前操作,但是是临时的
      3.3用户可以点击进行跟踪
  • Tokens (Tile) Notification
    1.发送的数据为指定的XML格式
    2.不会往应用程序进行发送
    3.如果用户把应用程序PIN TO START ,那么更新数据发送到start screen 的tile 里面
      3.1包含三个属性,背景,标题和计算器
      3.2每个属性都有固定的格式与位置
      3.3可以使用其中的属性,不一定三个属性一起使用

Push Notification使用规范

  • 当前版本的Windows Phone 只支持最多15 个第三方应用程序使用推送服务通知服务
  • 应用程序必须内置询问用户是否使用推送通知服务的功能
  • 应用程序必须内置用户可以取消推送通知服务的功能

Demo 演示

关于Push Notification 的事件为如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->//注册URI
httpChannel.ChannelUriUpdated+=newEventHandler<NotificationChannelUriEventArgs>(httpChannel_ChannelUriUpdated);

//发生错误的事件
httpChannel.ErrorOccurred+=newEventHandler<NotificationChannelErrorEventArgs>(httpChannel_ErrorOccurred);
//Raw推送通知服务事件
httpChannel.HttpNotificationReceived+=newEventHandler<HttpNotificationEventArgs>(httpChannel_HttpNotificationReceived);

//toast推送通知服务事件
httpChannel.ShellToastNotificationReceived+=newEventHandler<NotificationEventArgs>(httpChannel_ShellToastNotificationReceived);

我们可以在需要注册的地方使用,Windows Phone 的大致使用代码为如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Documents;
usingSystem.Windows.Input;
usingSystem.Windows.Media;
usingSystem.Windows.Media.Animation;
usingSystem.Windows.Shapes;
usingMicrosoft.Phone.Controls;
///引用通知服务命名空间
usingMicrosoft.Phone.Notification;
usingSystem.Diagnostics;
usingSystem.IO;
namespacePushNotificationDemo
{
publicpartialclassMainPage:PhoneApplicationPage
{


privateHttpNotificationChannelhttpChannel;
privateconststringchannelName="Channel";

//Constructor
publicMainPage()
{
InitializeComponent();
}

privatevoidlinkButton_Click(objectsender,RoutedEventArgse)
{
httpChannel
=HttpNotificationChannel.Find(channelName);
//如果存在就删除
if(httpChannel!=null)
{
httpChannel.Close();
httpChannel.Dispose();
}

httpChannel
=newHttpNotificationChannel(channelName,"NotificationServer");

//注册URI
httpChannel.ChannelUriUpdated+=newEventHandler<NotificationChannelUriEventArgs>(httpChannel_ChannelUriUpdated);

//发生错误的事件
httpChannel.ErrorOccurred+=newEventHandler<NotificationChannelErrorEventArgs>(httpChannel_ErrorOccurred);
//Raw推送通知服务事件
httpChannel.HttpNotificationReceived+=newEventHandler<HttpNotificationEventArgs>(httpChannel_HttpNotificationReceived);

//toast推送通知服务事件
httpChannel.ShellToastNotificationReceived+=newEventHandler<NotificationEventArgs>(httpChannel_ShellToastNotificationReceived);

//打开连接
httpChannel.Open();
//绑定toast推送服务
httpChannel.BindToShellToast();

//绑定Tokens(tile)推送服务
httpChannel.BindToShellTile();
}

voidhttpChannel_ShellToastNotificationReceived(objectsender,NotificationEventArgse)
{
stringmsg=string.Empty;
foreach(varkeyine.Collection.Keys)
{
msg
+=key+":"+e.Collection[key]+Environment.NewLine;
}
Dispatcher.BeginInvoke(()
=>
{
msgTextBlock.Text
=msg;
});
}

voidhttpChannel_HttpNotificationReceived(objectsender,HttpNotificationEventArgse)
{
//Raw支持任意格式数据
using(varreader=newStreamReader(e.Notification.Body))
{
stringmsg=reader.ReadToEnd();
Dispatcher.BeginInvoke(()
=>
{
msgTextBlock.Text
=msg;
});
}
}

voidhttpChannel_ErrorOccurred(objectsender,NotificationChannelErrorEventArgse)
{
//子线程中更新UI
Dispatcher.BeginInvoke(()=>
{
msgTextBlock.Text
=e.Message;
});
}

voidhttpChannel_ChannelUriUpdated(objectsender,NotificationChannelUriEventArgse)
{
Debug.WriteLine(
"CahnnelUri:{0}",e.ChannelUri);
Dispatcher.BeginInvoke(()
=>
{
linkButton.IsEnabled
=false;
});

}
}
}

之后,我们新建一个Windows Form 应用程序,做为Cloud server 。

首先,新建一个枚举,创建三个枚举项为如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicenumnotificationType
{
raw,
toast,
tokens
}

然后编写发送通知服务通用方法体:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidsendNotificationType(byte[]payLoad,notificationTypetype)
{
//TheURIthatthePushNotificationServicereturnstothePushClientwhencreatinganotificationchannel.
HttpWebRequestsendNotificationRequest=(HttpWebRequest)WebRequest.Create(NotificationUriTextBox.Text);

//HTTPPOSTistheonlyallowedmethodtosendthenotification.
sendNotificationRequest.Method=WebRequestMethods.Http.Post;

//TheoptionalcustomheaderX-MessageIDuniquelyidentifiesanotificationmessage.Ifitispresent,the
//samevalueisreturnedinthenotificationresponse.ItmustbeastringthatcontainsaUUID.
sendNotificationRequest.Headers["X-MessageID"]=Guid.NewGuid().ToString();

if(type==notificationType.raw)
{

//Setsrawnotification
sendNotificationRequest.ContentType="text/xml;charset=utf-8";
sendNotificationRequest.Headers.Add(
"X-NotificationClass","3");
//Possiblebatchingintervalvalues:
//3:ThemessageisdeliveredbythePushNotificationServiceimmediately.
//13:ThemessageisdeliveredbythePushNotificationServicewithin450seconds.
//23:ThemessageisdeliveredbythePushNotificationServicewithin900seconds.
}

elseif(type==notificationType.tokens)
{

//Setstoastnotification
sendNotificationRequest.ContentType="text/xml;charset=utf-8";
sendNotificationRequest.Headers.Add(
"X-WindowsPhone-Target","token");
sendNotificationRequest.Headers.Add(
"X-NotificationClass","1");
//Possiblebatchingintervalvalues:
//1:ThemessageisdeliveredbythePushNotificationServiceimmediately.
//11:ThemessageisdeliveredbythePushNotificationServicewithin450seconds.
//21:ThemessageisdeliveredbythePushNotificationServicewithin900seconds.


}
elseif(type==notificationType.toast)
{
//Setstoastnotification
sendNotificationRequest.ContentType="text/xml;charset=utf-8";
sendNotificationRequest.Headers.Add(
"X-WindowsPhone-Target","toast");
sendNotificationRequest.Headers.Add(
"X-NotificationClass","2");
//Possiblebatchingintervalvalues:
//2:ThemessageisdeliveredbythePushNotificationServiceimmediately.
//12:ThemessageisdeliveredbythePushNotificationServicewithin450seconds.
//22:ThemessageisdeliveredbythePushNotificationServicewithin900seconds.

}


//Setsthewebrequestcontentlength.
sendNotificationRequest.ContentLength=payLoad.Length;

//Setsthenotificationpayloadtosend.
byte[]notificationMessage=payLoad;

//Sendsthenotification.
using(StreamrequestStream=sendNotificationRequest.GetRequestStream())
{
requestStream.Write(notificationMessage,
0,notificationMessage.Length);
}

//Getstheresponse.
HttpWebResponseresponse=(HttpWebResponse)sendNotificationRequest.GetResponse();
stringnotificationStatus=response.Headers["X-NotificationStatus"];
stringnotificationChannelStatus=response.Headers["X-SubscriptionStatus"];
stringdeviceConnectionStatus=response.Headers["X-DeviceConnectionStatus"];
MsgLabel.Text
=String.Format("通知状态:{0},管道状态:{1},设备状态:{2}",
notificationStatus,notificationChannelStatus,deviceConnectionStatus);

}

设置点击后,请求微软做推送服务:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatevoidbutton1_Click(objectsender,EventArgse)
{
stringmsg=String.Format("{0}{1},{2}度",LocationComboBox.Text,
WeatherComboBox.Text,TemperatureTextBox.Text);
stringtype=NotificationTypeComboBox.Textasstring;
if(type=="Raw")
{
byte[]strBytes=newUTF8Encoding().GetBytes(msg);
sendNotificationType(strBytes,notificationType.raw);
}
elseif(type=="Toast")
{
stringtoastMessage="<?xmlversion=\"1.0\"encoding=\"utf-8\"?>"+
"<wp:Notificationxmlns:wp=\"WPNotification\">"+
"<wp:Toast>"+
"<wp:Text1>天气更新</wp:Text1>"+
"<wp:Text2>"+msg+"</wp:Text2>"+
"</wp:Toast>"+
"</wp:Notification>";
byte[]strBytes=newUTF8Encoding().GetBytes(toastMessage);
sendNotificationType(strBytes,notificationType.toast);
}
elseif(type=="Tile")
{
stringtileMessage="<?xmlversion=\"1.0\"encoding=\"utf-8\"?>"+
"<wp:Notificationxmlns:wp=\"WPNotification\">"+
"<wp:Tile>"+
"<wp:BackgroundImage>/Images/"+WeatherComboBox.Text+".png</wp:BackgroundImage>"+
"<wp:Count>"+TemperatureTextBox.Text+"</wp:Count>"+
"<wp:Title>"+LocationComboBox.Text+"</wp:Title>"+
"</wp:Tile>"+
"</wp:Notification>";
byte[]strBytes=newUTF8Encoding().GetBytes(tileMessage);
sendNotificationType(strBytes,notificationType.tokens);
}
}

注:本篇URI是通过打印得到。然后赋值给Windows Form 应用程序,如下图:

例子运行效果如下图:

上图为Raw notification运行效果

运行时的Toast

不运行时的Taost

Tokens 运行效果

源码下载:

推送通知服务

注:本篇文章代码参考自Jake lin 关于推送通知服务的视频,希望大家多支持jake lin 或者可以通过IREAPER下载 。

分享到:
评论

相关推荐

    windows phone 消息推送

    在Windows Phone平台上实现消息推送,首先要理解的是推送通知的工作流程。当用户安装了一个支持推送通知的应用后,应用会通过注册过程获取一个唯一的URI(Uniform Resource Identifier),这个URI是MPNS用来识别设备...

    Windows_Phone_7_使用推送通知

    **知识点:Windows Phone 7 使用推送通知** **一、推送通知概述** 在Windows Phone 7平台上,Microsoft Push Notification Service(MPNS)为第三方开发者提供了一个可靠且持续的通道,允许他们从Web服务向移动...

    windowphone 推送通知

    本项目以"windowphone 推送通知"为主题,提供了相关的源码,旨在帮助开发者理解和实践Windows Phone 7(简称WP7)平台上的推送通知服务。 首先,我们需要了解Windows Phone的推送通知系统,它基于Microsoft的...

    iphone 推送通知 服务器端java 实现

    本篇文章将详细介绍如何在服务器端使用Java来实现iPhone的推送通知功能。 首先,我们需要了解APNs的工作原理。APNs是苹果公司的远程通知服务,当应用程序在后台或未运行时,可以通过APNs将消息推送到用户的设备上。...

    windows phone 7 code

    7. **推送通知服务 (PNS)**:Windows Phone 7支持微软的推送通知服务,允许应用在后台接收服务器推送的信息。开发者需要设置相应的服务端和客户端接口,实现即时消息传递。 8. **Live Tiles API**:为了更新动态...

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

    总的来说,通过分析"Sources"中的源码,开发者可以学习如何在Windows Phone应用中集成和处理Raw推送通知,提升应用的用户体验。尽管Windows Phone平台的市场份额已经不如从前,但其推送通知的原理和实现方式对于理解...

    推送通知服务PushNotificationDem

    推送通知服务(PushNotificationDemo)是针对Windows Phone 7(WP7)平台设计的一种技术,旨在帮助开发者构建能够接收远程消息的应用程序。这种服务允许服务器端向客户端发送数据,即使应用在后台或完全关闭状态下也...

    Windows Phone 4. 使用消息推送机制

    微软Windows® Phone推送通知服务(PushNotificationService)为第三方开发者提供了一个弹性、专注、可持续的通道,支持发送消息、从服务器(web services)端更新Windows® Phone应用程序。 在这一部分中,一个移动应用...

    Windows phone7 程序设计

    7. **Live Tiles和通知**:Windows Phone的特色之一是动态磁贴,开发者需要了解如何创建和更新动态磁贴,以及发送本地和推送通知。 8. **Marketplace发布**:涵盖应用程序的测试、签名、打包和提交到Windows Phone ...

    推送通知实例

    在Windows Phone平台上,实现推送通知是通过Microsoft的推送通知服务(MPNS,Microsoft Push Notification Service)来完成的。这个"推送通知实例"提供了一个详细的学习资源,帮助开发者了解并实践如何在Windows ...

    Programming Windows Phone 7 Series

    Windows Phone 7的API集也得到了充分的讨论,这些API包括设备访问(如摄像头、GPS和加速度计)、通知系统(如Toast和Tile通知)、以及数据存储和同步(如Isolated Storage和Web服务集成)。这些功能的深入理解有助于...

    Windows Phone7开发教程汇总

    2. 通知服务:通过Microsoft推送通知服务(MPNS),开发者可以向用户的手机发送实时更新,即使应用没有在前台运行也能接收。 3. 多任务处理:尽管WP7早期版本不支持多任务,但后来的更新增加了后台代理服务,允许...

    Silverlight for Windows Phone 7

    **Silverlight for Windows Phone 7** 是微软推出的一款专门针对Windows Phone 7移动操作系统的开发技术,它基于Silverlight框架,允许开发者利用丰富的图形、动画和互动功能来创建高质量的移动应用程序。在Windows ...

    windows phone 7 铃声

    Windows Phone 7是一款由微软开发的操作系统,专为智能手机设计,它在2010年首次发布,旨在与当时的市场领导者如iOS和Android竞争。Windows Phone 7引入了一种全新的用户界面,以其独特的动态磁贴(Live Tiles)设计...

    WP7推送通知DEMO

    在Windows Phone 7 (WP7)平台上,推送通知(Push Notifications)是开发者向用户设备发送实时信息的一种机制,它使得应用程序即使在后台运行或者完全关闭的状态下也能接收到来自服务器的数据更新。本DEMO旨在展示...

    Windows Phone 7高级编程

    - 通知服务:推送通知和本地通知的实现。 9. **多媒体支持**: - 播放音频和视频,包括集成Zune库。 - 拍照和摄像功能的集成。 10. **Xbox Live游戏开发**: - 创建具有成就、排行榜和多人游戏功能的游戏。 -...

    Windows Phone 7 wp7 官方中文教程+例子

    第五章 当 Windows Azure 碰到了 Windows Phone 7 推送通知服务概述 Silverlight 交互开发: 第六章 了解 Windows Phone 7 网页浏览器控件 – Part 1 第七章 了解 Windows Phone 7 网页浏览器控件 – Part 2 第八章 ...

Global site tag (gtag.js) - Google Analytics