Android常见问题

Android常见问题

1.基础名词解释

  • Clientid:个推业务层中对外用户的唯一标识,用于标识客户端身份,简称CID。CID需要由客户端获取并自行记录,安卓获取方式如下,初始化个推SDK后在自定义IntentService 服务中获取,iOS同理。

    public void onReceiveClientId(Context context, String clientid) {
          Log.e(TAG, "onReceiveClientId -> " + "clientid = " + clientid);}
    
  • 任务ID:个推业务层中任务维度的唯一标识;若服务端推送,请求成功后会返回result,result中【taskid】或【contentid】的值就是任务ID;若平台上推送,在【推送记录】中点击详情,页面上显示的【task ID】的值。

  • 通知模板消息:指定通知标题和内容后,由个推SDK自动处理在系统通知栏中展示通知栏消息,同时响铃或震动提醒用户(响应和震动受手机系统的设置状态影响)。

  • 透传模板消息:即自定义消息,消息体格式客户可以自己定义,如纯文本、json串等。透传消息个推只传递数据,不做任何处理,客户端接收到透传消息后需要自己去做后续动作处理,如通知栏展示、弹框等。

2.安卓消息推送流程说明

  • 默认情况下:
    • 当CID在线(即app在前台打开运行)时,消息将通过个推通道下发到客户端;若具体到服务端Rest-V2代码中,即push_message中的消息体内容。
    • 当CID离线(即app在后台、锁屏)时,有开启对应厂商离线功能的,消息将通过个推侧请求对应厂商侧的服务端,具体到服务端Rest-V2代码中,即push_channel中的android中的消息体内容传递给厂商,实际的消息是经由厂商服务器下发至客户端;对于没有开启对应厂商功能的,消息将存在个推的离线库中,等待CID在线,再通过个推通道下发到客户端
  • 注意:安卓的消息推送,请求厂商通道成功的消息就不会再通过个推通道推送至客户端,反之亦是如此,即消息只会推送一次

  • 服务端有 strategy 字段,可以控制消息走个推通道还是走厂商通道,设置示例参考厂商下发策略说明

    • 1: 表示该消息在用户在线时推送个推通道,用户离线时推送厂商通道;
      2: 表示该消息只通过厂商通道策略下发,不考虑用户是否在线;
      3: 表示该消息只通过个推通道下发,不考虑用户是否在线;
      4: 表示该消息优先从厂商通道下发,若消息内容在厂商通道代发失败后会从个推通道下发。
    • 注意:2和4的前提是CID必须要正常绑定着安卓厂商token,iOS则是devicetoken,否则设置该策略会报错

3.安卓在线收不到通知

  • 手机通知权限是否正常打开,部分安卓8以上的手机通知权限中需要打开【Default】渠道的通知权限。
  • 若服务端推送模板用的【Transmission】透传模板或平台上推送用的透传消息,需要客户端开发者在客户端【onReceiveMessageData】回调中接收该透传消息自己创建通知。
  • 确认推送的CID与测试手机关系是否匹配;测试方式:在个推后台【消息推送】-【配置管理】-【故障排查】-【 检测CID的状态及信息】中输入cid,然后多次关闭和打开app,检测每次app状态变化时,cid状态是否也会变化;若发现不对应,重新获取下客户端cid,以新的cid去进行推送测试。

4.安卓离线收不到通知

步骤一:确认CID是否绑定厂商token

1.在个推后台【消息推送】-【配置管理】-【特殊机型】中是否正常填写保存厂商参数。

2.在个推后台【消息推送】-【应用配置】-【故障排查】-【 检测CID的状态及信息:】中输入CID查询,看是否会返回厂商token。

