在移动应用开发中,推送服务是一种高效地将数据从服务器实时发送到客户端应用的方法。黑莓10平台支持多种推送技术,包括™ Framework, BlackBerry® WebWorks™, Adobe® AIR® 和 Android™*。本文将提供一个跨所有平台的推送过程的高级概述。
*请注意,Android 运行时应用程序的推送支持将在未来的黑莓10版本中提供,企业推送支持已经可用;但为了保持本文的简洁性,将专注于目前支持的平台上的消费推送。其他详细信息将在未来的博文中提供。
本文将重点介绍服务的客户端部分。如果过去使用过 BlackBerry® Internet Service (BIS) 的推送,那么服务器端代码无需任何更改即可与黑莓10一起使用!
对于尚未了解推送的人来说,这里有一个简要概述:如果黑莓10应用程序与服务器协作以检索数据,通常有几种方式可以知道何时有新数据可用:
推送是向客户端应用程序传递数据的更有效方式;这项服务与黑莓®体验同义,自始以来就被用于传递电子邮件和黑莓® Messenger (BBM™) 消息。
如果还没有这样做,请在以下网站注册推送服务账户:
https://developer.blackberry.com/services/push
注册成功后,将收到一些非常重要的信息,这些信息将用于创建客户端和服务器端应用程序。关注客户端,将收到一个唯一的应用程序ID值,以及一个PPG(推送代理网关)URL,客户端将使用这个URL注册以开始接收来自这个特定应用程序ID的推送数据。稍后会详细介绍这两个值——现在重要的是知道它们是在注册使用推送服务后收到的。
让从将一切整合在一起的部分开始:调用框架。调用是一个在黑莓10中广泛使用的非常强大的工具。在推送的情况下,这是目标应用程序接收推送数据的方式,无论它是否正在运行。考虑到这一点,需要做的第一件事是注册应用程序以接收调用请求,当收到推送时。为此,向应用程序的bar-descriptor.xml文件中添加一个invoke-target元素:
<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>
上面加粗的重要元素:
上面的2和3号不能更改,但理解它们代表的含义很重要。
一旦应用程序安装了带有invoke-target元素的bar-descriptor,它现在已准备好被推送数据调用。调用的方式与非推送调用相同;唯一的区别是调用中提供的数据将包括一个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始终在黑莓10上运行。这项服务处理应用程序ID(在注册推送服务后收到)与Invoke-Target(在bar-descriptor.xml文件中指定)之间的映射。当应用程序首次启动时,它应该始终创建一个PushService会话实例。这个实例接受2个主要值作为参数:Invoke Target和应用程序ID。成功创建后,PNS现在在应用程序ID和Invoke Target之间有一个映射。
快速场景示例,当推送从黑莓推送服务到达设备时,它总是包括一个应用程序ID。PNS将接收这个推送并读取应用程序ID。然后它将检查其记录,看看哪个invoke-target已注册在这个应用程序ID下,然后根据这个映射调用应用程序。
注意:如果在黑莓® 7.1操作系统及更低版本中使用过推送,那么可能会对端口感到好奇;在黑莓10中,PNS为抽象了端口逻辑,所以只需要担心应用程序ID。PNS保证不会在代表的端口上发生冲突。
如果已经走到了这一步,那么设备上的一切就绪。然而,客户端应用程序仍然需要注册推送服务,以允许将指定应用程序ID的推送发送到设备。注册BPS的过程称为创建一个"通道"。这告诉BPS设备已安装所需的应用程序,并且它希望开始接收推送数据。这有助于防止未经请求的推送数据被发送到设备。通道相当静态——它们在设备重置期间持续存在,所以应该只需要为应用程序安装的生命周期创建一个。通道可能被服务器删除,所以建议每30天或更短时间创建一个通道。
通道创建由上述PNS部分提到的同一个PushService会话实例处理。创建通道的相同调用返回一个"令牌"对象;目前,令牌是设备PIN的字符串表示。这可以发送到服务器端应用程序,让它知道有一个新的设备希望开始接收推送数据。这不是由框架处理的,因为服务器端实现会有所不同。如果使用随推送服务SDK包含的服务器端示例,示例应用程序将展示如何执行此注册。
再次依赖PushService实例,有一个方法可以调用,允许应用程序在收到推送时在后台启动。
如果设置为true,则应用程序将在收到推送后立即启动,并以最小化状态运行。如果用户当时在另一个应用程序中,他们不会被这个过程打断——它是透明的。然后客户端应用程序可以根据需要处理推送,并可能使用通知API来让用户知道有新数据可供查看。