信鸽Android推送解决问题记录--无法跳转到指定页面

之前收到客服反馈的问题:华为手机,点击通知消息后,无法跳转到指定页面。当时同事定位的问题是厂商通道,因为忙于其他需求,给出的解决办法是暂时关掉厂商推送。最近有时间了,开始解决这个问题。

集成信鸽推送的时候,可以选择集成小米、华为、魅族这三家的厂商推送,按照文档集成后,使用相应厂商的设备运行时,在logcat中,以xinge为tag可以看到很多信息,如果看到other push token不为空的话,说明厂商通道已经注册成功了。这个时候,通过信鸽控制台发送消息,即使app进程被杀掉,也是可以收到推送的。但是可能出于某些奇奇怪怪的原因,other push token为空,说明厂商通道注册失败,这时会走信鸽推送,当App进程被杀掉后,能否收到推送,就看天意了。

之前使用的信鸽SDK版本是3.2.2,这次既然要搞,自然要升级了,果断升级至最新的4.2.0-beta版,4+版本相比于3+版本,一个区别是支持厂商通道动态灵活加载。升级完后,发现个很尴尬的问题,厂商通道注册成功率太低了,基本上注册成功后,再次注册,大概率失败,搞了几天后,决定降至3.2.6。

现在厂商通道注册成功了,为什么点击后无法跳转呢?信鸽推送有两种方式下发信息。

第一种方式是通过自定义的key-value,控制台设置如图:信鸽Android推送解决问题记录--无法跳转到指定页面_第1张图片对应的,在app端,要使用XGPushManager.onActivityStarted(Context context)方式获取这些信息。这种方式,只适用于非厂商通道。如果使用的是厂商通道,这种方式是获取不到值的。

第二种方式是使用Intent方式,信鸽开发文档中明确指出,使用厂商通道的时候,必须使用这种方式来跳转并获取参数。链接如下:http://docs.developer.qq.com/xg/android_access/android_faq.html#消息点击事件以及跳转页面方法,在控制台中设置如图:信鸽Android推送解决问题记录--无法跳转到指定页面_第2张图片

举个栗子:比如要跳转的链接为https://xg.qq.com/docs/android_access/android_faq.html#消息点击事件以及跳转页面方法

那么这里的Intent参数应该为:xgscheme://com.xg.push/notify_detail?scheme=https&host=xg.qq.com&path=/docs/android_access/android_faq.html&fragment=消息点击事件以及跳转页面方法

相应的,在app端,要使用文档中推荐的getIntent()方式获取相应参数。

所以,为了保证在小米、华为、魅族手机上可以使用厂商通道,而在其他品牌手机上使用信鸽推送,我们最后保留了两套处理逻辑,先使用XGPushManager.onActivityStarted(Context context)方法获取自定义的key-value信息,如果为空时,再尝试获取Intent方式传的参数。这样,不论最后使用的是厂商通道还是信鸽自己的推送,都能获取到参数并跳转。

------------------------------更新-------------------------------------

最近检查代码,发现之前厂商通道获取参数跳转逻辑有问题,现在更新了,记录如下:

/**
* uri通过getIntent().getData()获取
**/
public static String getLinkFromXG(Uri uri) {
        if (uri == null) {
            return null;
        }

        String scheme = uri.getQueryParameter("scheme");
        String host = uri.getQueryParameter("host");
        String path = uri.getQueryParameter("path");
        String fragment = uri.getQueryParameter("fragment");

        StringBuilder builder = new StringBuilder();

        //scheme
        builder.append(scheme).append("://");
        //host
        builder.append(host);
        //path
        if (!TextUtils.isEmpty(path)) {
            builder.append(path);
        }
        //query
        Set queryParameterNames = uri.getQueryParameterNames();
        Iterator iterator = queryParameterNames.iterator();
        boolean hasQuery = false;
        while (iterator.hasNext()) {
            String nextParameter = iterator.next();
            if (!TextUtils.equals(nextParameter, "scheme")
                    && !TextUtils.equals(nextParameter, "host")
                    && !TextUtils.equals(nextParameter, "path")
                    && !TextUtils.equals(nextParameter, "fragment")) {
                if (!hasQuery) {
                    builder.append("?");
                    hasQuery = true;
                }
                String queryParameter = uri.getQueryParameter(nextParameter);
                builder.append(nextParameter).append("=").append(queryParameter).append("&");
            }
        }
        int lastIndexOf = builder.lastIndexOf("&");
        if (lastIndexOf > 0) {
            builder.deleteCharAt(lastIndexOf);
        }
        //fragment
        if (!TextUtils.isEmpty(fragment)) {
            builder.append("#")
                    .append(fragment);
        }
        return builder.toString();

    }

 

你可能感兴趣的:(android,学习笔记)