若返回了具体厂商token,请按以下中各厂商部分说明排查,若还未解决,提供CID和任务ID给个推技术支持

  • 华为

    • 标题长度限制40个字,内容长度限制1024个字。
    • emui10的华为手机,检查手机通知权限设置,将【营销通知】的权限也打开,不要默认静默,静默的话是需要下拉通知栏才能看到。
    • 手机通知栏消息是否有存满,清除已存的通知栏消息看下新的消息是否能展示。
    • 服务端Intent中指定的Activity,在客户端manifest里面是否配置exported=true属性,若未配置会影响华为机型的消息展示。
  • VIVO

    • 标题长度限制20个字,内容长度限制50个字。
    • 检查通知权限,vivo机型默认关闭
    • vivo【运营消息】,一个设备一天只能收到5条离线消息
    • 1个自然日内相同文案的运营消息给同个设备发,vivo会在客户端做去重处理,导致消息不展示
    • vivo要求:通知文案中不能带 “包含测试、test字符”、“纯数字”、“纯表情”、“符号”或者“符号+数
      字”、“表情+数字”、“表情+符号”
  • 小米

    • 标题长度限制50个字,内容长度限制128个字。
    • 检查手机通知权限设置,小米有不重要通知功能,部分消息可能会存在通知栏不重要通知里
    • 服务端推送时,推送代码要加上ttl的离线时间设置,不能为空。
  • OPPO

    • 标题长度限制32个字,内容长度限制200个字。
    • 检查手机通知权限是否打开,oppo是默认关闭的,将通知权限下的【Default】通道权限也打开。
    • 手机系统时间是否正常
  • 魅族

    • 标题长度限制32个字,内容长度限制100个字。
    • 检查消息是否存入了魅族手机右上角【魅族消息盒子】中。
    • 清除缓存:手机【系统设置】-【应用管理】-【所有应用】点击右上角【显示系统服务应用】找到【推送服务】和【您自己的 App】,如下图,分别进行“清除数据”,然后重启手机。

步骤二:查询CID未返回token

  • 手机连接电脑,手机需开启开发者调试模式,打开APP,在androidstudio编译器logcat中过滤"Assist_",若成功打印token信息则表示厂商集成正常。

  • 若未返回任何带有厂商标识的日志,说明厂商推送服务还未置于您App应用内,请重新检查客户端厂商集成相关步骤。

  • 若返回了厂商标识日志,则注意查看返回的厂商Code码,如下示例:

    厂商通道 返回码 含义 解决建议 官方地址
    华为 1001 请确认手机中安装有应用 “华为移动服务” 或 “HMS-Core” 前往华为应用商店下载安装应用 “HMS-Core” 华为地址
    6003 应用 APK 未打签名或与华为开放平台登记签名信息不一致 为 APK 文件打上签名或检查签名信息是否一致
    907135000 appId 不合法 华为平台上推送状态未打开
    907135702 签名文件的 SHA256 值与在华为推送平台上配置的不一致 前往华为推送平台检查填写的签名文件 SHA256 值是否配置一致
    小米 22006 应用程序 ID 不合法 前往小米推送平台检查应用的包名、appId、appKey 是否匹配 小米地址
    22007 应用程序 Key 不合法 前往小米推送平台检查应用的包名、appId、appKey 是否匹配
    22022 应用程序 package name 不合法 前往小米推送平台检查应用的包名、appId、appKey 是否匹配
    魅族 110000 appId 不合法 前往魅族推送平台检查应用的包名、appId、appKey 是否匹配,确认 Flyme 推送平台 的应用信息 魅族地址
    110001 appKey 不合法 前往魅族推送平台检查应用的包名、appId、appKey 是否匹配
    OPPO 14 无效的 AppKey 参数 客户端需要的是OPPO 的 AppKey和APPSECRET OP地址
    15 缺少 AppKey 参数 补充 AppKey 参数
    VIVO 10003 App 包名与配置不匹配 前往 vivo 推送平台检查应用的包名、appId、appKey 是否匹配 VV地址
    10004 appkey 不匹配 前往 vivo 推送平台检查应用的包名、appId、appKey 是否匹配
    10005 appid传入错误 前往 vivo 推送平台检查应用的包名、appId、appKey 是否匹配

步骤三:服务端推送代码问题

  • 老版推送代码需在透传模板中设置上notify的安卓厂商消息体。
  • 新版推送代码需在push_channel中设置上ups的安卓厂商消息体。

5.获取不到ClientID

  • 检查手机连接的网络是否正常,尝试切换网络。
  • 检查手机相关LOG日志开关是否打开,打包是否有屏蔽日志输出。
  • 检查pushservice进程有没有起来,即初始化个推是否正常。
  • 根据客户端集成文档依次检查集成配置等步骤,并开启debug模式进行排查。

6.别名、标签推送收不到问题

  • 推送别名、标签前,需要将客户端CID与自定义的别名、标签进行绑定动作,绑定成功后,推送别名和标签才能将消息推送给别名、标签下对应绑定的CID。
  • 客户端绑定别名、标签,请在CID回调后,去调用绑定别名、标签接口,否则会出现绑定失败的问题。
  • 在【消息推送】-【配置管理】-【别名管理】/【应用标签】可输入别名、CID/标签名,进行查询CID是否与别名和标签绑定成功;若因页面数据延迟问题查无结果,可提供别名、CID/标签名给到个推技术支持进行确认。
  • 别名相关限制
    • 别名名称:长度40字节,支持中、英文(区分大小写)、数字以及下划线
    • 一个CID一天绑定别名和解绑别名次数各有50次机会
    • 一个别名下最多绑定10个CID,若超出10个,则绑定后者,剔除第一个已绑定的CID,以此类推;一个CID只能绑定一个别名,若超出则以最后一次绑定的别名为准。
  • 标签相关限制
    • 标签名称:长度32字节,中文、英文字母(大小写)、数字、除英文逗号以外的其他特殊符号
    • 一个CID一天默认绑定只有一次标签绑定次数。
    • 一个CID默认可支持100个标签,标签的绑定是全量覆盖的,后面一次的覆盖前面一次的 。

