MobPush开发过程常见问题

Android端Scheme 跳转首页,APP在前台跳转正常,后台失败


            
                
                
            
            
                
                
                
            
        

Android端配置了默认点击跳转界面,对所有通道都有效吗

不是,对MobPush、魅族、小米、华为、OPPO、VIVO通道有效;对FCM通道无效。

Android端如何获取回调参数

  • 进程存活的情况下,可在我们的回调监听中看到通知详情,可以根据回调参数进行处理。 详情请查看 API接口->推送监听接口。
  • 进程被杀情况下,回调监听不可用,但点击通知后拉起应用的启动页面,会触发启动Activity的onCreate或onNewIntent,通过getIntent拿到回传的Intent,可以拿到通知详情。
  • 注:PushSDK提供了解析方法来获取回调参数,但厂商通知主要是获取附加字段,不会把所有信息都解析出来。 跳转首页获取参数
JSONArray jsonArray =  MobPushUtils.parseMainPluginPushIntent(getIntent());
System.out.println("-------------JsonPushData打印查看:"+jsonArray);

返回说明

MobPush开发过程常见问题_第1张图片

2.2 scheme跳转获取参数,详情请查看 API接口->scheme跳转

JSONArray jsonArray = MobPushUtils.parseSchemePluginPushIntent(getIntent());
System.out.println("-------------JsonScheme打印查看:"+jsonArray);

MobPush开发过程常见问题_第2张图片

3.如不使用PushSDK提供的解析方法,可参考以下方法获取回调参数

private void dealPushResponse(Intent intent) {
        Bundle bundle = null;
        if (intent != null) {
            bundle = intent.getExtras();
            if (bundle == null) {
                Log.e("PushResponse","bundle的值为空"+bundle);
                return;
            }
            else {
                Set keySet = bundle.keySet();
                if (keySet == null || keySet.isEmpty()) {
                    return;
                }
                for (String key  : keySet) {
                    //通过key获取bundle中的key对应的值。就是附加数据了
                    Log.e("PushResponse","bundlekey===========================点击信息"+key);
                }
                Log.e("PushResponse","bundle===========================点击信息"+bundle.toString());
            }
        }
    }

Android端OPPO推送时按全部人群进行推送,为什么有的OPPO设备接收不到

因为OPPO推送对应全部人群这种全量推送是有个时间限制规则的,当全量推送时当天新注册的OPPO设备是不生效的,第二天才生效,被全量推送计算在目标设备组中,T+1规则。 而对应单一OPPO设备推送时,没有T+1规则限制,注册成功即立即生效。

Android端厂商推送打开通知都会有回调吗

不是都有回调,OPPO推送没有接收通知和打开通知的回调;FCM推送在应用处于后台时或者应用进程被杀掉时没有接收通知和打开通知的回调。

Android端应用在前台时,MobPush通道推送接收不到

应用在前台时,MobPush通道推送接收不到,请按照以下步骤检查:

  1. 检查手机网络是否正常
  2. 检查手机通知权限是否打开
  3. 是否在通知栏不重要的通知里
  4. 检查应用配置是否正确

Android端调用MobPush.setClickNotificationToLaunchMainActivity(),设置为false,点击通知不启动主页,为什么设置后,没有起作用**

此方法不是对所有通道都起作用,目前只对MobPush通道、魅族通道、小米通道起作用,对于华为通道、OPPO通道、FCM通道来说,由于各个厂商不同实现的原因,是否调用此方式都不影响这三个通道,默认都是启动主页。

Android端OPPO和VIVO设备通知权限开关问题

OPPO:

在未接入OPPO PUSH前,应用的通知栏权限是默认关闭状态; 接入OPPO PUSH后,ColorOS3.1至5.0版本的OPPO手机,用户激活了相关应用后,通知栏权限会默认打开。特别说明,若用户在使用旧版本应用(未集成OPPO PUSH),手动将应用的通知栏权限进行了关闭,则只有用户手动卸载旧版本应用,再安装新版本(集成OPPO PUSH)并激活,通知栏才会默认打开。采用覆盖安装的方式,通知栏权限不会默认开启; ColorOS5.1及以后的版本的手机,通知栏权限由系统统一关闭,需用户手动打开。

