【友盟+】开发者社区

集成友盟推送安卓SDK收不到消息的进!

zhaoheng 发表于 2016-9-8 18:51:04 |

zhaoheng
zhaoheng 发表于 2016-1-4 18:20:28 | 显示全部楼层 |阅读模式
     “你好,我是一名安卓工程师,今天集成好了友盟推送,可怎么就收不到推送消息了呢?”
       每天,我们的技术支持同事都会接到此类问题的反馈。出现问题的原因算是五花八门,但其中多数是由于开发者在集成过程中丢三落四所导致的…… 嫌弃.jpg
       借作本文的机会,我们就把可能导致安卓设备收不到消息的原因一锅儿端!

Step 1 
    你应该检查用我们的demo能否正常收到推送消息
       友盟推送的Demo在我们的sdk中就有提供,安装到测试设备上并打开后如图:
demo.png
       使用SDK包中的Demo进行调试的方法,在我们的官方文档中有详细的说明,开发者可以按照步骤,简单快捷的上手demo,感受推   送。(demo用法地址:http://dev.umeng.com/push/android/integration#1_3)。
       另外,上图中打码部分为设备的device_token。可以获取device_token基本上说明demo可以正常运行。

Step 2
     你是否是用的是测试模式进行推送呢?别告诉我你没有添加测试设备…… 鼻孔兔.jpg
        添加测试设备需要开发者将获取到的测试设备的device_token(友盟推送中用于判定同一个appkey下设备的唯一标识)在友盟推送后台(http://push.umeng.com)——测试模式——添加测试设备中添加,如下图:
添加测试设备2.png
添加测试设备.png
       如果你选择了发送广播进行测试的话,请确保你的测试设备都已添加完备,否则可能会导致筛选结果为空。因此,我们建议测试模式下尽量先用单播进行测试。


Step 3

     可以获取device_token只是你实现推送的一小步,但却代表了你集成正确的一大步!
跨步.jpg
       获取device_token的方法,在我们文档中提供了两个(4.2.3获取设备device_token,5.1初次获取设备device_token)。
       如果在测试或其他使用场景中,需要获取设备的Device Token,可以使用下面的方法。
String device_token =UmengRegistrar.getRegistrationId(context)


说明
       Device Token为友盟生成的用于标识设备的id,长度为44位,不能定制和修改。同一台设备上每个应用对应的Device Token不一样。
       初次获取Device Token可以在mPushAgent.enable(registerCallback);的回调方法里获取,如下图:
mPushAgent.enable().jpg
       注册成功以后调用才能获得Device Token。
       Logcat如下图:
logcat获取token.png
       如果返回值为空,说明设备还没有注册成功,需要等待几秒钟,同时请确保测试手机网络畅通。

获取不到device_token了也别哭 哭.jpg ,快检查以下各项吧:
       一、请先检查使用demo能否正常工作,demo的使用方法如上文所述;
       二、确定是否将appkey、MessageSecret、以及包名都更换为开发者所申请的相应值。友盟推送官方文档提供了对于AndroidManifest配置文件的检查工具,你可以自行检查开发者的配置问题。SDK默认是不检查集成配置文件的,所以线上版本请关掉该配置检查,或者去掉这行检查代码。

       自定义检查集成配置文件的接口如下:
mPushAgent.setPushCheck(booleanpushCheck);

       一旦出现问题,控制台会报出错误。下图为AndroidManifest中未配置UMENG_APPKEY的报错:
缺少umeng_appkey的报错.jpg
       三、确定是否将Manifest里的几个intent的前缀更换了,即应用包名是否替换成你自己的。
我们的Demo中有三处【应用包名】,需要用户把他们全部替换。具体参考文档:http://dev.umeng.com/push/android/integration#1_4_2
       如图所示:
应用包名1.png
应用包名2.png

Step 4
    修改过应用包名后你应该再检查下Support v4是否用的是咱友盟推送的Demo所提供的?
      如果没有用的话有可能导致无法获取device_token,设备离线或收不到消息的情况发生。Demo提供的Support v4存放位置见下图:
support v4位置.png

Step 5
    在编译过程中,如果你的App进行了代码混淆,请确保添加了如下代码

-dontwarn com.ut.mini.**
-dontwarn okio.**
-dontwarn com.xiaomi.**
-dontwarn com.squareup.wire.**
-dontwarn android.support.v4.**
   
-keepattributes *Annotation*
   
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
   
-keep class okio.** {*;}
-keep class com.squareup.wire.** {*;}
   
-keep class com.umeng.message.protobuffer.* {
         public <fields>;
         public <methods>;
}
        
-keep class com.umeng.message.* {
         public <fields>;
         public <methods>;
}

-keep class org.android.agoo.impl.* {
         public <fields>;
         public <methods>;
}

-keep class org.android.agoo.service.* {*;}

-keep class org.android.spdy.**{*;}

-keep public class [应用包名].R$*{
    public static final int *;
}

如编译过程中遇到其他问题,或者对于混淆代码的添加有疑问请以文档编译问题部分为准:http://dev.umeng.com/push/android/integration#9_3


Step 6

    快看看你是否用的是咱最新版本的sdk?
       友盟推送在bbs的常用问题索引版块(传送门:http://bbs.umeng.com/thread-5911-1-1.html)提供了部分版本的集成配置变化帖子,不过我们仍建议开发者直接集成最新版本的sdk。新版sdk不仅会修复上版sdk的bug,还可以让你体验最前沿的推送功能,安全和功能两步走。

Step 7

    你用的是普通版本的sdk还是去utdid版本的sdk?

       有些用户反映,使用友盟推送的sdk和支付宝sdk冲突。因此我们提供了去utdid版本的sdk和普通版本的sdk供用户自行下载.如下图:
有关utdid.png


       需要注意的是, 没有集成支付宝sdk就集成了去utdid版本的sdk会由于没有utdid而导致无法生成device_token,当然也就无法获取到了。此时应该会出现报错,如下图:
no utdid.jpg

       因此,你应该根据开发的实际情况,选择适当的sdk进行集成,从而避免发生无法获取device_token的情况。

       特别提示,开发者请不要忘记或者遗漏集成jar包和so文件,避免集成失败。jar包我们要求开发者全部复制到项目中;so文件我们建议开发者集成如下图红框中的三个,其他的包用户可根据app的大小自行选择。
so文件.png


集成都查了没事儿啊,怎么就收不到消息呢,你们这个服务是不是……!!!
准没问题! 拍手.gif
集成都查了没问题,咱还没查设备呢不是?

Step 8

    看看你接收推送消息的设备是否长连在线吧。
       判断设备长连是否在线应该在在友盟推送后台--工具--设备状态查询里面查询,如下图:
设备状态查询.png

       如果设备长连在线仍然没有收到:可以查询下,设备状态有个更新时间,如下图:
设备更新时间.png

       统计设备长连在线时间(最后更新时间)有时是有一些延时的。有可能最后更新时间时设备在线,但当前设备已经是离线状态了。

       设备长连在线只和三个条件有关:1、网络环境稳定良好     2、pushservice运行3、push service连接上友盟服务器。

       判断pushservice是否运行,要在设定--应用程序管理--运行中进行查看进程,如下图:

设备进程.png


       你也可以通过 adb shell ps | grep com.umeng.message.example 这个指令查询到友盟push的进程,如下图:

adb进程.jpg


       说到pushservice,我们就要引入“宿主”的概念了。
       由于pushSDK在设计上采取了多路复用的技术方案,即设备上多个集成了友盟消息推送SDK的App会共用一条长连通道, push service会挂靠在某一个App上,此时长连service所挂靠的App称为“宿主”。
       综上,若自己的App不是宿主,而是挂在别的App上,我们会提示目前的宿主是用户设备中的哪款App,并附上当时设备的device_token,如下图:
非宿主.png

(图为2015年圣诞前夕,友盟推送的节日特别页面)

       如上文所说,设备在线时,push service应该是运行的。但也有可能push service在用户设备上存在,却未连接到友盟推送的服务器,从而导致了设备离线。检查此种情况,你可以在logcat里面,查看push service的心跳信息,如下图:
logcat心跳.jpg

       如果有心跳信息的话,说明用户设备到友盟推送服务器之间的长连接是畅通的,但是有可能消息已经推送到了设备上,却并没有被展示出来。此时,你可以再查询一下设备的消息历史,如下图所示
查询设备历史消息.png


       这里我来解释下“已送达“这个状态的定义。”已送达“说明消息已经确实被下发。消息送达到设备后,设备返回给友盟推送服务器一个ack回执,告诉服务器端App已经收到消息,服务器才会把状态归档成 ”已送达”。
       此外,通过查看logcat里面的onMessage,也可以打印出来消息是否已经送到,如下图:

on message.jpg       
      
       当你通过上述两种方式确定消息已经下发到手机,但是并没有显示出来后,你需要检查以下情况:
1、 包名填错了,即包名与申请时所填的包名不一致;因此,消息无法路由到App头上。(详见STEP 3)
2、 在之前的代码里调用了PushAgent.setPushIntentServiceClass(MyPushIntentService.class);
后来又将该代码注释了。但是由于,SDK使用的SharedPreference存储该IntentService变量名,故虽然代码被注释了,但仍然可以从SharedPreference里读取到相应的IntentService,从而导致错误。
遇到此种情况,你只需把app清理数据或者重新安装便可解决。
3、 有可能是个别机型或者个别设备的适配问题所导致的,可以尝试换个其他型号的设备再进行测试。

Step 9
       如果仍收不到推送,你可以尝试强杀掉APP的service,再重新启动;或者直接删了APP重启设备重新安装下APP。上述操作都有可能造成应用的卸载信息传回到我们友盟推送的服务器,造成设备的device_token发生变化,所以你需要再重新获取下device_token进行单播。
       还有一处需要注意,如果分别下发了两条消息,却只收到了一条,先不要着急。因为同一台设备在1分钟内收到同一个应用的多条通知时,不会重复提醒,同时在通知栏里新的通知会替换掉旧的通知。如需更改此默认策略请参考: http://bbs.umeng.com/thread-6460-1-1.html

    相信经过上面的各个排查步骤,开发者推送的消息就可以乖乖的出现在用户设备的屏幕上啦! 欢脱举手.jpg


当然,还要用户没有在设备中手动禁掉贵应用的推送功能才行哦。 巨脸不屑.jpg














上一篇:ios7推送中心消息不消失
下一篇:关于设备Device Token的问题


友盟PUSH
友盟PUSH 发表于 2016-1-5 10:58:02 | 显示全部楼层
这回全了,基本上总结了收不到消息的多种原因,如果在集成过程中还碰到问题,欢迎给作者留言,便于我们进一步完善。

无限bug
无限bug 发表于 2016-1-7 15:43:15 | 显示全部楼层

贝壳程序媛
贝壳程序媛 发表于 2016-2-2 13:35:46 | 显示全部楼层
我的应用不管是api或者友盟后台。  都能收到, 但是收到的时间不确定, 有的时候发完立马就能收到, 有的时候超过半个小时甚至更长时间才能收到, 这是什么原因? 是不是因为长连接没有在线的原因?


哄哄哈嘿
哄哄哈嘿 发表于 2016-2-18 14:15:17 | 显示全部楼层


好奇先生
好奇先生 发表于 2016-3-8 11:40:31 | 显示全部楼层
友盟PUSH 发表于 2016-1-5 10:58
这回全了,基本上总结了收不到消息的多种原因,如果在集成过程中还碰到问题,欢迎给作者留言,便于我们进一 ...

我把demo的对应包名和key换成我自己的,根据开发文档把该换的sdk、jar等都换了,运行到真机(华为荣耀7,android5.0),device_token能获取、设备查询也在线,在测试模式能够收到推送,但是一到正常消息推送就收不到了,网络也切换过wifi和移动4G,看app的后台服务也在,但logcat经常看到心跳信息heart-->[network_error_connect_1334][client_receive]



Winston
Winston 发表于 2016-5-23 16:31:54 | 显示全部楼层
在非宿主状态下,通知消息和自定义消息都收不到
但是,后台看到这个”已取走“是什么意思?

机型:红米3
App 状态:进程被杀死
Snip20160523_2.png

HappyBug
HappyBug 发表于 2016-6-13 17:59:22 | 显示全部楼层
本帖最后由 HappyBug 于 2016-6-13 18:00 编辑

机型:红米
问题:用官方demo运行到手机上后获取device_token并添加到测试模式中,在APP存在时可正常收到推送,杀死后,变成了无服务,离线状态,接收不到推送

名字取得好有屁用
名字取得好有屁用 发表于 2016-6-13 21:12:41 | 显示全部楼层
加了自定义的pushintentserver 就注册不成功,老是报isRegisteredToUmeng: empty registration id,注释掉就收到了,但是不符合需求啊,卸载重装一样的。

名字取得好有屁用
名字取得好有屁用 发表于 2016-6-13 21:13:30 | 显示全部楼层
前面测试的时候 还可以,但是什么都没改,突然最近就出现楼上说的那种问题了,有人遇到相同的问题吗

umeng_lwp
umeng_lwp 发表于 2016-6-22 15:23:16 | 显示全部楼层
程序在手机的最近应用程序列表移除的时候,就收不到推送了,通过设置--->应用程序--->正在运行的程序,查看pushService已经不存在了,楼主,有木有什么措施能够保持,程序被移除后,pushService仍然能够继续运行呢??

安卓
安卓 发表于 2016-7-5 11:54:45 | 显示全部楼层
您好,我是准备集成最新版的2.8.1的推送sdk,然后 按照步骤安装了demo,检查了近两个小时未发现有任何遗漏,但demo仍旧获取不到device_token。mPushAgent.setPushCheck(true);也打开了。然而log里只显示了E/com.umeng.message.UmengRegistrar(32446): isRegisteredToUmeng: empty registration id。求大神告知是什么问题?

jakkk
jakkk 发表于 2016-7-8 16:32:22 | 显示全部楼层
友盟PUSH 发表于 2016-1-5 10:58
这回全了,基本上总结了收不到消息的多种原因,如果在集成过程中还碰到问题,欢迎给作者留言,便于我们进一 ...

http://msg.umengcloud.com/v2/launch  无法访问

07-08 16:14:31.652 2723-2900/com.umeng.message.example I/com.umeng.message.proguard.l: status code : 404
07-08 16:14:31.652 2723-2900/com.umeng.message.example I/com.umeng.message.proguard.l: Sent message to http://msg.umengcloud.com/v2/launch
07-08 16:14:31.652 2723-2900/com.umeng.message.example W/System.err: java.net.ProtocolException: Unexpected end group
07-08 16:14:31.653 2723-2900/com.umeng.message.example W/System.err:     at com.squareup.wire.ProtoReader.nextTag(ProtoReader.java:147)
07-08 16:14:31.653 2723-2900/com.umeng.message.example W/System.err:     at com.umeng.message.protobuffer.PushResponse$ProtoAdapter_PushResponse.decode(PushResponse.java:401)
07-08 16:14:31.653 2723-2900/com.umeng.message.example W/System.err:     at com.umeng.message.protobuffer.PushResponse$ProtoAdapter_PushResponse.decode(PushResponse.java:376)
07-08 16:14:31.653 2723-2900/com.umeng.message.example W/System.err:     at com.squareup.wire.ProtoAdapter.decode(ProtoAdapter.java:182)
07-08 16:14:31.653 2723-2900/com.umeng.message.example W/System.err:     at com.squareup.wire.ProtoAdapter.decode(ProtoAdapter.java:164)
07-08 16:14:31.653 2723-2900/com.umeng.message.example W/System.err:     at com.umeng.message.proguard.l.a(NetworkHelper.java:211)
07-08 16:14:31.653 2723-2900/com.umeng.message.example W/System.err:     at com.umeng.message.proguard.l.a(NetworkHelper.java:88)

友盟PUSH
友盟PUSH 发表于 2016-7-8 17:45:43 | 显示全部楼层
jakkk 发表于 2016-7-8 16:32
http://msg.umengcloud.com/v2/launch  无法访问

07-08 16:14:31.652 2723-2900/com.umeng.message.exa ...

混淆是否按照文档的方法添加的,添加的是否正确? 请认真检查一下


q123456zzl
q123456zzl 发表于 2016-7-13 18:08:42 | 显示全部楼层
连v4都要用你的,那你也至少要用个版本高点的v4吧,现在android M都有了,用你了,是不是太out了,用你的,我还用不用其他的jar了??你v4里面有ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)这个方法吗??尼玛,醉了...

pdelegant
pdelegant 发表于 2016-7-18 14:39:25 | 显示全部楼层
好奇先生 发表于 2016-3-8 11:40
我把demo的对应包名和key换成我自己的,根据开发文档把该换的sdk、jar等都换了,运行到真机(华为荣耀7,a ...

你好,我也是这个问题,请问解决了吗

pdelegant
pdelegant 发表于 2016-7-18 14:40:39 | 显示全部楼层
haidong 发表于 2016-5-23 14:14
荣耀7收不到推送是怎么回事?

我的也是,收不到消息,测试的话收的到。请问这个问题解决了吗

pdelegant
pdelegant 发表于 2016-7-18 14:45:22 | 显示全部楼层
安卓 发表于 2016-7-5 11:54
您好,我是准备集成最新版的2.8.1的推送sdk,然后 按照步骤安装了demo,检查了近两个小时未发现有任何遗漏 ...

我开始时也遇到了这个问题,在Application的onCreate()中加入mPushAgent = PushAgent.getInstance(this);
                mPushAgent.setDebugMode(true);就可以了,希望对你有帮助。

Bigger
Bigger 发表于 2016-7-26 15:28:51 | 显示全部楼层
本帖最后由 Bigger 于 2016-7-26 15:33 编辑

在umeng的推送平台上,android用测试推送可以收到,正常推送就收不到,状态是“筛选结果为空”,这是什么原因?demo是可以正常收到推送的


younger
younger 发表于 2016-8-14 20:46:08 | 显示全部楼层
你这怎么不把问题说全啊,“第一步检查demo是否能正常运行”,demo不能enable获取不到device_token怎么办,说一下啊

ethan_yan
ethan_yan 发表于 2016-8-17 17:39:30 | 显示全部楼层
友盟PUSH 发表于 2016-1-5 10:58
这回全了,基本上总结了收不到消息的多种原因,如果在集成过程中还碰到问题,欢迎给作者留言,便于我们进一 ...

有一种情况, 我用的android studio, applicationid 和AndroidManifest里的package不一样,后台显示送达,但是收不到手机上收不到消息,报错如下:
08-17 16:42:42.756 16604-16604/com.dcone.smartcore W/System.err: java.lang.IllegalArgumentException: ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have com.dcone.smartcore.R$* configured in obfuscation. field=umeng_push_notification_default_large_icon
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.umeng.common.message.c.a(Res.java:224)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.umeng.common.message.c.c(Res.java:150)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.umeng.message.UmengMessageHandler.getLargeIcon(UmengMessageHandler.java:462)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.umeng.message.UmengMessageHandler.a(UmengMessageHandler.java:390)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.umeng.message.UmengMessageHandler.dealWithNotificationMessage(UmengMessageHandler.java:122)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.umeng.message.UmengMessageHandler.handleMessage(UmengMessageHandler.java:62)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.umeng.message.UmengMessageCallbackHandlerService.onStartCommand(UmengMessageCallbackHandlerService.java:101)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2744)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at android.app.ActivityThread.access$2100(ActivityThread.java:142)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1310)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at android.os.Looper.loop(Looper.java:136)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5241)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:818)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
08-17 16:42:42.766 16604-16604/com.dcone.smartcore W/System.err:     at dalvik.system.NativeStart.main(Native Method)