7.安卓离线如何传递自定义参数值

  • push_channel(或老版本-notify)消息体中,click_type设置intent类型,在intent里可以设置增加自定义参数值,如下示例中的S.parm1=value1;S.parm2=value2;S.表示String型,parm1表示参数名,value1表示参数值。

    intent":"intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;component=你的包名/你要打开的Activity全路径;S.parm1=value1;S.parm2=value2;end
    
  • 当用户点击离线通知后,客户端需在对应的Activity页面中通过getIntent去获取对应参数值,如下示例

    Intent intent = getIntent(); 
    String parm = getIntent().getStringExtra("服务端自定义的key");
    
  • 如果intent里Activity的launchMode(启动模式)是singleTask或者singletop,那么用户先打开App,未点击通知时,自定义的参数值依然能在对应Activity的onCreate或onNewIntent里能拿到。

8.安卓点击消息如何实现页面跳转

  • 在线收到个推消息
    • 若推送的是透传模板消息,则可以在透传内容中设置自定义参数值,开发者自行在透传回调中监听相关自定义参数值处理后续内部页面跳转问题。
    • 若推送的是通知模板消息:1、click_type设置intent类型,intent里按要求设置App内部的Activity路径,点击通知后跳转到设置的Activity页面。2、click_type设置payload类型,payload里设置自定义参数值,点击通知后,payload里的内容传进客户端透传回调,开发者在该回调中自行处理跳转。
  • 离线收到厂商消息
    • push_channel(或老版本-notify)消息体中,click_type设置intent类型,intent里按要求设置App内部的Activity路径,点击通知后跳转到设置的Activity页面。

9.安卓离线点击通知跳转失败

  • 检查设置的Activity路径是否正确,在应用内是否可以正常跳转。
  • intent设置的参数是否有特殊字符,比如Scheme链接有#符号,如有,可以urlencode编码处理,参数在经过Android系统接收后,会自动进行解码处理。
  • 检查指定跳转的Activity是否有设置data属性,如有,可新建一个过滤器单独配置action属性(只影响oppo手机)。
  • 检查设备是否有禁止后台弹出界面,路径>>设置-应用管理-测试应用-权限管理-后台弹出界面,(一般是小米、oppo、vivo设备)。
  • 检查指定的Activity是否使用了两个参数的onCreate方法,导致没有获取到自定义参数值,影响根据参数的跳转逻辑。

10.平台【预览】返回clientid离线

  • 推送时的【预览】功能目前只支持测试个推在线通道,也就是CID在线的状态下,若是想测试离线,不需要输入clientid,直接点击【确定】进行推送即可。

11.平台测试返回没有对该cid的操作权限

  • 每个APP应用都有各自的一套Appid、Appkey、 AppSecret、 MasterSecret参数,个推的CID与应用的Appid有对应绑定关系,以此来区分定位到各个手机上的app的。
  • 请检查CID对应的个推Appid与您测试的个推Appid是否是同一个。

12.消息推送频次限制

  • 推送条数限制:没有限制!

  • 单推(toSingle)频次限制:没有限制!

  • 批量推(toList)频次限制:200万次/天。

  • 群推(toAPP)频次限制:100次/天,每分钟不能超过5次,10分钟内不能推重复消息体 。

    VIP套餐相关开放情况请咨询:lieg@getui.com

13.CID什么情况下会变化

  • 用户超过三个月未登录,CID会置为无效CID,若再次登录会重新生成一个CID;
  • 如果应用没有获取sd卡权限,卸载重装/清除缓存,CID会变(CID信息会写入sd卡)。
  • 个推Appid参数、应用的包名、苹果Bundleid的修改。

  • 苹果手机则是进行了越狱或系统还原。

14.安卓厂商消息分类

