来谈谈推送
让我们聊聊推送。

如您所知,推送现在几乎适用于所有 BlackBerry® 10 开发方法:Cascades™ 框架、BlackBerry® WebWorks™、Adobe® AIR® 和 Android™*。因此,我认为提供一个所有平台共享的整个推送过程的高级概述是个好主意。
(*对 Android Runtime 应用程序的推送支持将在未来的 BlackBerry 10 版本中提供,并且企业推送支持已可用;但是,为保持简洁,本文将仅关注当前支持平台中的消费者推送。有关其他内容的更多详细信息将在未来的博客文章中提供。)
我将重点关注此服务的客户端部分。如果您过去通过 BlackBerry® Internet Service (BIS) 使用过推送,那么您的服务器端代码目前无需任何更改——它将与 BlackBerry 10 一样工作!
对于尚不了解推送是什么的人,这里有一个简要概述:如果您的 BlackBerry 10 应用程序与服务器协同工作以检索数据,通常有几种方法可以知道何时有新数据可用
- 拉取 – 始终请求所有数据
- 效率低下(耗电且耗费带宽)
- 信息可能在拉取之前很久就已可供客户端使用
- 客户端应用程序需要运行
- 探测 – 向服务器发送消息并询问是否有新数据可用,如果有则拉取
- 信息可能在探测之前很久就已可供客户端使用
- 客户端应用程序需要运行
- 推送 – 服务器在新数据可用后立即将新数据发送给客户端
- 高效
- 数据立即可供客户端使用
- 客户端应用程序无需运行
推送是向客户端应用程序传递数据更有效的方式;此服务与 BlackBerry® 体验同义,自始以来就用于传递电子邮件和 BlackBerry® Messenger (BBM™) 消息。
入门
如果您尚未这样做,可以在以下网站注册一个推送服务帐户:https://developer.blackberry.com/services/push
成功注册后,您将收到非常重要的信息,这些信息将用于创建您的客户端和服务器端应用程序。重点关注客户端,您将收到一个对您的推送应用程序唯一的应用程序 ID 值,您还将收到一个 PPG(推送代理网关)URL,您的客户端将使用该 URL 进行注册,以开始接收来自此特定应用程序 ID 的推送数据。稍后将详细介绍这两个值——目前只需知道它们是在注册使用推送服务后收到的即可。
调用框架
让我们从将一切联系在一起的部分开始:调用框架。调用是 BlackBerry 10 中广泛使用的极其强大的工具。在推送的情况下,这就是目标应用程序(无论其是运行还是关闭)接收推送数据的方式。考虑到这一点,我们需要做的第一件事是注册我们的应用程序,以便在收到推送时接收调用请求。为此,我们将一个 invoke-target 元素添加到应用程序的 bar-descriptor.xml* 文件中
<invoke-target id=”unique.text.value“> <entry-point>1</entry-point> <type>APPLICATION</type> <filter> <action>bb.action.PUSH</action> <mime-type>application/vnd.push</mime-type> </filter> </invoke-target>
上面加粗的重要元素
- id – 此值由您选择。它是一个用于专门调用您的应用程序的唯一标识符。选择一个不太可能被其他应用程序使用的值很重要。
- action – “
bb.action.PUSH
”值表示此 invoke-target 可以处理数据推送。
- mime-type – 推送数据使用的 MIME 类型是“
application/vnd.push
”,因此此元素表示此 invoke-target 可以处理推送数据 MIME 类型。
上面的第2和第3项不能更改,但理解它们代表什么很重要。
一旦您的应用程序安装了 bar-descriptor 中的 invoke-target 元素,它现在就可以被推送数据调用了。调用方式与非推送调用相同;唯一的区别是调用中提供的数据将包含一个 PushPayload
对象,其中包含您推送数据的内容。然而,在操作系统知道调用此应用程序之前,需要处理一些事情,首先是推送通知服务。
*如果使用 BlackBerry WebWorks / HTML 5 进行开发,则需要修改 config.xml 文件。XML 将与上述内容几乎相同,只是 <invoke-target id=”unique.text.value”> 将变为 <rim:invoke-target id=”unique.text.value”>,而 </invoke-target> 将变为 </rim:invoke-target>
推送通知服务 (PNS)
PNS 始终在 BlackBerry 10 上运行。此服务处理唯一的应用程序 ID(在注册推送服务后收到)和调用目标(在上面的 bar-descriptor.xml 文件中指定)之间的映射。当您的应用程序首次启动时,它应始终创建一个 PushService
会话实例。此实例以 2 个主要值作为参数:调用目标和应用程序 ID。成功创建后,PNS 现在在应用程序 ID 和调用目标之间有了映射。
快速举一个基于场景的例子,当一个推送从 BlackBerry 推送服务发送到设备时,它将始终包含一个应用程序 ID。PNS 将接收此推送并读取应用程序 ID。然后它将检查其记录,查看哪些 invoke-target 已针对此应用程序 ID 注册,然后根据此映射调用您的应用程序。
注意:如果您在 BlackBerry® 7.1 OS 及更低版本中使用过推送,那么您可能想知道端口;在 BlackBerry 10 中,PNS 为您抽象了端口逻辑,因此您只需担心应用程序 ID。PNS 保证不会代表您发生端口冲突。
注册推送服务
如果您已经走到这一步,那么设备端的一切都已准备就绪。但是,您的客户端应用程序仍需要向推送服务注册,以允许将指定应用程序 ID 的推送发送到您的设备。向 BPS 注册的过程称为创建“通道”。这告诉 BPS 设备已安装所需的应用程序,并且希望开始接收推送数据。这有助于防止未经请求的推送数据发送到您的设备。通道相当静态——它们在设备重置后仍然存在,因此您只需在应用程序安装的整个生命周期中创建一个即可。通道有可能被服务器删除,因此建议每 30 天或更短时间创建一个通道。
通道创建由上面 PNS 部分提到的同一 PushService
会话实例处理。创建通道的同一调用会返回一个“令牌”对象;此时,令牌是设备 PIN 的字符串表示。这可以发送到您的服务器端应用程序,告知它有一个新设备希望开始接收推送数据。框架不处理此问题,因为服务器端实现会有所不同。如果使用 Push Service SDK 随附的服务器端示例,示例应用程序会展示如何执行此注册。
客户端应用程序关闭时处理推送调用
再次依赖我们的 PushService
实例,有一个可以调用的方法,它允许应用程序在推送到达时在后台启动。
BlackBerry WebWorks / HTML 5 – launchApplicationOnPush
Cascades – registerToLaunch
Adobe AIR – registerToLaunch
如果设置为 true,则应用程序将在收到推送后立即启动并以最小化状态运行。如果用户当时正在使用其他应用程序,他们不会被此过程打断——它是透明的。客户端应用程序可以根据需要处理推送,并可能使用通知 API 让用户知道有新数据可供查看。
摘要/结论/下一步去哪里
好了,这就是 BlackBerry 10 上推送的全面概述。如果您想为您的应用程序添加推送功能,我建议您采取以下几个步骤
- 注册以评估推送服务。这提供了一种在实时环境中测试推送服务的方法。今天可以在 BlackBerry 10 Dev Alpha 设备上进行测试(目前不支持模拟器)。
- 查看您希望针对的平台的示例。所有示例都提供相同的 UI 和功能,因此这取决于您熟悉什么
Cascades
BlackBerry WebWorks / HTML 5
Adobe AIR
如果您想了解更多关于推送的信息,请查看以下资源