文档开发者中心
我的

【开发者必看】Push近期常见问题 解决方法指导书

本帖最后由 花粉Eva 于 2018-8-23 18:25 编辑

想了解更多Push集成、运营问题?
快点 联盟微访谈第2期-华为推送产品经理揭晓Push成功率翻倍的要诀!

本期为大家请来-
华为推送产品经理-蓝晓华,

向蓝经理提出你的疑问和需求,给大家分享你的干货经验,
就有机会赢取现金卡哦~


【近期常见问题解答】

Q1、产品开通推送服务后,是需要上架才能使用吗?
A:只开通推送服务不需要上架的。

Q2、遇到503,消息流控限制是多少?每秒、每天限制多少?限制调用次数还是推送给用户的个数?
A:不同应用是不一样的,一般的应用默认消息流控是针对单个应用3000QPS(每秒不能超过3000个token数)
另外,流控的标准是满足30分钟能推完全网用户,推荐大家精准选择人群推送,减少量,提升体验。如果超过这个值,推送将被系统流控返回503错误。如果觉得当前流控限制太小,可以进行申请,申请条件是:华为用户月活跃量需要达到500W(小于500W的不予申请)。可以从开发者联盟后台Push报表中查看,选择相对应应用,和上月量既可以看到30日活跃用户数。再联系客服申请。
另外,针对单个设备每天不能推送超过10万条/天,否则将进行推送权益限制,需要整改并申报整改方案重新申请push权益。

Q3、接入sdk成功后,能收到推送消息,把我的app关闭进程后收不到推送消息?
A:从通知栏消息和透传消息的方案对比可以发现通知栏消息是可以在应用杀死的时候进行消息推送的。此外支持NC(Notification Center)功能的手机:部分EMUI4.0和4.1的手机,以及EMUI5.0及之后的华为手机。

Q4、推送成功收不到消息,推送返回:{"message":"success","requestID":"1523868*****28427182","resultcode":0}
A:排查步骤:
1、网络不稳定,切换稳定网络进行测试。
2、检查手机是否为EMUI8.0.0系统,如果是早期的EMUI8.0,则要升级尝试(在手机会员服务——服务——升级尝鲜),或者用用targetversion用26以下的进行编译来规避这个问题。排查EMUI版本太低、小于4.1也是不支持的。
3、检查终端token是否正确,在联盟后台进行推送,如果联盟后台也推送失败则是token已失效、或者手机配置有问题,进行token检查和手机权限设置。如果能推送成功则,调用接口时参数配置错误导致。建议参考示例代码:http://developer.huawei.com/cons ... sample_code_agent_s
4、如果是通知消息检查通知的playload中的msg、appPkgName等配置是否正确。
5、华为移动服务的缓存问题,一般清理数据及缓存,并停止华为移动服务。
6、检查CP是否使用的是老版本的的push,老版本sdk会出现消息延时很明显的情况,以及收不到推送,需要尽快切换到新版本。
7、搜集日志(详情见日志抓取办法),搜索pushlog,里面有 。。。msg。。。A1,无法进行进一步判断的还是请我们专业人来判断吧!
rspPushMessage the response msg is  :A1,msgId:C6311444207B6DC6,flag:00(android/null:78)
这个代表消息已经到达了手机端
I/PushLogAC3009(14197): [Thread-29-1060]enter bdReport, cmd =cosa,  msgid = 671088641, eventId = 4,notifyId= -1(pushagent/CommFun.java:587)
此处的eventId标记了为什么通知栏消息没有弹出的原因
eventId = 1 :点击打开
eventId = 2 :用户清除
eventId = 3 :命令字不支持
eventId = 4 :应用不存在
eventId = 17 :Activity 没有配置exported:  true

Q5、调用推送消息的接口能直接返回推送的结果吗?返回结果中应用级错误码中包含“终端不在线”,“应用已卸载”等状态
A:调用推送接口不能直接放回推送状态,他可以返回本次推送的结果,换句话就是说本次推送成功与否,失败的话,则提供返回码。另一个角度,消息发送是有延迟和有效时间的,这时候返回显然不合理,推送状态可以从回执中进行获取。

Q6、指纹证书填错了,请问如何能修改。
A:现在指纹可以在联盟后台进行修改,最多支持配置5个指纹。

Q7、消息回执时,若群发中有一些是不能回执的,是否影响群发中另一部分的回执?
A:不会影响其他的

Q8、如何判断是否是华为手机
A:
  
可以判断是否安装华为移动服务
PackageInfo pi = null;
         PackageManager pm = this.getPackageManager();
         int hwid = 0;
         try {
             pi = pm.getPackageInfo("com.huawei.hwid", 0);
             if (pi != null) {
              int  result = pi.versionCode;
               Log.i("hwid",""+result);
             }
         } catch (PackageManager.NameNotFoundException e) {
             e.printStackTrace();
         }
