androidpn-client笔记及BUG修改
这几天应业务需要,在搭建一个推送的DEMO。在参考了许多资料之后,最终使用了androidpn。
androidpn分server端和client端。server端几经折腾,最终采用了github上的一个版本,毕竟代码质量好控制。这将在另一篇文章详谈。
client端我是找到了一个精简版也改过一些BUG的版本,目前已经传到GITHUB上我fork的androidpn里,github地址:https://github.com/msdx/androidpn。在该项目中,我是使用androidstudio的,上面的androidpn-client-androidstudio目录就是了。下载可用。
目前上面已经的bug如下(如再有BUG修复会继续更新):
1、如果在客户端中配置的host不是IP而是域名时,无法连接。
解决方法是在getHost()方法中,判断是否为IP4或IP6的地址,如果不是,尝试将其当作域名来获取IP地址。修改 org.jivesoftware.smack.ConnectionConfiguration ,对getHost()方法修改如下:
public String getHost() {
// 如果不是IP,则尝试将它以域名进行IP转换。
if(!InetAddressUtils.isIPv4Address(host) && !InetAddressUtils.isIPv6Address(host)) {
try {
InetAddress address = InetAddress.getByName(host);
host = address.getHostAddress();
} catch (UnknownHostException e) {
Log.e(LOG_TAG, e.getMessage(), e);
}
}
return host;
}
2、如果重连接的任务已经完成,下次断开再重新连接时,等待时间重新开始计算。
在这里,我只是在ReconnectionThread类中的run()方法上加了一句waiting = 0;但是感觉好像不能这么改。未验证,有待确定。
另外,我修改了重连等待时间。这个就无所谓了,修改见:https://github.com/msdx/androidpn/commit/0d60a01134cdcd10c8be163887cab21255cc315a
3、第三个,就是修改了程序重新安装时会重新注册一个username的问题。
原来的username和password是随机生成的UUID,在这里我改为由手机设备号和包名生成的UUID,并将其作为username和password,涉及代码较多,见https://github.com/msdx/androidpn/commit/eb19ccf8abe549eb3b39002c12d2e60660bbcdc7。
主要修改org.androidpn.client.XmppManager的RegisterTask类的run()方法,代码如下:
public void run() {
Log.i(LOGTAG, "RegisterTask.run()...");
// 这个工具类是我参照网上的代码写的生成应用在设备里的唯一UUID的工具类。
final String uuid = UUIDUtil.getID(context);
if (!xmppManager.isRegistered()) {
// 密码也设成UUID,以使应用程序清除数据之后,再注册的用户username是一样的。
final String newUsername = uuid;
final String newPassword = uuid;
//这里代码省略。。。
if (packet instanceof IQ) {
IQ response = (IQ) packet;
// 用于判断是否注册。如果已经注册过,会返回一个409错误(表示冲突)。
String responseStr = null;
if (response.getType() == IQ.Type.ERROR) {
responseStr = response.getError().toString();
if (!responseStr.contains("409")) {
Log.e(LOGTAG,
"Unknown error while registering XMPP account! "
+ response.getError()
.getCondition()
);
}
}
// 如果是注册冲突,表示已经注册过,也同样提交。原来的代码为else if (response.getType() == IQ.Type.RESULT ) {
if (response.getType() == IQ.Type.RESULT || (responseStr != null && responseStr.contains("409"))) {
//以下省略。。。
4、修复当多条通知传送来时,点开后显示的都是最后一条的问题。
这里修改了org.androidpn.client.Notifier类,在notify()方法中将代码修改如下:
// 主要是这里的requestCode必须不同。不一定要与下面的requestCode一样。
PendingIntent contentIntent = PendingIntent.getActivity(context, requestCode,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.setLatestEventInfo(context, title, message,
contentIntent);
notificationManager.notify(requestCode, notification);
requestCode++;
5、修复锁屏后心跳包不发送,导致掉线问题。
这里修改了org/androidpn/client/NotificationService类,对其申请了电源锁。见:https://github.com/msdx/androidpn/commit/f6b1bf6da4a30dd712377a82d6e5b41ffc3d34f2
androidpn-client笔记及BUG修改的更多相关文章
- androidpn-server笔记及BUG修改
上篇讲了androidpn的client端,这篇该讲一下我使用androidpn-server端的笔记了. 这里我使用的androidpn是tomcat版的,由不知哪位大神移植并修复了部分bug的版本 ...
- 四则运算题目生成程序(基于控制台)(Bug修改)
针对上个程序中出现的bug进行修改 https://git.coding.net/cx873230936/calculator.git Bug: 1.控制台输入问题数问题 a.不能处理用户输入负数. ...
- Android下载管理DownloadManager功能扩展和bug修改
http://www.trinea.cn/android/android-downloadmanager-pro/ 本文主要介绍如何修改Android系统下载管理,以支持更多的功能及部分bug修改和如 ...
- java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionListener
在运行AndroidpnClient项目时出现了java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionLis ...
- discuz “欣” “衡” 用户不能注册 bug修改
discuz “欣” “衡” 用户不能注册 原因是 discuz 有这样一段代码 function check_username($username) { $guestexp = '\xA1\xA1| ...
- python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改
python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...
- WampServer Version 2.5 bug修改
做PHP开发都需要安装PHP的运行环境,为了方便,网上可以下载到好多的集成环境,最近使用WampServer Version 2.5发现有一些bug,分享一下修改的方法.高手请路过. 1.echo d ...
- BUG修改纪录
刚进入现在的公司,接手了一个遗留的项目,BUG频出,最近一个星期都在加班改BUG,身心疲惫,为了 现在,将来不会再被相同BUG困扰,特来纪录一下. 1.数据库设计字段时,对于int等类型最好设置默认值 ...
- AndroidPn服务端部分bug解决方案
目前推送的情况已经大致可以了,可以正常推送.但是要在实际生产中使用,要改进很多地方. 原本的版本,是不会对消息重新发送的.消息如果丢失,或者用户没有在线,消息也不会重新的发送.所以,这些问题都是要解决 ...
随机推荐
- 关于快速沃尔什变换(FWT)的一点学习和思考
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...
- [Codeforces Round #431]简要题解
来自FallDream的博客,未经允许, 请勿转载,谢谢. 好久没写cf题解了zzz 代码比较丑不贴了,cf上都可以看 Div2A. 给你一个长度为n(n<=100)的序列 判断是否可以分成奇数 ...
- [2017/5/28]FJ四校联考
来自FallDream的博客,未经允许,请勿转载,谢谢. 话说这一段时间算是过去了,好久好久之后终于又有联考了 没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量 ...
- [bzoj1041][HAOI2008]圆上的整点
我能想得出怎么做才奇怪好吗 题解:http://blog.csdn.net/csyzcyj/article/details/10044629 #include<iostream> #inc ...
- SqlServer 跨网段跨服务器复制
注意:被同步的表必须有主键,否则无法同步.对数据库进行操作时需要登录服务器,在服务器本地进行操作,远程对数据库进行操作不能完成所有的步骤 准备工作: 1.将发布数据库完整备份到订阅服务器上,并在订阅服 ...
- 简述RIP路由协议和OSPF路由协议的相同点和不同点。
路由协议分为静态路由协议和动态路由协议.动态路由协议有很多种,如RIP.OSPF.EIGRP等. 1.RIP(路由信息协议)是路由器生产商之间使用的第一个开放标准.RIP有两个版本:RIPv1和RIP ...
- 使用rsync在windows(服务端)与linux(客户端)之间同步
说明: 1.cwRsyncServer服务端 系统:Windows7 IP地址:192.168.0.110 2.Rsync客户端 系统:CentOS 6.7 IP地址:192.168.0.141 实现 ...
- 如何理解Spring AOP
什么是AOP? AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP允 ...
- mvn package 和 mvn install
刚刚准备将maven项目中一个子项目打个包,使用了mvn package.心想这个很简单嘛,没料就报错了.报错咱不怕,看看错在哪就好了. 编译出错,找不到我定义的异常类中的配置.那应该是引用父模块出来 ...
- AJAX 向后台发送带 List 集合的对象
现有基类: public class School { int name; int address; List<Student> students = new ArrayList<S ...