前段时间做的项目需要添加一个推送的功能,现在应用里边加入推送也很普遍,所以查了查相关的资料,总结了以下几种方案!
【1】使用XMPP协议(Openfire + Spark + Smack)
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。
缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。
这种方法需要服务端配合,需要整合openfire服务器,我们的服务端用的php,而这个需要用Java,客户端的代码也需要花一段时间去研究,由于时间有限并没有使用这种方法。不过在后来的开发中,想在程序里加入类似于微信的语音聊天的功能,所以对于这种方式又进行了一段开发,以后我会写一篇文章介绍一下。
【2】使用MQTT协议
简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:http://mqtt.org/),且已有C++版的服务端组件rsmb。
【3】使用第三方推送服务
1.Google 云推送服务
鉴于国内的特殊情况,大部分国产手机都砍掉了Google服务,所以这种实现方式不太现实
2. 百度云推送服务(http://open.baidu.com/)
这个推送方案实施起来比较简单,直接集成相关的sdk,就可以实现推送,而且服务端的sdk有PHP,Java,Python版本,也可以直接通过url推送相关消息
3. 极光推送(https://www.jpush.cn/)
这个文档比较全,号称3分钟快速Demo,集成起来相对就简单多了
今天主要介绍一下第二种推送方案,之前查资料的时候没有找到百度云推送和极光推送,也是后来一个偶然的机会发现百度推出了云推送服务,今天总结一下,也希望以后各位朋友在开发中少走弯路,
1.首先下载rsmb包,并解压,找到对应服务器的文件夹,我的是linux_ia32,这个支持多种服务器
(下载地址:http://www.alphaworks.ibm.com/tech/rsmb,或者 http://pan.baidu.com/share/link?shareid=305439419&uk=137542493)
2.把目录及里面的文件上传到服务器上,(我的是linux服务器)进入到用命令行进入到该目录 然后自行 ./broker 如此这般便启动了推送服务,
3.准备推送页面(通过网页进行推送测试)下载PHP端的推送代码 (http://pan.baidu.com/share/link?shareid=311569022&uk=137542493),解压进入 etc目录更改 config.php里的IP地址为你的服务器IP地址
4.打开对应的url既可以看到如下的页面
Server status显示为 Online说明服务器正常启动了,
5.下面开始准备android客户端(下载地址https://github.com/tokudu/AndroidPushNotificationsDemo )
下载-->解压-->导入eclipse-->修改PushService里的MQTT_HOST为你的服务器的IP地址-->运行
启动推送服务,然后在上边的网页上把那一串字符输入到上边的输入框,下边输入要推送的内容
不幸的是报错了,错误如下
08-05 13:56:34.472: E/AndroidRuntime(30976): java.lang.VerifyError: com/tokudu/demo/PushService
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.tokudu.demo.PushActivity$1.onClick(PushActivity.java:32)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.view.View.performClick(View.java:4240)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.view.View$PerformClick.run(View.java:17721)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Handler.handleCallback(Handler.java:730)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Handler.dispatchMessage(Handler.java:92)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Looper.loop(Looper.java:137)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.app.ActivityThread.main(ActivityThread.java:5103)
08-05 13:56:34.472: E/AndroidRuntime(30976): at java.lang.reflect.Method.invokeNative(Native Method)
08-05 13:56:34.472: E/AndroidRuntime(30976): at java.lang.reflect.Method.invoke(Method.java:525)
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-05 13:56:34.472: E/AndroidRuntime(30976): at dalvik.system.NativeStart.main(Native Method)
这个错误是因为少了个jar包,只要加入jar包就可以了(下载地址 http://pan.baidu.com/share/link?shareid=455455739&uk=137542493)
推送成功
【e】在后续的开发中遇到了个错误,在此提出来希望各位朋友避免出现此错误
1.当推送服务启动的时间过长时,一般启动几个月之后,可能会出现客户端连接不上服务,可能会导致程序无法运行,此时需要重新启动推送服务就可解决
欢迎加QQ群 Android技术交流分享(167449133) 讨论!!!
所有评论(0)