小米渠道

  • 小米推送的消息通道分为“普通消息”(默认)和“通知消息”两类,默认下发普通消息。普通消息单日可推送数量有限制,通知消息不限。通知消息申请请参见小米推送消息限制说明FAQ4

  • 个推侧设置小米通道id示例如下:

    {
    "android": {
      "ups": {
        "notification": {
          // ...其他push_channel参数略
        },
        "options": {
          "XM": {
            "channel": "Default" }}}}}
    
    

OPPO渠道

  • OPush平台上所有通道分为“公信”(默认)、“私信”两类,默认下发公信消息。公信消息单日可推送数量有限制,私信消息不限(仅限单个用户)。私信消息申请请参见OPPOPUSH通道升级公测邀请

  • 个推侧设置oppo通道id示例如下:

    {
    "android": {
      "ups": {
        "notification": {
          // ...其他push_channel参数略
        },
        "options": {
          "OP": {
            "channel": "Default" }}}}}
    

VIVO渠道

  • vivo消息分类功能将推送消息类型分为运营消息和系统消息,默认下发运营消息。运营消息单用户单应用单日接收条数上限为5条,系统消息不限。系统消息功能不用申请,可以直接使用,如特殊情况需额外提升系统消息量级,请参见vivo推送消息分类功能说明

  • 个推侧设置vivo消息分类示例如下:

    {
    "android": {
      "ups": {
        "notification": {
          // ...其他push_channel参数略
        },
        "options": {
          "VV": {
            "classification": 0 }}}}}
    

    注意:上述具体个推侧服务端设置的字段解释可参考RestAPI V2中多厂商参数部分

15.其他常见问题

个推平台特殊机型参数保存失败

  • 需要去对应失败的厂商平台上查询推送服务状态是否是开启的,参数是否填写正确。
  • 刷新、清空浏览器缓存或者更换浏览器进行保存尝试。

平台【故障排查】-【推送测试】返回error,code:80502

  • 【推送测试】功能目前是停止维护的状态,后期会去除该模块,因此目前建议您不要使用该功能,若需要推送测试,可直接在【创建推送】中直接建立推送进行测试。

离线通知消息没有声音、震动

  • 检查手机通知权限中的响铃和震动状态是否打开,包括通知权限的各个通知渠道里的相关权限,例如华为的【营销通知】默认是没有声音、震动的。
  • iOS离线的通知除检查手机系统通知设置样式外,还需检查服务端push_channel里aps中的sound参数是否设置值为default;若设置成com.gexin.iOS.silence,则苹果离线不会有声音。

自定义铃声如何实现

  • 个推在线消息

    • 客户端SDK需要集成2.14+及3.0+版本。
    • 铃声文件需存放在客户端app/res/raw路径下。
    • 推送时需指定铃声文件名,无需包含后缀,如: "ring_name":"lingsheng",具体可参考服务端文档
  • 离线厂商消息

    小米:

    • 铃声文件放在客户端app/raw目录下。

    • 离线自定义铃声只在channel通道中起作用,因此需要在小米平台上创建channel通道,设置自定义铃声前端路径如:android.resource://com.tuisongdemo/raw/test(路径不需要带音频后缀名)如图

    • 服务端需在push_channel中对应设置小米channel通道。
    "options": {
                 "XM": {
                 "channel": "10002"}}
    

    华为:

    • 华为EMUI版本及推送服务版本要求 10.0.0 以上

    • 铃声文件放在客户端app/raw目录下,支持mp3、wav、mpeg等

    • 离线自定义铃声只在channel通道中起作用,服务端需在push_channel中对应设置华为相关设置。

    "options": {
            "HW": {
              "/message/android/notification/importance": "NORMAL",
              "/message/android/notification/default_sound": false,
              "/message/android/notification/channel_id": "RingRing",
              "/message/android/notification/sound": "/raw/video_call_ring"}}
    

安卓离线点击第一条通知跳转正常,第二条失败

  • 服务端intent参数中设置为launchFlags=0x04000000。
  • 尝试更改intent中设定的activity的启动模式为singleTask。

华为离线推送消息自动归到【营销通知】

  • 这是华为侧的消息控制:EMUI10系统上云端推送通知根据消息重要性,分成三个级别:一般、重要、非常重要。对应不同消息级别,会有不同的消息呈现样式。具体说明请参考华为官方消息分类文档

  • 个推侧服务端Rest-V2代码设置示例

    "options": {
          "HW": {
            "/message/android/notification/importance": "HIGH",
          }
        }
    

    注意:该设置项不能直接决定消息分类,华为侧还是会通过消息体判断去划分,最终是以华为侧的划分为准。请尽量不要推送测试性消息,同样消息体也不要频繁重复推送

