探索Windows Phone的推送通知与响应式扩展技术
1. 推送通知服务概述
推送通知服务为Windows Phone应用提供了一种可扩展的框架,使应用无需在后台持续运行即可接收重要消息。这种方式不仅节省了设备资源(如处理器和互联网连接),还延长了电池续航时间。推送通知有多种潜在用途,包括Twitter更新、恶劣天气警报和股市通知等。
目前,向单个通知通道URI发送免费推送通知存在限制,每个URI每24小时最多可免费发送500条通知。这一限制旨在防止通过通知通道进行滥用、恶意攻击或发送垃圾信息。若要突破这一限制,可按照以下步骤设置安全的Web服务。
2. 设置安全的推送通知Web服务
若要设置用于推送通知的安全Web服务,可按以下步骤操作:
1. 从受信任的根证书颁发机构获取SSL证书。完整列表可在 此处 查看,其中包括VeriSign和RSA Security等公司。
2. 在应用认证时,将获取的证书提交到Windows Phone应用商店。完成此操作后,即可在每个安全通道上处理无限数量的推送通知消息。
在应用认证之前,开发者可先测试Windows Phone应用、Microsoft Push Notification Service (MPNS) 和Web服务之间的安全通信通道。微软允许开发者在认证过程之前将从受信任的CA购买的证书上传到Windows Phone应用商店。上传证书后,开发者有四个月的时间来测试通过推送通知实现的Windows Phone应用与云服务之间的安全通信。应用通过认证后,四个月的时间限制将被解除,开发者可通过安全通信通道访问无限的推送通知,这是利用微软推送通知的最佳实践。
3. 响应式扩展技术背景
如今的计算世界要求开发者采用并发编程方法,尤其是在Windows Phone开发中,并发和异步编程变得至关重要。为了简化和抽象异步及基于事件的编程,2009年底,.NET平台上出现了一个强大的框架——Reactive Extensions for .NET (Rx.NET)。
Rx.NET旨在革新.NET框架中的响应式编程。在响应式编程中,开发者注册对某些事物的兴趣,当感兴趣的项目可用时,它们会被异步或响应式地传递给应用。这与交互式编程形成对比,在交互式编程中,用户请求某事物并等待其交付。
4. Rx.NET的订阅管道
使用Rx.NET时,需遵循以下四个基本步骤来指定可观察对象并创建观察者:
1. 构建或定义可观察对象(Observable) :在观察者模式中,可观察对象也称为Subject。
2. 订阅可观察对象 :若遵循观察者模式,可创建一个观察者(Observer)。
3. 接收数据并做出响应 :只要Subject持续向Observer发送通知,Observer就会接收数据并做出相应操作。
4. 取消订阅 :当Subject不再有通知需要处理时,Observer可通过调用Dispose方法取消对Subject的订阅。
Rx.NET定义了两个新接口来支持此订阅管道:IObservable和IObserver。
5. 观察者模式在Rx.NET中的实现
在创建一个异步搜索Flickr照片的应用之前,我们先通过一个简单的项目来了解Rx.NET的基础知识。以下是具体步骤:
5.1 创建Windows Phone项目
- 启动Visual Studio 2010 Express for Windows Phone,创建一个新的Windows Phone应用项目,命名为RxSample。在该项目中,我们将在手机屏幕的文本框中观察Reactive Extensions框架生成的消息。
- 从工具箱中选择文本块(textblock)并将其拖放到设计界面上。由于我们刚开始接触Rx.NET,保持文本块的名称(textBlock1)不变,并调整其高度和宽度以占据整个屏幕区域。选中该文本块,按F4打开其属性窗口,将TextWrapping属性设置为Wrap。
- 在Windows Phone上,Rx.NET的实现包含在两个单独的程序集中:Microsoft.Phone.Reactive和System.Observable。在解决方案资源管理器中右键单击项目名称,选择“添加引用”,添加对这两个程序集的引用。
5.2 添加代码以创建和读取可观察集合
- 将Rx.NET库导入当前代码。打开MainPage.xaml.cs(右键单击MainPage.xaml,选择“查看代码”),在页面顶部添加以下语句:
using Microsoft.Phone.Reactive;
- 在MainPage()构造函数中,在InitializeComponent()语句之后添加以下代码:
IObservable<int> source = Observable.Range(5, 3);
此代码使用Observable.Range方法创建一个包含从5到7(包括5和7)的整数范围的可观察集合。
- 创建一个观察者来监听步骤2中创建的可观察对象。添加以下代码:
IDisposable subscription = source.Subscribe(x =>
textBlock1.Text += String.Format(" OnNext: {0}", x),
ex => textBlock1.Text += String.Format(" OnError: {0}", ex.Message),
() => textBlock1.Text += " OnCompleted");
这里使用的Subscribe方法接受三个lambda表达式作为参数。第一个lambda表达式定义了当有新元素可供观察者使用时要执行的逻辑(OnNext);第二个lambda表达式定义了当观察者中出现异常时要执行的逻辑(OnError);最后一个lambda表达式定义了当可观察对象完成其生命周期时要执行的逻辑(OnCompleted)。
- 调用Dispose()方法,让观察者停止对可观察对象状态的关注:
subscription.Dispose();
- 按F5运行应用程序。Windows Phone模拟器屏幕将显示消息“OnNext: 5”、“OnNext: 6”、“OnNext: 7”和“OnCompleted”。
以下是该过程的mermaid流程图:
graph LR
A[创建Windows Phone项目] --> B[添加文本块并设置属性]
B --> C[添加对Rx.NET程序集的引用]
C --> D[导入Rx.NET库]
D --> E[创建可观察集合]
E --> F[创建观察者]
F --> G[调用Dispose方法]
G --> H[运行应用程序]
6. 总结
推送通知服务为Windows Phone应用提供了一种高效的消息接收方式,而设置安全的Web服务可突破免费通知数量的限制。Rx.NET则为异步和基于事件的编程提供了强大的支持,通过观察者模式和订阅管道,开发者可以更轻松地处理并发和异步任务。通过上述步骤,我们不仅了解了推送通知和响应式扩展技术的基本概念,还通过具体的代码示例实现了相关功能。在后续开发中,开发者可进一步探索这些技术的应用场景,如使用Rx.NET实现推送通知服务器部分,根据特定事件(如恶劣天气警报或股票价格警报)广播消息。
探索Windows Phone的推送通知与响应式扩展技术
7. 响应式编程与交互式编程对比
响应式编程和交互式编程是两种不同的编程模式,它们在用户与程序的交互方式上存在明显差异。为了更好地理解这两种模式,我们可以通过一个汽车购物的类比来进行说明。
在交互式编程中,用户主动请求某事物,然后等待其交付。就像在汽车购物时,用户通常会前往汽车经销商处(或在线进行研究),查看不同品牌和型号的汽车,挑选自己喜欢的车型并进行试驾。这种方式是用户主动发起请求,然后等待经销商提供相应的服务。
而在响应式编程中,用户表达对某事物的兴趣,然后继续进行自己的日常事务。当感兴趣的事物可用时,系统会主动通知用户。在汽车购物的情境中,用户会向经销商发送一份表达对特定品牌和型号汽车感兴趣的便条,然后继续自己的生活。经销商会寻找可能符合用户兴趣的汽车,并在有合适的车辆时通知用户。
在Windows Phone的事件处理中,这两种模式也有不同的应用。例如,在一个示例应用中,我们希望在用户停止输入文本半秒后读取文本框的内容。如果采用交互式方法,我们需要将文本框的KeyDown事件与一个定时器关联起来,检查两次按键之间是否经过了足够的时间。而在响应式方法中,我们只需表达对用户按键间隔半秒后的KeyDown事件的兴趣,当收到这样的事件通知时,我们就可以采取相应的行动,比如在线搜索照片。
以下是两种编程模式的对比表格:
| 编程模式 | 用户交互方式 | 示例场景 | 事件处理方式 |
| — | — | — | — |
| 交互式编程 | 用户主动请求,等待交付 | 汽车购物时主动挑选试驾 | 关联事件和定时器检查时间 |
| 响应式编程 | 用户表达兴趣,系统主动通知 | 汽车购物时表达兴趣后等待通知 | 表达对特定事件的兴趣,事件触发时行动 |
8. Rx.NET的应用场景与优势
Rx.NET的强大功能使其在许多应用场景中都能发挥重要作用。它特别适用于处理不断变化的数据源,例如天气应用。在天气应用中,数据会随着时间不断更新,使用Rx.NET可以轻松地处理这些实时变化的数据。
Rx.NET的优势主要体现在以下几个方面:
- 简化并发和异步编程 :通过Rx.NET,开发者可以更轻松地实现并发异步和基于事件的应用程序。它提供了一种直观的方式来处理异步操作,使代码更易于理解和维护。
- 灵活的事件处理 :Rx.NET允许开发者根据特定条件过滤和处理事件。例如,开发者可以设置只在满足某些条件时才对事件做出响应,如过滤位置值,只在位置位于特定预定义区域时触发事件。
- 可扩展性 :Rx.NET的设计具有良好的可扩展性,开发者可以根据需要添加新的功能和处理逻辑。
9. 利用Rx.NET进行照片搜索的示例
接下来,我们将构建一个小应用,该应用利用Rx.NET的过滤功能,在用户停止输入文本半秒后,异步调用Flickr的Web服务进行照片搜索。
9.1 实现思路
我们的目标是在用户输入文本时,只有当用户停止输入半秒后,才触发对Flickr的搜索请求。为了实现这一目标,我们将使用Rx.NET的一些特性,如Throttle操作符,它可以帮助我们过滤掉短时间内的频繁事件。
9.2 代码实现步骤
- 设置界面 :在Windows Phone项目中,添加一个文本框用于用户输入搜索关键词,以及一个列表框用于显示搜索结果。
- 添加对Rx.NET库的引用 :确保项目中已经添加了对Microsoft.Phone.Reactive和System.Observable程序集的引用。
- 编写代码 :
using System;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Phone.Reactive;
namespace FlickrSearchApp
{
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
// 监听文本框的TextChanged事件
var textChangedEvents = Observable.FromEventPattern<TextChangedEventArgs>(
txtSearch, "TextChanged");
// 使用Throttle操作符过滤掉半秒内的频繁事件
var throttledEvents = textChangedEvents.Throttle(TimeSpan.FromSeconds(0.5));
// 订阅过滤后的事件
throttledEvents.Subscribe(async e =>
{
var searchTerm = txtSearch.Text;
if (!string.IsNullOrEmpty(searchTerm))
{
// 调用Flickr API进行搜索
var results = await FlickrSearchService.SearchPhotos(searchTerm);
// 更新列表框显示搜索结果
lstResults.ItemsSource = results;
}
});
}
}
}
在上述代码中,我们首先使用 Observable.FromEventPattern 方法将文本框的 TextChanged 事件转换为一个可观察序列。然后,使用 Throttle 操作符过滤掉半秒内的频繁事件,只保留用户停止输入半秒后的事件。最后,订阅过滤后的事件,当事件触发时,调用Flickr API进行搜索,并将结果显示在列表框中。
以下是该搜索过程的mermaid流程图:
graph LR
A[用户在文本框输入关键词] --> B[触发TextChanged事件]
B --> C[转换为可观察序列]
C --> D[使用Throttle过滤事件]
D --> E[订阅过滤后的事件]
E --> F[调用Flickr API进行搜索]
F --> G[更新列表框显示结果]
10. 总结与展望
通过对推送通知服务和Rx.NET的学习,我们掌握了许多重要的技术和概念。推送通知服务为Windows Phone应用提供了一种高效的消息接收方式,而Rx.NET则为异步和基于事件的编程提供了强大的支持。
在实际开发中,我们可以结合这两种技术,实现更复杂和智能的应用。例如,使用Rx.NET实现推送通知服务器部分,根据特定事件(如恶劣天气警报或股票价格警报)广播消息。同时,我们还可以进一步探索Rx.NET的更多功能和应用场景,利用其强大的事件处理和过滤能力,开发出更加高效、灵活的应用程序。
未来,随着技术的不断发展,响应式编程和并发编程将在软件开发中发挥越来越重要的作用。开发者需要不断学习和掌握新的技术和工具,以适应不断变化的开发需求。希望本文能够为开发者提供一些有用的参考,帮助他们在Windows Phone开发中更好地应用推送通知和响应式扩展技术。
超级会员免费看
1315

被折叠的 条评论
为什么被折叠?



