200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 信鸽Android推送解决问题记录--无法跳转到指定页面

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

时间:2018-07-13 23:51:19

相关推荐

信鸽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,控制台设置如图:对应的,在app端,要使用XGPushManager.onActivityStarted(Context context)方式获取这些信息。这种方式,只适用于非厂商通道。如果使用的是厂商通道,这种方式是获取不到值的。

第二种方式是使用Intent方式,信鸽开发文档中明确指出,使用厂商通道的时候,必须使用这种方式来跳转并获取参数。链接如下:http://docs./xg/android_access/android_faq.html#消息点击事件以及跳转页面方法,在控制台中设置如图:

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

那么这里的Intent参数应该为:xgscheme://com.xg.push/notify_detail?scheme=https&host=&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();//schemebuilder.append(scheme).append("://");//hostbuilder.append(host);//pathif (!TextUtils.isEmpty(path)) {builder.append(path);}//querySet<String> queryParameterNames = uri.getQueryParameterNames();Iterator<String> 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);}//fragmentif (!TextUtils.isEmpty(fragment)) {builder.append("#").append(fragment);}return builder.toString();}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。