VIVO: 集成VPUSH,通知权限总开关基本默认打开,但下方类别开关默认关闭,需要用户手动打开。

Android端小米手机接收不到推送

如果小米手机接收不到推送,请先检查通知权限是否开启,同时小米设备从MIUI9开始通知栏使用不重要通知过滤,检查通知栏里不重要通知里是否有对应应用的通知。

Android端应用通知权限未打开状态,打开后推送接收不到

一开始应用通知权限未打开,等进行通知权限打开时,请杀掉进程,重新启动APP然后重新推送。

Android端接收回调和点击通知回调一定会被调用吗

不一定。分推送通道,不同厂商,有不同的实现方式,导致有的都回调,有的只会回调点击通知,有的都没有回调。

MobPush通道,接收回调和点击通知回调都会被调用;

华为厂商通道,厂商推送只提供了点击通知回调;

小米厂商通道,接收回调和点击通知回调都会被调用;

魅族厂商通道,接收回调和点击通知回调都会被调用;

OPPO厂商通道,两种回调都没有;

FCM通道,应用在前台时接收回调和点击通知回调都会被调用,应用在后台或者应用进程被杀掉未启动时两种回调都没有;

VIVO厂商通道,厂商推送只提供了点击通知回调。

Android端设置标签成功后,进行通过标签推送,接收不到推送

设置标签成功后,个别厂商同步拉取数据需要时间,导致接口设置标签成功,但是推送时设备没有同步,没有目标设备,故推送接收不到。建议设备标签成功后,等待几分钟之后再进行推送。

Android端一台设备能设置几个别名?不同的设备能设置相同的别名吗?

同一个APP,一台设备只能对应一个别名,新设置的会覆盖掉之前设置的别名。不同的设备不能同时设置相同的别名,最后设置的设备生效,其他设备的别名都将失效。

Android端如果应用在Android 9的设备上获取不到注册ID即(regId)

如果在其他版本的Android手机可以获取到注册ID,而在Android 9的设备上获取不到时,请确认下targetSdkVersion是大于27; 大于27时需在AndroidManifest.xml文件的中application标签中添加 android:usesCleartextTraffic="true"

Android端如果推送配置了FCM厂商,同时需要使用Firebase 的其他产品(ads等产品)时,编译时报错了,怎么办

  1. 单独配置ads和FCM时,他们所依赖的相同的库版本是否一致,如果不一致,需要进行版本统一;
  2. 进行版本统一:在APPmodule的build.gradle中添加

configurations.all { 
    exclude group: 'com.google.firebase', module: 'firebase-messaging' 
} 
//在app module 的build.gradle文件的dependencies里添加
compile 'com.google. firebase:firebase-messaging:17.1.0'

Android端配置vivo厂商推送的appId和AppKey时,需要把“-”去掉吗

不需要

Android端接入vivo厂商推送,发送推送成功,vivo设备未接收到推送

  1. 检查配置是否正确,包名是否和申请vivo推送服务时的包名一致;
  2. 手机通知权限是否打开;
  3. 检查消息是否已经送达但是折叠到了消息盒子里面?目前的策略是应用存活时展示,不存活时折叠;
  4. 检查设备联网是否有问题,如果连接的wifi设置了代理,一般需要重启手机,可以切换手机网络重试;

Android端如果配置了厂商推送的信息,但是运行打包发现AppKey不完整,确实第一个数字时,怎么办

这是gradle版本太高导致的,请在配置有问题的地方加入一个空格。

Android端配置了华为厂商推送,为什么有的华为设备无法接收离线消息

首先,排查配置的华为厂商参数是否正确; 其次,检查华为设备EMUI版本,低于5.0可能不支持,如果低于5.0,可以尝试升级设备里的‘华为移动服务’应用,升级‘华为移动服务’可能会支持华为厂商推送。

Android端MobPush的厂商推送和应用使用的其他第三方产品中的厂商推送冲突了,如何解决

首页,在build.gradle的MobPush{}配置中照常配置厂商信息; 然后,在build.gradle文件最后添加:

