这几天应业务需要,在搭建一个推送的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修改的更多相关文章

  1. androidpn-server笔记及BUG修改

    上篇讲了androidpn的client端,这篇该讲一下我使用androidpn-server端的笔记了. 这里我使用的androidpn是tomcat版的,由不知哪位大神移植并修复了部分bug的版本 ...

  2. 四则运算题目生成程序(基于控制台)(Bug修改)

    针对上个程序中出现的bug进行修改 https://git.coding.net/cx873230936/calculator.git Bug: 1.控制台输入问题数问题 a.不能处理用户输入负数. ...

  3. Android下载管理DownloadManager功能扩展和bug修改

    http://www.trinea.cn/android/android-downloadmanager-pro/ 本文主要介绍如何修改Android系统下载管理,以支持更多的功能及部分bug修改和如 ...

  4. java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionListener

    在运行AndroidpnClient项目时出现了java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionLis ...

  5. discuz “欣” “衡” 用户不能注册 bug修改

    discuz “欣” “衡” 用户不能注册 原因是 discuz 有这样一段代码 function check_username($username) { $guestexp = '\xA1\xA1| ...

  6. python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改

    python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...

  7. WampServer Version 2.5 bug修改

    做PHP开发都需要安装PHP的运行环境,为了方便,网上可以下载到好多的集成环境,最近使用WampServer Version 2.5发现有一些bug,分享一下修改的方法.高手请路过. 1.echo d ...

  8. BUG修改纪录

    刚进入现在的公司,接手了一个遗留的项目,BUG频出,最近一个星期都在加班改BUG,身心疲惫,为了 现在,将来不会再被相同BUG困扰,特来纪录一下. 1.数据库设计字段时,对于int等类型最好设置默认值 ...

  9. AndroidPn服务端部分bug解决方案

    目前推送的情况已经大致可以了,可以正常推送.但是要在实际生产中使用,要改进很多地方. 原本的版本,是不会对消息重新发送的.消息如果丢失,或者用户没有在线,消息也不会重新的发送.所以,这些问题都是要解决 ...

随机推荐

  1. C语言程序设计第五次作业——循环结构

    (一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...

  2. windows server 2003 远程桌面最大连接数调整与windows 2008远程桌面后,本地帐号自动锁定

    调整windows server 2003 最大远程连接数的步骤如下: 第1步.开始-->控制面板-->添加或删除程序-->添加/删除windows组件-->选择"终 ...

  3. 详解linux进程间通信-管道 popen函数 dup2函数

    前言:进程之间交换信息的唯一方法是经由f o r k或e x e c传送打开文件,或通过文件系统.本章将说明进程之间相互通信的其他技术-I P C(InterProcess Communication ...

  4. pm2快速使用

    介绍 pm2 是一个带有负载均衡功能的Node应用的进程管理器..它使您可以永久保持应用程序的活动状态,无需停机即可重新加载应用程序,并且可以方便常见的系统管理任务 特性 行为配置 源地图支持 容器集 ...

  5. PAT-013 L1-013. 计算阶乘和

    L1-013. 计算阶乘和 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对于给定的正整数N,需要你计算 S = 1! + 2 ...

  6. numpy的初探

    # data = numpy.genfromtxt("C:\\Users\\Admin\Desktop\\111.txt", delimiter='\t', dtype='str' ...

  7. 手把手教你全家桶之React(一)

    前言 最近项目用到react,其实前年我就开始接触react,时光匆匆,一直没有时间整理下来(太懒啦)!如今再次用到,称工作间隙,对全家桶做一次总结,项目源码地址.废话不多说,上码. 创建一个文件目录 ...

  8. FJUT第四周寒假作业之第一集,临时特工?(深度优先搜索)

    原网址:http://210.34.193.66:8080/vj/Contest.jsp?cid=163#P2 第一集,临时特工? TimeLimit:1000MS  MemoryLimit:128M ...

  9. Go 语言指针

    Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址. Go 语言 ...

  10. 线程停止与volatile

    1.使用标志位停止线程 在Java中希望停止线程,可以使用设置标志位的方法,如下例所示: class SimpleTask implements Runnable{ private boolean s ...