result 有数据的话就是了
  
Q9、判断是否为EMUI系统
A:可以判断是不是EMUI系统:
int emuiApiLevel = 0;            
         try {            
             Class cls =  Class.forName("android.os.SystemProperties");  
             Method method = cls.getDeclaredMethod("get", new  Class[]{String.class});            
             emuiApiLevel = Integer.parseInt((String) method.invoke(cls, new  Object[]{"ro.build.hw_emui_api_level"}));            
         } catch (Exception e) {            
             e.printStackTrace();            
         }                  
emuiApiLevel 大于0就是了
  
Q10、如何判断EMUI版本>=4.1
A:判断代码如下:
      int emuiApiLevel = 0;            
         try {            
             Class cls =  Class.forName("android.os.SystemProperties");           
             Method method = cls.getDeclaredMethod("get", new  Class[]{String.class});  
             emuiApiLevel = Integer.parseInt((String) method.invoke(cls, new  Object[]{"ro.build.hw_emui_api_level"}));            
         } catch (Exception e) {            
             e.printStackTrace();            
         }      
判断emuiApiLevel>=9即可
可以参考相关网页说明http://developer.huawei.com/cons ... uaweipush_faq_agent

Q11、如何判断系统是EMUI8.0?
A:
nt emuiApiLevel = 0;
  try {
    Class cls = Class.forName("android.os.SystemProperties");
    Method method = cls.getDeclaredMethod("get", new  Class[]{String.class});
    emuiApiLevel = Integer.parseInt((String) method.invoke(cls, new  Object[]{"ro.build.hw_emui_api_level"}));
  } catch (Exception e) {
    e.printStackTrace();
  }
emuiApiLevel 如果大于13就是8.0。
  
Q12、Gettoken返回0,无法进入onToken函数,无法收到广播
A:
1.     自定义的Receiver有没有继承华为PushReceiver?
2.     AndroidMainfest配置完不完善,请对照现网配置进行检查。
3.     保存下来日志,并发过来。
4.     清理华为移动服务和应用的缓存和数据,重启手机。在进入应用试一下。
5.     如果日志中出 get token:end  0 和com.huawei.android.pushagent.PushServiceE/PushLog2551: [ReceiverDispatcher-230]responseRegisterTokenFAILED:1(android/PushCommandProcessor.java:557) 此处是华为移动服务状态是正常的,但是请求服务器出现异常,检查联盟推送状态是否为“已开通”,开通中是不正常的。
如果还是不行的话重复步骤4,准备日志输出,运行测试应用,打印日志。(见Q17日志抓取办法)

Q13、通知点击不调用自定义广播的onEvent方法
A:1、 配置customize字段,
http://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_agent.html?page=hmssdk_huaweipush_api_reference_agent_s2这个文档里面有一个属性字段叫customize,配置了这个点击通知栏消息才会执行onEvent方法。
2、 如果进程不存在,请检查是否被手机管家之类软件拦截,需要在软件中设置允许自启动。

Q14、Token格式公告
A:公告网址http://developer.huawei.com/consumer/cn/devservice/notice/20180316
Huawei Push为了提升安全性,在2018/3/10 升级了Token生成规则和变更机制,增加了Token格式2.0,在新的设备上会使用新格式的Token,具体规则如下:
1、机型与Token格式关系
①华为设备在2018年4月及之前发布的,使用Token格式1.0;
②华为设备在2018年5月及之后发布的,使用Token格式2.0;
③非华为设备 首次使用的HMS是 2.6.0及以前版本,使用Token格式1.0;
④非华为设备首次使用的是HMS 2.6.1 及之后版本,使用Token格式2.0。
2、Token格式1.0与2.0区别
①、Token格式1.0:
  a)Token长度32个字符,包含字符0-9、a-z、A-Z;
  b)Token值在设备生命周期内不变。
②、Token格式2.0
  a)TOKEN长度为不定长,当前为130字节,包含字符0-9、a-z、A-Z及特殊字符-和_;
  b)新版本的华为PUSH TOKEN会在包括但不限于下述场景中发生变化:
       APP卸载重装;
       APP调用的注销TOKEN接口;
        用户恢复出厂设置。
注:请勿用Token跟踪标记用户。
3、建议的最佳使用实践
①、应用不要固定判断PUSH TOKEN长度,因为后续长度可变;
②、PUSH TOKEN业务要定期更新(建议应用每次启动的时候都获取Token,如果发现和上次不同取到的不同,则上报到自己的服务器)。
给CP的建议:当前长度是130,建议字段设为256