configurations.all {
    exclude group: 'com.mob.push.plugins', module: 'meizu'   //屏蔽MobPush提供的魅族厂商包
    exclude group: 'com.mob.push.plugins', module: 'xiaomi'  //屏蔽MobPush提供的小米厂商包
    exclude group: 'com.mob.push.plugins', module: 'vivo'    //屏蔽MobPush提供的vivo厂商包
    exclude group: 'com.mob.push.plugins', module: 'oppo'    //屏蔽MobPush提供的oppo厂商包
}

哪个厂商冲突,exclude哪个厂商就可以。

Android端如果应用使用的其他第三方产品中的魅族厂商推送和MobPush的魅族厂商推送冲突了,推送时其中一个不起作用

由于魅族厂商推送对接收监听回调只取AndroidManifest.xml中配置的第一个Reciever,所以谁在前面配置哪个产品就生效,后面配置多少个魅族厂商推送回调监听都无效。 解决方法: 自定义一个Receiver,继承自MzPushMessageReceiver,重新里面所有的方法,然后这个自定义的Receiver里调用MobPush的魅族回调和第三方产品的魅族回调;然后再AndroidManifest.xml文件中进行配置:


                
                        
                        
                        
                        
                        
                        
                
        

在自定义的Receiver里实现示例:

public class MyReceiver extends MzPushMessageReceiver {
         private OtherReceiver otherReceiver;
         private PushMeiZuRevicer mobpushMeiZuReceiver;
         public MyReceiver() {
                otherReceiver = new OtherReceiver();
                mobpushMeiZuReceiver = new PushMeiZuRevicer();
         }
         @Override
         public void onPushStatus(Context context, PushSwitchStatus pushSwitchStatus) {
                otherReceiver.onPushStatus(context, pushSwitchStatus);
                mobpushMeiZuReceiver.onPushStatus(context, pushSwitchStatus);
         }
         @Override
         public void onRegisterStatus(Context context, RegisterStatus registerStatus) {
                otherReceiver.onRegisterStatus(context, registerStatus);
                mobpushMeiZuReceiver.onRegisterStatus(context, registerStatus);
         }
         @Override
         public void onRegister(Context context, String s) {
                otherReceiver.onRegister(context, s);
                mobpushMeiZuReceiver.onRegister(context, s);
         }
         @Override
         public void onUnRegister(Context context, boolean b) {
                otherReceiver.onUnRegister(context, b);
                mobpushMeiZuReceiver.onUnRegister(context, b);
         }
         @Override
         public void onUnRegisterStatus(Context context, UnRegisterStatus unRegisterStatus) {
                otherReceiver.onUnRegisterStatus(context, unRegisterStatus);
                mobpushMeiZuReceiver.onUnRegisterStatus(context, unRegisterStatus);
         }
         @Override
         public void onSubTagsStatus(Context context, SubTagsStatus subTagsStatus) {
                otherReceiver.onSubTagsStatus(context, subTagsStatus);
                mobpushMeiZuReceiver.onSubTagsStatus(context, subTagsStatus);
         }
         @Override
         public void onSubAliasStatus(Context context, SubAliasStatus subAliasStatus) {
                otherReceiver.onSubAliasStatus(context, subAliasStatus);
                mobpushMeiZuReceiver.onSubAliasStatus(context, subAliasStatus);
         }
         @Override
         public void onNotificationClicked(Context context, MzPushMessage mzPushMessage) {
                otherReceiver.onNotificationClicked(context, mzPushMessage);
                mobpushMeiZuReceiver.onNotificationClicked(context, mzPushMessage);
         }
         @Override
         public void onNotificationArrived(Context context, MzPushMessage mzPushMessage) {
                otherReceiver.onNotificationArrived(context, mzPushMessage);
                mobpushMeiZuReceiver.onNotificationArrived(context, mzPushMessage);
         }

         @Override
         public void onNotifyMessageArrived(Context context, String s) {
                otherReceiver.onNotifyMessageArrived(context, s);
                mobpushMeiZuReceiver.onNotifyMessageArrived(context, s);
         }
    }

