androidpn-client笔记及BUG修改

简介: 这几天应业务需要,在搭建一个推送的DEMO。在参考了许多资料之后,最终使用了androidpn。 androidpn分server端和client端。server端几经折腾,最终采用了github上的一个版本,毕竟代码质量好控制。

这几天应业务需要,在搭建一个推送的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


目录
相关文章
|
前端开发 JavaScript 开发者
fetch的常见问题及其解决办法
摘要: 玩转fetch。 作者:wonyun 原文:fetch使用的常见问题及其解决办法 Fundebug经授权转载,版权归原作者所有。 首先声明一下,本文不是要讲解fetch的具体用法,不清楚的可以参考MDN fetch教程。
2629 0
|
9月前
|
SQL HIVE
常见的bug---4、在DataGrip上跑本地模式报return 2异常
常见的bug---4、在DataGrip上跑本地模式报return 2异常
|
11月前
|
JavaScript 前端开发 API
每个 Bug 都值得认真对待:分享一个 debug 的案例,推荐给前端实习生参考
每个 Bug 都值得认真对待:分享一个 debug 的案例,推荐给前端实习生参考
215 0
|
Java 开发工具 git
Local History里没记录??IDEA代码丢失的解决办法
Local History里没记录??IDEA代码丢失的解决办法
Local History里没记录??IDEA代码丢失的解决办法
|
XML 安全 数据格式
测试妹子提了个bug,为什么你多了个options请求?
对于简单请求来说,如果请求跨域,那么浏览器会放行让请求发出。浏览器会发出cors请求,并携带origin。此时不管服务端返回的是什么,浏览器都会把返回拦截,并检查返回的response的header中有没有Access-Control-Allow-Origin是否为true,说明资源是共享的,可以拿到。如果没有这个头信息,说明服务端没有开启资源共享,浏览器会认为这次请求失败终止这次请求,并且报错。
173 0
测试妹子提了个bug,为什么你多了个options请求?
|
Linux 测试技术
软件测试Linux面试题:三种查看server.log的文件内容
软件测试Linux面试题:三种查看server.log的文件内容
375 0
Github连接 VS Code踩坑记录
在我输入这行命令之后出现的提示信息,为什么别人行我不行,先记录下这个坑。
1360 0
|
前端开发 数据库管理 索引
20180614删除bootstrap$记录无法启动3补充
[20180614][20180614]删除bootstrap$记录无法启动3(补充).txt --//昨天测试删除bootstrap$记录,导致数据库重启出现问题的修复方法: --//链接: http://blog.
1197 0
|
JSON 开发框架 .NET
net core 小坑杂记之配置文件读取(不定期更新)
    其实很早就想写了,原想等积累差不多了再写的,但是发现遇到一个当时记下效果会比较好,所以就不定期更新这个系列了,后面获取会整个整理一下。     此篇记载net core入门时踩的一些坑,网上教程太少了,也不规范,一些小细节都没人提,对于自学的小白来说,真是能把自己坑到放弃~  but,坚持住!你会发现解决问题以后会更有意思。
1217 0