Q15、发送自定义动作时,如何定义intent字段的值?
A:
在客户端先执行下面的代码并打印出intentUri值,并将intentUri赋予到推送消息的intent字段中。
Intent intent = new Intent();
intent.setClass(MainActivity.this,  ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  intent.putExtra("ext1","helloExt1");
  intent.putExtra("ext2","helloExt2");
String intentUri =  intent.toUri(Intent.URI_INTENT_SCHEME);
intent值使用上述生成的intentUri的值,需要实现在客户端写个demo生成。
【例如打印intentUri:intent:#Intent;launchFlags=0x10000000;component=com.***.***/com.huawei.***.  ActivityA;S.ext1=helloExt1;S.ext2=helloExt2;end】
备注:manifest中
在指定注册Activity的地方(就是ActivityA)加上
      
      
      也可以通过scheme方式启动
android:scheme="customscheme"
           android:host="com.huawei.pushtest"
android:path="/notify_detail"/>   

Q16、在杀死App进程的情况下,收到通知栏消息,点击通知栏不执行onEvent()回调
A:可以配置下应用的自启动和后台运行权限。
另外还有一种思路是指定activity跳转,即指定intent跳转,可以参考《发送自定义动作时,如何定义intent字段的值》

Q17、日志抓取办法:
A:Adb连上手机分别执行下面命令
adb shell setprop log.tag.hwpush VERBOSE
adb logcat –v time > D:\hwpush.log
复现问题场景
按Ctrl+c完成

【客户端报错常见总结】
  
现象
  
原因
排查
客户端返回907135000
传入的参数错误
1.检查manifest中配置的appid、APP SECRET、证书签名等配置信息;  
2.有可能是华为移动服务缓存导致的,卸载并重新更新华为移动服务,然后断开网络再连接,再打开app;  
3.建议用华为机器先测试,华为推送会依赖华为移动服务应用,在华为手机上都会预装这个应用,非华为手机上不会被预装。

客户端返回907135700
1.若集成的推送是2.5.2.0版本,检查配置appid的地方,去掉“appid=”,然后清理华为移动服务数据和缓存。不是2.5.2.0版本不需去掉“appid=”;  
2.卸载并更新华为移动服务,在设置→应用管理里(如果没看到,请点击下方按钮打开显示系统进程,找到华为移动服务后,EMUI5.0以后的版本,点击右上角卸载更新),如果应用正确集成了push SDK,打开APP会提示更新华为移动服务,按照安装后再测试,如果没正确集成请在华为市场更新华为移动服务后再测试;
3.去联盟后台,看看push服务状态是否正常。(正常的服务状态是:已开通);  
4.检查网络是否正常,如果是wifi测试,建议使用4G测试。

客户端返回
  
6003
指纹证书配置不一致导致
1.确定push指纹已经配置,本地客户端打包签名的证书和配置在服务端push权益的证书指纹是同一套证书
  (有时配置完指纹,直接运行本地客户端仍出现6003,因直接运行默认debug证书,说明release时没有用联盟上注册的签名文件);
  
2.更换签名文件后移动服务程序会缓存,需在应用程序管理中找到《华为移动服务》清理掉缓存和数据,关闭应用重新尝试。
详细内容参见:https://developer.huawei.com/con ... reference_errorcode


【服务端报错常见总结】
  
现象
  
原因
排查
推送接口返回80100007
All the tokens are invalid
检查下面地址是否正确:private static  String tokenUrl =  "https://login.cloud.huawei.com/oauth2/v2/token"; //获取认证Token的URL  
Private static  String apiUrl = "https://api.push.hicloud.com/  
pushsend.do"; //应用级消息下发API

推送接口返回80100003
不合法的payload
检查action--type  填写的值是否是相对应的操作方式,比如action--type =2为打开URL:URL地址由参数url定义,但是却没有定义url参数。
推送接口返回80100004 "msg":"Illegal expire time"
expire_time时间小于了当前时间导致的
格式ISO  8601[ 格式为:yyyy-MM-dd´T´HH:mm:ssXXX]:2013-06-03T17:30,采用本地时间精确到分钟。此值为发出去消息的超期时间,即:如果用户没有在线,此消息会保存到PUSH服务器的时间。
推送接口返回80300002 No permission to send message to these tmIDs
无权限下发消息给参数中的token列表
1.检查下联盟后台,Push服务状态是否正常。(正常的服务状态是:已开通)  
2.在联盟后台先发送推送消息测试,若成功,就是接口调用出错了;  
3.把accesstoken里的转义字符先去掉后再endoce  
4.可能是deviceToken不是对应appid获取的,注意下appID、access_token、deviceToken是否保持一致。  
5.如果是国内推送正常,而在海外服务器推送返回80300002码,需要重新申请push权益以开通海外的push权益,操作为:在联盟后台删除push服务,重新添加Push服务(提示:如果只有push服务,请先去应用市场上传一个apk,保存草稿状态也可以,不然重新添加的时候可能无法找到原来的应用)。

推送接口返回80300007
1.token失效了,请重新获取;  
2.同一个设备,不同的应用,token应该是不一样,容易误传递同样的值;  
3.手机端APP应用包名和申请appid的包名不一致,可能是build.gradle文件中applicationId 配置的和应用包名不一致。

推送接口返回503
被流控了
默认消息流控是针对单个应用3000QPS(每秒不能超过3000个token数),如果超过这个值,推送将被系统流控返回503错误。如果觉得当前流控限制太小,可以进行申请,当然是有条件的:华为用户月活跃量需要达到500W(小于500W的不予申请)。可以从开发者联盟后台Push报表中查看,选择相对应应用,和上月量 既可以看到30日活跃用户数。再联系客服申请。

推送接口返回403
access_forbidden
检查下推送时候的appid 和appid、appsecret和获取的accesstoken是否保持一致。

推送接口返回{"error":"session timeout"}
1.检查获取access_token和发送消息的接口中appID等相关配置参数是否正确;  
2.Access_token中的转义字符”\”没有去除,就进行了URL编码。  
3.Access_token的URL转码格式不一样,导致转码失败,在线转码网址推荐:
详细内容参见:https://developer.huawei.com/con ... _reference_agent_s2

如您还有更多疑问,可至以下帖子进行有奖提问哦:
联盟微访谈第2期-华为推送产品经理揭晓Push成功率翻倍的要诀!



点赞
3
收藏
3
回复
35
分享
举报
浏览38746 发布于2018-08-16 08:45未知归属地
全部评论
最多点赞
最新发布
最早发布

厉害了,写的蛮好的啊

35楼回复于2020-04-25 07:34 未知归属地
花粉Eva 发表于 2018-9-27 09:55
开发者你好,请问你用的push哪个版本呢?

你好,我近期遇到同样的问题,版本 为 2.6.1.301,是否能确认是SDK的问题导致的
34楼回复于2019-06-21 01:50 未知归属地
您好 友盟推送 集成华为厂商通道 HuaWeiRegister 只打了一条 “huawei register begin”然后就没有结果了 也不显示注册成功 也不显示失败 杀掉app进程也收不到离线推送 请问这是怎么回事啊
33楼回复于2019-06-04 12:33 未知归属地
你好,关于接入文档中提到的两个Provider,其中的UpdateProvider我已经了解了,是在HMS SDK引导用户更新最新版华为移动服务apk时候使用的。那么请问另一个UpdateSdkProvider以及HmsAgent.checkUpdate()方法所涉及到的“应用自升级”,具体的应用场景是什么呢,如果不使用也不在AndroidManifest.xml中配置的话可以吗?
32楼回复于2019-05-21 09:48 未知归属地
All the tokens are invalid 错误为什么失去检查地址对不对,难道地址错了都能收到返回?我也遇到这个错误了,仔细检查了在检查,实在不知道为什么了,特来此求助了。另外我的device token 在华为后台测试发送通知都可以成功的
31楼回复于2019-05-11 05:47 未知归属地
麻烦问下,申请push服务,选择已创建的产品,无法提交是什么原因啊?
30楼回复于2019-03-29 07:21 未知归属地
错误码907135000:传入的参数错误。

  • 检查manifest中配置的appid、APP SECRET、证书签名等配置信息。

  • 问题:manifest里面要配置APP SECRET吗?


29楼回复于2019-03-27 03:43 未知归属地
附上我的报文 pushsend.do?nsp_ctx=%7b%22ver%22%3a%221%22%2c+%22appId%22%3a%2210923253325%22%7d

入参:nsp_svcpenpush.message.api.sendnsp_ts:1553159663955device_token_list:0862119033205985300003353400CN01payload:{"hps":{"msg" : {"type" : 1,"body" : {"key":"value"}}}access_token:CFyTZBG8ObuEtENwk4\/FFOsz724M+nRYZiBabphejaILzq3edZYE6x\/feGt9EXUKe\/8lJq9YJ0IS0+CVD+OUNQ==


header:Content-Type:application/x-www-form-urlencoded
28楼回复于2019-03-21 09:47 未知归属地
请问push接口pushsend.do的access_token是oauth返回的access_token的值吧,那device_token_list是啥啊,不知道填啥
27楼回复于2019-03-21 09:19 未知归属地
请问华为推送一收到通知的时候没有相关回调方法吗,只有点击通知才有回调吗
26楼回复于2019-03-08 08:19 未知归属地
共4页
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。