Android端配置了魅族厂商推送,客户端debug log输出注册成功,推送时接收不到推送或者离线推送接收不到,如何解决

  1. 确认下魅族厂商推送接入的是flyme推送,而不是ups推送。
  2. 确认下魅族开发者平台创建的应用是否配置了回执,如果没有配置,请配置上哦~,这个会影响推送结果,导致推送不成功。
  3. 如果上面都确认正常,仍存在问题请联系MobTech技术支持进行排查解决。

Android端同一个推送监听回调被调用了多次,为什么

如果应用有多个子进程,同时推送监听回调是在Application的onCreate方法中添加,那么存在几个子进程Application的onCreate会调用几次,监听回调也会被添加几次,所以会出现同一个推送监听回调被调用多次的情况。 如果想要只监听回调主进程,那么再添加时需判断下当前进程,为主进程时再添加推送监听回调。

Android端支持角标功能吗

MobPush是支持角标功能的。需调用MobPush.setShowBadge(true);打开角标功能,默认false,角标功能关闭。

对于厂商通道来说,小米系统本身就支持角标功能,不需要做任何处理;

魅族厂商不支持角标功能;

OPPO和VIVO厂商目前只对自家应用和微信QQ开放角标功能;

华为厂商对EMUI 8.0 及以上支持角标功能,如果需要对华为厂商打开角标功能,在服务端推送时在extrasMapList参数里面新增androidBadgeClass参数,其参数值是应用入口Activity 的全路径,这样EMUI8.0及以上走华为厂商推送的设备就可以显示角标了。

Android端MobPush支持多包名吗

支持。

Android端一台设备应用能设置多个标签吗?相同应用不同的设备能设置相同的标签吗

同一个APP,一台设备可以订阅多个标签,标签请尽量使用英文避免使用中文或特殊字符,导致厂商订阅标签失败而推送不成功;不同的设备可以同时设置同一标签。

Android端MobPush的RegistrationId会发生变化吗?如果发送变化是在什么时机下?RegistrationId是固定长度的吗**

注册id一般情况下不会发送变化,但也会出现发现变化的情况,有时卸载重装或者设备恢复出厂设备等情况下注册id会发生变化,而注册id的长度由于服务端内部优化后续会变化,不是固定长度的。

Android端使用StopPush是否会关闭所有厂商渠道推送

除了FCM厂商无法关闭(没有提供相关接口),TCP以及其他厂商都是正常关闭的。

Android端打开通知权限后,还是无法收到

MobPush只会在初始化的时候更新记录的通知权限状态。

如初始化的时候通知权限是关闭的,需再次重启APP,更新记录的通知权限状态。 如需要实时更新,可调用该方法:

//打开轮询开关
MobPush.startNotificationMonitor();
//关闭轮询开关
MobPush.stopNotificationMonitor();

Android端无法统计到厂商点击

请在点击通知打开的Activity的onCreate中加上该方法

MobPush.notificationClickAck(getIntent());

Android端华为厂商长文本样式无效

使用华为长文本样式,标题(title)为必填项。

Android端华为厂商解析intent为空

华为传递数据给应用仅在NC版本在在9.11及以上版本生效,NC版本查看方式(设置-应用-应用管理-推送服务),老旧设备存在无推送服务或版本较低问题,可尝试升级版本解决,如无法升级,华为未给出老旧设备兼容方案。详细说明可查看:自定义点击消息动作

iOS端推送的下发逻辑是什么样的,什么叫离线推送

推送下发时候目前如果应用进程处于在线状态,走我们MobTech通道,当应用进程结束,推送下发会走厂商通道,如果厂商下发失败,或者未配置厂商等配置,且应用进程是杀死状态,那么推送会进入到离线池中,在离线时间有效期内,当用户再次打开APP,推送会再次下发。接口推送时候默认离线时间为1天,离线时间可自定义最高为30天。

iOS端通知和自定义消息区别

通知:通知是推送的常规类型,在线走tcp通道,结束进程走厂商(APNS),可以通过系统层面讲通知展示到手机的通知栏。

自定义消息:自定义消息实际为透传消息,需要应用进程存活,服务端会将推送的boday等参数下发到客户端,由客户端回调接收,自行处理。

iOS端什么叫regsiterid,别名和标签分别是什么含义

