消息推送对于 APP 至关重要,一个及时有效的消息推送能够帮助客户获取有价值的信息,所以说消息推送是移动应用的一项重要功能。目前主流的移动操作系统(Android、iOS)的 webview 都已经支持 WebSocket, 所以对于Hybrid移动应用,WebSocket 也将成为消息推送的备用选择。
何为Hybrid移动应用?
Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
WebSocket简介
WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 有很大区别。
Hybrid移动应用消息推送技术原理
混合应用一般使用 Cordova 之类的中间件,以 WebView 作为用户界面层,以 Javascript 作为基本逻辑,以及和中间件通讯,再由中间件访问底层 API 的方式,进行应用开发。开发时可能不采用或者大部分不采用原生语言,但是却有所有原生应用的特性。而开发消息推送功能时,我们就既可以使用 Native App 的系统自带推送如 GCM 和 APNS,又可以使用基于 html5 的 websocket 推送。
目前后者主要应用于原生 app, 而前者由于开发周期短,跨平台性好,维护成本低,一般可以用于混合应用的消息推送。基于 websocket 的消息推送,我们就可以自己去实现消息推送的服务端,这样我们就掌握了推送服务的主动权,对于安全性极高的企业,websocket 推送无疑是最好的选择,因为如果使用 GCM 或者 APNS 推送,我们不得不将信息发送到 GCM server 或者 APNS server, 再由 GCM 或者 APNS 服务端转发到客户端,信息安全性不得而知。一旦推送服务器出现异常,我们的消息推送将变得非常被动。 但是 GCM 和 APNS 也是使用长连接进行消息推送,而且一个手机上的所有 app 共用一个长连接,对于手机性能将会有极大的帮助。两种推送各有利弊,读者可自选选择。本文将针对 websocket 的消息推送进行一系列介绍。
即时通讯网注:以上观点有一个常识性的错误,那就是iOS平台上,消息推送属系统级的行为,当应用处于后台时消息推送必须通过iOS官方的APNS通道进行,否则没有第2种可能性。
WebSocket 接口简介
WebSocket 的实现分为客户端和服务端两部分,客户端(通常为浏览器)发出 WebSocket 连接请求,服务端响应,实现类似 TCP 握手的动作,从而在浏览器客户端和 WebSocket 服务端之间形成一条 HTTP 长连接快速通道。两者之间后续进行直接的数据互相传送,不再需要发起连接和响应。同时两者都可以关闭这个长连接。我们正是利用了混合移动应用的 webview 可以支持 websocket 的这个特性来实现服务器端对客户端的一个消息推送。Websocket 针对客户端而言,性能,资源使用以及及时性要比传统的轮询更好。即时通讯聊天软件app开发可以加蔚可云咨询
Websocket 客户端 API
对于 websocket 客户端,目前主流的移动操作系统的 webview 层都已经支持 websocket 服务。以下列举了常见的移动系统支持情况。
使用 ServerEndpoint 注释的类必须有一个公共的无参数构造函数,@onMessage 注解的 Java 方法用于接收传入的 WebSocket 信息,这个信息可以是文本格式,也可以是二进制格式。
OnOpen 在这个端点一个新的连接建立时被调用。参数提供了连接的另一端的更多细节。Session 表明两个 WebSocket 端点对话连接的另一端,可以理解为类似 HTTPSession 的概念,我们可以将多个 Session 保存到 server 端,以便我们与客户端通信。OnClose 在连接被终止时调用。参数 closeReason 可封装更多细节,如为什么一个 WebSocket 连接关闭。OnError 在 websocket 通信出现异常才会调用。
在清单 3 中我们可以看出,如果我们有新消息需要推送到客户端,我们就可以调 sendMessage 方法,一旦客户端收到 message 就可以通过 Cordova plugin 调用系统 API 来实现消息提示。下文将着重讲解如何创建一个 Cordova plugin。
利用 Cordova plugin 调用本地 notification
以上我们了解了如何在 Hybrid App 中创建 websocket 连接,当我们收到信息时,这个时候只需要调用 IOS 或者 Android 的本地消息推送即可让用户知道有新的信息到达。这个时候我们就要创建一个新的 Cordova plugin 去触发 notification。
创建一个 Cordova plugin
Cordova plugin 是我们通过 JavaScript 调用系统 API 的中间件,一般情况下我们通过 JavaScript 不能够完成而系统 API 可以完成的任务时,我们就要创建一个 plugin。不同的平台在调用底层 API 时会有不同,但是前段代码不会改变。 以下我们将创建一个 Cordova plugin 用来调用本地消息推送。下文以 android 平台为例,其他平台思路类似。
Websocket 消息推送的利弊
Websocket 消息推送优点 :
开发周期短,维护成本低。
消息不经转第三方服务器,直接由服务器发送到客户端,安全性好。基于 GCM 或者 APNS 的消息推送会把消息发送 GCM 服务器或 APNS 服务器,再由他们转发到客户端。
自己开发服务端,可扩展性好。
对于客户端而言,长连接比轮询的方式性能和及时性更好。
Websocket 消息推送缺点 :
长连接浪费服务端资源。
不能后台运行,一旦 app 退出就不能收到 notification。
由于服务器保持多个长连接,性能将会下降,最大连接数也会有限制。