是applicationid和package不一样导致的,但是需求就是要求这两者不同的, 有什么办法能解决?

友盟PUSH
友盟PUSH 发表于 2016-8-18 11:20:13 | 显示全部楼层
ethan_yan 发表于 2016-8-17 17:39
有一种情况, 我用的android studio, applicationid 和AndroidManifest里的package不一样,后台显示送达 ...

http://dev.umeng.com/push/android/integration#7_10   通过自定义资源包名可以解决mPushAgent.setResourcePackageName(String packageName);


昵称
昵称 发表于 2016-8-18 12:00:35 | 显示全部楼层
E/com.umeng.common.message.c: getRes(null,umeng_push_notification_default_large_icon)
08-18 11:52:38.573 29615-29615/com.zhongsou.dongfangmeishi W/System.err: java.lang.IllegalArgumentException: ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have com.zhongsou.dongfangmeishi.R$* configured in obfuscation. field=umeng_push_notification_default_large_icon
应用设置icon了,也根据上面说的做了,后台也显示推送成功。手机就是收不到消息,什么情况?发邮件也说问题了,邮件回复让抓日志,说什么集成的问题,我自己写了一个demo,就是一个简单的消息推送,能收到。集成到公司项目里面就是不行。没人能回答吗?

点评

我也是这个问题 请问解决了吗  发表于 2017-1-22 14:55

weiweimhy
weiweimhy 发表于 2016-9-8 18:51:04 | 显示全部楼层
友盟PUSH 发表于 2016-8-18 11:20
http://dev.umeng.com/push/android/integration#7_10   通过自定义资源包名可以解决mPushAgent.setResou ...

同样的问题,mPushAgent.setResourcePackageName(String packageName);设置以后依然收不到推送
12下一页
您需要登录后才可以发帖 登录 | 立即注册

本版积分规则

发表主题

精彩推荐

【报错必看】微信您的应用签名不正确,请去微信后台确认
微信如果提示这个错误,请查看debug日志: 箭头所指的为你当前应用的签名及包名,然后打开你的微信后台
自定义事件有消息数量,却看不到详情
集成都是OK的,能看到自定义事件的消息数量。却看不到详细的详情。 总是显示数据无法加载,稍后重试。
关于自定义事件的那些事儿
各位友盟的小伙伴,友盟君又来普及知识啦,上次写了一篇关于渠道使用的那些事,反馈还不错,为了能让大家更

关注我们

新浪微博
微信

欢迎关注友盟官方微博微信!

在线客服
返回顶部 返回列表