regsiterid和别名:其实都是设备的唯一标识,推送本质是将消息推送到设备上,regsiteid是MobTech给您生成的,但是regsiteid并不是不会改变,所以需要每次获取最新的regsiterid。别名相当于您自定义的设备标识。其本质是和regsiterid绑定,所以也是唯一的,且同一台设备只能设置一个,如果有AB俩台设备同时设置一个别名,那么按照设置顺序最后设置的那台设备别名生效。regsiterid和别名均适用于单点登录。

标签:标签功能,可以理解为群体推送,可以用来区分用户群体,一个标签可以给多个设备设置,每个设备也可以具备多个标签,适用于用户群体区分。也使用于多点登录逻辑。

iOS端推送成功后,后台没有数据

推送成功后,后台统计不到数据,分为俩种情况(此处默认推送您客户端可以获取到regsiterid)。第一种情况:当推送下发的设备推送权限被关掉,那么不会下发,且没有推送数据统计;第二种:推送任务成功下发,但是推送任务进入到离线池中,此时当用户再次打开APP收到推送,才能被后台统计到

iOS端推送手机收不到怎么办

iOS:目前推送分为在线推送和厂商APNS推送,由于iOS区分开发环境和生产环境所以第一时间查看下推送是否环境不匹配,第二步一定要确认应用运行状态下能否收到推送。调试推送顺序,先调试debug环境下的在线推送,在调试debug环境下杀死APP的推送。如果在线可以收到,杀死APP收不到,可通过smartpush工具校验证书。

Android:安卓和iOS本质推送原理一样,但是安卓不区分测试和生产,所以一定要确定是否在线可以收到推送,如果在线收不到推送,请检查下AppKey相关是否配置有问题,客户端获取regsiterid是否能获取成功,推送通知是否打开,注意有一些通知会被归类到不重要通知栏。如果在线可以收到,请检查厂商相关配置,以及是否推送内容,推送频次被厂商限制。

注意:如果还不能解决收到请及时联系技术支持帮您解决。

iOS端推送有测试环境和正式环境吗

iOS:推送存在测试环境和生产环境,这个是由于iOS本身推送就区分推送开发证书和生产证书,只需要在代码中设置如下:

// 设置推送环境
#ifdef DEBUG
    [MobPush setAPNsForProduction:NO];
#else
    [MobPush setAPNsForProduction:YES];
#endi

注意:iOS测试生产环境需要achiver打ADHOC类型的ipa包去测试生产哦

Android:安卓不区分推送环境,测试时候建议通过精准推送去测试,防止影响线上的设备应用。

iOS端推送支持富媒体推送吗,支持语音播放以及图片展示吗

iOS: 支持富媒体推送,需要iOS系统10以上设备,按照demo设置推送扩展,即可实现图片的播放,音频播放由于应用进程被杀死,所以需要在扩展中只能播放本地音频哦。

Android: MobPush通道支持富媒体,厂商通道暂未开通,后续会开通厂商通道支持)

iOS端静默推送和正常推送的区别

正常推送用户会收到推送内容、声音,应用处于后台或者kill可以收到推送信息,但是不会走任何回调,点击推送内容进入APP后才会进入点击回调,要想处于后台走apns回调的话,需要勾选静默推送, 静默推送是一种特殊的远程推送,没有推送内容声音,不用点击推送内容也不用进入APP就会执行回调,用户毫无感觉。

iOS端MobPush支持自定义声音吗,支持自定义跳转吗?

iOS:支持自定义声音,只需要将声音文件拖入到项目中,对应推送传入声音文件名称即可,支持自定义跳转,可在对应vc中设置标识跳转,详情参考demo。

Android :支持自定义声音设置,方法同上,支持自定义跳转,可通过scheme跳转,详情参考demo。

iOS端 {"statue":4801,"error":"请求IP不匹配或者未设置"}

MobTech后台可以设置IP白名单,如果设置后只有固定ip可以进行推送,不设置的话默认所有IP均可以推送。

iOS端推送任务是否有限制

目前推送限制分为以下几种:

第一种:广播限制,推送广播类型每天限制100,每小时限制最高10次;推送regsiterid或者别名以及标签无限制,但单次下发最高下发1000个regsiterid,别名或者标签(备注别名长度自定义限制字节长度【1-100】)。