安卓厂商离线机型版本支持情况

  • 华为机型要求:需华为rom且华为rom版本大于等于emui4.1, 华为移动服务(可在应用列表或华为应用市
    场中查看)版本大于等于2.5.2
  • 小米机型要求:需小米rom且小米服务框架(包名:com.xiaomi.xmsf)版本号⼤于等于105
  • 魅族机型要求:需魅族rom版本大于等于5.x
  • oppo机型要求:需oppo colorOS rom且版本号大于等于3.1
  • vivo机型要求:请参考vivo官网说明

安卓厂商离线角标支持情况

  • oppo/魅族,部分手机系统上能设置角标圆点,没有数字角标的功能。

  • 小米系统自带离线通知数字角标展示功能,默认+1处理,打开清零。

  • vivo高版本系统自带离线通知数字角标展示功能,默认+1处理,打开清零,低版本没有角标功能。

  • 华为角标需服务端api进行字段设置,客户端需要手动设置角标数为0

    • add方式支持版本: EMUI版本8.0.0且推送服务应用版本 8.0.0及以上

    • 服务端Rest-v2设置示例

       "options": {
            "HW": {
              "/message/android/notification/badge/class": "应用入口Activity路径名称",
              "/message/android/notification/badge/add_num": 1,
            }
          }
    

安卓厂商推送是否需要发布应用市场

  • 目前华为、小米、魅族、oppo(beta环境)不需要事先发布应用市场上,vivo需要。

找不到OPPO的mastersecret参数

  • OPPO平台的mastersecret参数需要在应用通过推送审核后,使用主账号在oppo推送平台-配置管理-应用配置 页面查看。

Android 5.0个推自定义权限冲突?

  • 目前有许多客户在Android 5.0系统上接入个推SDK时,会发现如果其他集成个推SDK的应用已经安装在手机,此应用就不能再安装上去,会出现权限冲突。报错信息如下:

    STALL_FAILED_DUPLICATE_PERMISSION perm=getui.permission.GetuiService pkg=你的应用包名]
    

    对此个推对权限配置做了如下修改

    <permission
      android:name="getui.permission.GetuiService.你的应用包名"
      android:protectionLevel="normal" >
    

第三方系统软件限制导致收不到推送

  • 小米
    • 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启。
    • 通知栏设置:应用默认都是显示通知栏通知,如果关闭,则收到通知也不会提示
    • 网络助手:可以手动禁止已安装的第三方程序访问 2G/3G 和 WIFI 的网络和设置以后新安装程序是否允许访问 2G/3G 和 WIFI 的网络
    • MIUI 7 神隐模式: 允许应用进行自定义配置模式,应用在后台保持联网可用,否则应用进入后台时,应用无法正常接收消息。 【设置】>【电量和性能】>【神隐模式】
  • 华为
    • 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用
    • 后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行
    • 通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒
  • 魅族
    • 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启
    • 通知栏推送:关闭应用通知则收到消息不会有任何展示
    • 省电管理: 安全中心里设置省电模式,在【待机耗电管理】中允许应用待机时,保持允许,否则手机休眠或者应用闲置一段时间,无法正常接收消息。
  • VIVO
    • 内存一键清理:需要将应用加入【白名单】列表,否则系统自带的“一键加速”,会杀掉进程
    • 自启动管理:需要将应用加入 “i 管家”中的【自启动管理】列表,否则重启手机后进程不会自启。但强制手动杀进程,即使加了这个列表中,后续进程也无法自启动。
  • OPPO
    • 冻结应用管理:需要将应用加入纯净后台,否则锁屏状态下无法及时收到消息
    • 自启动管理:将应用加入【自启动管理】列表的同时,还需要到设置-应用程序-正在运行里锁定应用进程,否则杀进程或者开机后进程不会开启,只能手动开启应用
  • 三星
    • 内存一键优化:需要将应用加入【白名单】列表,否则系统内存优化后,会杀掉应用进程

个推SDK对电量和流量消耗如何?

  • SDK特意针对手机优化,空载耗电每日15-50毫安,空载流量0.8-1.2M/月

个推SDK对手机和操作系统有哪些要求?

  • Android:支持Android 2.2及以上版本
  • iOS:支持iOS8.0及以上版本

免费用户和VIP用户有哪些区别?

  • VIP用户在免费用户的基础上推送频次更高,推送速度更快,此外还可以享受更多进阶功能和更高级的数据统计服务。详情参见个推消息推送产品价格页
开发者中心 SDK 下载

文档中心搜索

技术
咨询

微信扫一扫

随时联系技术支持