第二种: 接口频率限制,推送接口(发送+查询)的接口频率限制,默认500次/分钟;webapi全部接口的请求频率限制,默认800次/分钟。(可通过技术支持调高频率如果需求比较高)。

iOS端推送任务可根据地区进行地理范围推送

推送是可以通过设置推送地理条件进行区域推送的,目前精准到为市级。参考v3推送接口。

iOS端调用服务端推送报错怎么办 4001 4002 4005等

服务端推送报错,4001请求缺少必要参数。4002请求参数错误,4005数据校验失败(sign校验失败)这些通常都是参数设置或者加密时候的问题,可以通过postman进行尝试参数:

{"source":"webapi","appkey":"2ecbc7bc53712","pushTarget":{"target":1},"pushForward":{"scheme":"mlink://com.mob.mobpush.link","nextType":2,"schemeDataList":{"key":"Iskey","value":"IsValue"}},"pushNotify":{"plats":[2],"iosProduction":0,"content":"推送的内容","type":1}}

/*****
参考链接:[MobPush 的接口 以及一些示例 - 简书 (jianshu.com)](https://www.jianshu.com/p/0aa7308476de)
*****/

iOS端推送回调有的时候可以走,有的时候不能走,断点也没走是什么导致的

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMessage:) name:MobPushDidReceiveMessageNotification object:nil]; 需要检查这个方法是不是每次都调用到了,有可能是只调用了一次这个方法,并不是每次都调用了

iOS端后台显示推送消息是已取消状态

第一您这边rid或者别名传的不对,或者rid或者别名未入库,第二种手机设备关闭推送权限等等都会已取消,需要打开推送重新启动应用

iOS端如果推海外的话,需要加以下接口设置

国内推海外也是可以的,但是到达率应该会下降,因为海外连国内tcp服务不稳定,所以最好切换到海外服务器,需要调用这个接口[MobPush setRegionID:1],如果切换到海外服务器,推送的时候,后台推送需要选择海外版推送,如果调用api接口推送,需要用海外域名接口 http://abroad.api.push.mob.co... 接口去推送,传值可以参考国内接口去传值

iOS端企业账号的证书能否 使用MobPush

企业账号的证书也可以 使用MobPush

iOS端推送打开APP可以收到图片,但是关闭APP就收不到图片,是什么问题呢

需要检查下扩展是否添加

iOS端Push后台上传证书,一直报错问题

MobPush开发过程常见问题_第3张图片

有些用户一直说他的证书是对的,但是上传还是报错,可能他之前申请的证书是可以支持开发环境也可以支持生产环境测试的,这样的上传的不行的,需要去根据我们的文档里的制作证书的方法在重新制作一个只支持开发环境的证书在上传

iOS端API请求的时候一直提示5001:服务端未知错误问题

需要检查请求的参数,参数里可能有的传值有问题

iOS端关于Push推送的一些说明

新增用户数:当日新增与MobTech服务器保持连接的用户数

活跃用户数:当日内MobPush SDK与MobTech服务器建立过长链接的用户总数量

目标数:近30天内MobPush SDK与MobTech服务器建立过长链接的用户总数量,且在装、推送权限开启(其实也叫有效目标数)

下发数:由服务器实际下发到客户端的消息总数,包含TCP下发数(不包含离线池的数据)+MobTech请求厂商,并厂商返回成功的数量

到达数:客户端SDK接收到消息的数量

点击数:Push点击数+补量点击数

  • Push点击数:点击通知栏消息的消息数量(透传不统计点击)
  • 补量点击数:通过补量任务带来的点击数

下发率:下发数/目标数

到达率:到达数/下发数

点击率:点击数/到达数

触达率:到达数/目标数

关于率的统计都精确到小数点2位

iOS端在flutter上生产环境推送APNS收不到

通过flutter build iOS来打包然后发布到蒲公英上,推送的时候选择iOS正式环境推送,前台能收到,但后台不能收到的问题,需要改用achiver打ADHOC类型的ipa包 然后发布到蒲公英后,在重新安装测试,这样前台后台才能收到。

你可能感兴趣的:(开发者iosandroid)