不是,对MobPush、魅族、小米、华为、OPPO、VIVO通道有效;对FCM通道无效。
JSONArray jsonArray = MobPushUtils.parseMainPluginPushIntent(getIntent());
System.out.println("-------------JsonPushData打印查看:"+jsonArray);
返回说明
2.2 scheme跳转获取参数,详情请查看 API接口->scheme跳转
JSONArray jsonArray = MobPushUtils.parseSchemePluginPushIntent(getIntent());
System.out.println("-------------JsonScheme打印查看:"+jsonArray);
返回说明
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());
}
}
}
因为OPPO推送对应全部人群这种全量推送是有个时间限制规则的,当全量推送时当天新注册的OPPO设备是不生效的,第二天才生效,被全量推送计算在目标设备组中,T+1规则。 而对应单一OPPO设备推送时,没有T+1规则限制,注册成功即立即生效。
不是都有回调,OPPO推送没有接收通知和打开通知的回调;FCM推送在应用处于后台时或者应用进程被杀掉时没有接收通知和打开通知的回调。
应用在前台时,MobPush通道推送接收不到,请按照以下步骤检查:
此方法不是对所有通道都起作用,目前只对MobPush通道、魅族通道、小米通道起作用,对于华为通道、OPPO通道、FCM通道来说,由于各个厂商不同实现的原因,是否调用此方式都不影响这三个通道,默认都是启动主页。
OPPO:
在未接入OPPO PUSH前,应用的通知栏权限是默认关闭状态; 接入OPPO PUSH后,ColorOS3.1至5.0版本的OPPO手机,用户激活了相关应用后,通知栏权限会默认打开。特别说明,若用户在使用旧版本应用(未集成OPPO PUSH),手动将应用的通知栏权限进行了关闭,则只有用户手动卸载旧版本应用,再安装新版本(集成OPPO PUSH)并激活,通知栏才会默认打开。采用覆盖安装的方式,通知栏权限不会默认开启; ColorOS5.1及以后的版本的手机,通知栏权限由系统统一关闭,需用户手动打开。
VIVO: 集成VPUSH,通知权限总开关基本默认打开,但下方类别开关默认关闭,需要用户手动打开。
如果小米手机接收不到推送,请先检查通知权限是否开启,同时小米设备从MIUI9开始通知栏使用不重要通知过滤,检查通知栏里不重要通知里是否有对应应用的通知。
一开始应用通知权限未打开,等进行通知权限打开时,请杀掉进程,重新启动APP然后重新推送。
Android端接收回调和点击通知回调一定会被调用吗
不一定。分推送通道,不同厂商,有不同的实现方式,导致有的都回调,有的只会回调点击通知,有的都没有回调。
MobPush通道,接收回调和点击通知回调都会被调用;
华为厂商通道,厂商推送只提供了点击通知回调;
小米厂商通道,接收回调和点击通知回调都会被调用;
魅族厂商通道,接收回调和点击通知回调都会被调用;
OPPO厂商通道,两种回调都没有;
FCM通道,应用在前台时接收回调和点击通知回调都会被调用,应用在后台或者应用进程被杀掉未启动时两种回调都没有;
VIVO厂商通道,厂商推送只提供了点击通知回调。
设置标签成功后,个别厂商同步拉取数据需要时间,导致接口设置标签成功,但是推送时设备没有同步,没有目标设备,故推送接收不到。建议设备标签成功后,等待几分钟之后再进行推送。
同一个APP,一台设备只能对应一个别名,新设置的会覆盖掉之前设置的别名。不同的设备不能同时设置相同的别名,最后设置的设备生效,其他设备的别名都将失效。
如果在其他版本的Android手机可以获取到注册ID,而在Android 9的设备上获取不到时,请确认下targetSdkVersion是大于27; 大于27时需在AndroidManifest.xml文件的中application标签中添加 android:usesCleartextTraffic=“true”
configurations.all {
exclude group: 'com.google.firebase', module: 'firebase-messaging'
}
//在app module 的build.gradle文件的dependencies里添加
compile 'com.google. firebase:firebase-messaging:17.1.0'
不需要
这是gradle版本太高导致的,请在配置有问题的地方加入一个空格。
首先,排查配置的华为厂商参数是否正确; 其次,检查华为设备EMUI版本,低于5.0可能不支持,如果低于5.0,可以尝试升级设备里的‘华为移动服务’应用,升级‘华为移动服务’可能会支持华为厂商推送。
首页,在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哪个厂商就可以。
由于魅族厂商推送对接收监听回调只取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);
}
}
如果应用有多个子进程,同时推送监听回调是在Application的onCreate方法中添加,那么存在几个子进程Application的onCreate会调用几次,监听回调也会被添加几次,所以会出现同一个推送监听回调被调用多次的情况。 如果想要只监听回调主进程,那么再添加时需判断下当前进程,为主进程时再添加推送监听回调。
MobPush是支持角标功能的。需调用MobPush.setShowBadge(true);打开角标功能,默认false,角标功能关闭。
对于厂商通道来说,小米系统本身就支持角标功能,不需要做任何处理;
魅族厂商不支持角标功能;
OPPO和VIVO厂商目前只对自家应用和微信QQ开放角标功能;
华为厂商对EMUI 8.0 及以上支持角标功能,如果需要对华为厂商打开角标功能,在服务端推送时在extrasMapList参数里面新增androidBadgeClass参数,其参数值是应用入口Activity 的全路径,这样EMUI8.0及以上走华为厂商推送的设备就可以显示角标了。
支持。
同一个APP,一台设备可以订阅多个标签,标签请尽量使用英文避免使用中文或特殊字符,导致厂商订阅标签失败而推送不成功;不同的设备可以同时设置同一标签。
注册id一般情况下不会发送变化,但也会出现发现变化的情况,有时卸载重装或者设备恢复出厂设备等情况下注册id会发生变化,而注册id的长度由于服务端内部优化后续会变化,不是固定长度的。
除了FCM厂商无法关闭(没有提供相关接口),TCP以及其他厂商都是正常关闭的。
MobPush只会在初始化的时候更新记录的通知权限状态。
如初始化的时候通知权限是关闭的,需再次重启APP,更新记录的通知权限状态。 如需要实时更新,可调用该方法:
//打开轮询开关
MobPush.startNotificationMonitor();
//关闭轮询开关
MobPush.stopNotificationMonitor();
请在点击通知打开的Activity的onCreate中加上该方法
MobPush.notificationClickAck(getIntent());
使用华为长文本样式,标题(title)为必填项。
华为传递数据给应用仅在NC版本在在9.11及以上版本生效,NC版本查看方式(设置-应用-应用管理-推送服务),老旧设备存在无推送服务或版本较低问题,可尝试升级版本解决,如无法升级,华为未给出老旧设备兼容方案。详细说明可查看:自定义点击消息动作
推送下发时候目前如果应用进程处于在线状态,走我们MobTech通道,当应用进程结束,推送下发会走厂商通道,如果厂商下发失败,或者未配置厂商等配置,且应用进程是杀死状态,那么推送会进入到离线池中,在离线时间有效期内,当用户再次打开APP,推送会再次下发。接口推送时候默认离线时间为1天,离线时间可自定义最高为30天。
通知:通知是推送的常规类型,在线走tcp通道,结束进程走厂商(APNS),可以通过系统层面讲通知展示到手机的通知栏。
自定义消息:自定义消息实际为透传消息,需要应用进程存活,服务端会将推送的boday等参数下发到客户端,由客户端回调接收,自行处理。
regsiterid和别名:其实都是设备的唯一标识,推送本质是将消息推送到设备上,regsiteid是MobTech给您生成的,但是regsiteid并不是不会改变,所以需要每次获取最新的regsiterid。别名相当于您自定义的设备标识。其本质是和regsiterid绑定,所以也是唯一的,且同一台设备只能设置一个,如果有AB俩台设备同时设置一个别名,那么按照设置顺序最后设置的那台设备别名生效。regsiterid和别名均适用于单点登录。
标签:标签功能,可以理解为群体推送,可以用来区分用户群体,一个标签可以给多个设备设置,每个设备也可以具备多个标签,适用于用户群体区分。也使用于多点登录逻辑。
推送成功后,后台统计不到数据,分为俩种情况(此处默认推送您客户端可以获取到regsiterid)。第一种情况:当推送下发的设备推送权限被关掉,那么不会下发,且没有推送数据统计;第二种:推送任务成功下发,但是推送任务进入到离线池中,此时当用户再次打开APP收到推送,才能被后台统计到
iOS:目前推送分为在线推送和厂商APNS推送,由于iOS区分开发环境和生产环境所以第一时间查看下推送是否环境不匹配,第二步一定要确认应用运行状态下能否收到推送。调试推送顺序,先调试debug环境下的在线推送,在调试debug环境下杀死APP的推送。如果在线可以收到,杀死APP收不到,可通过smartpush工具校验证书。
Android:安卓和iOS本质推送原理一样,但是安卓不区分测试和生产,所以一定要确定是否在线可以收到推送,如果在线收不到推送,请检查下AppKey相关是否配置有问题,客户端获取regsiterid是否能获取成功,推送通知是否打开,注意有一些通知会被归类到不重要通知栏。如果在线可以收到,请检查厂商相关配置,以及是否推送内容,推送频次被厂商限制。
注意:如果还不能解决收到请及时联系技术支持帮您解决。
iOS:推送存在测试环境和生产环境,这个是由于iOS本身推送就区分推送开发证书和生产证书,只需要在代码中设置如下:
// 设置推送环境
#ifdef DEBUG
[MobPush setAPNsForProduction:NO];
#else
[MobPush setAPNsForProduction:YES];
#endi
注意:iOS测试生产环境需要achiver打ADHOC类型的ipa包去测试生产哦
Android:安卓不区分推送环境,测试时候建议通过精准推送去测试,防止影响线上的设备应用。
iOS: 支持富媒体推送,需要iOS系统10以上设备,按照demo设置推送扩展,即可实现图片的播放,音频播放由于应用进程被杀死,所以需要在扩展中只能播放本地音频哦。
Android: MobPush通道支持富媒体,厂商通道暂未开通,后续会开通厂商通道支持)
正常推送用户会收到推送内容、声音,应用处于后台或者kill可以收到推送信息,但是不会走任何回调,点击推送内容进入APP后才会进入点击回调,要想处于后台走apns回调的话,需要勾选静默推送, 静默推送是一种特殊的远程推送,没有推送内容声音,不用点击推送内容也不用进入APP就会执行回调,用户毫无感觉。
iOS:支持自定义声音,只需要将声音文件拖入到项目中,对应推送传入声音文件名称即可,支持自定义跳转,可在对应vc中设置标识跳转,详情参考demo。
Android :支持自定义声音设置,方法同上,支持自定义跳转,可通过scheme跳转,详情参考demo。
MobTech后台可以设置IP白名单,如果设置后只有固定ip可以进行推送,不设置的话默认所有IP均可以推送。
目前推送限制分为以下几种:
第一种:广播限制,推送广播类型每天限制100,每小时限制最高10次;推送regsiterid或者别名以及标签无限制,但单次下发最高下发1000个regsiterid,别名或者标签(备注别名长度自定义限制字节长度【1-100】)。
第二种: 接口频率限制,推送接口(发送+查询)的接口频率限制,默认500次/分钟;webapi全部接口的请求频率限制,默认800次/分钟。(可通过技术支持调高频率如果需求比较高)。
iOS端推送任务可根据地区进行地理范围推送
推送是可以通过设置推送地理条件进行区域推送的,目前精准到为市级。参考v3推送接口。
服务端推送报错,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)
*****/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMessage:) name:MobPushDidReceiveMessageNotification object:nil];
需要检查这个方法是不是每次都调用到了,有可能是只调用了一次这个方法,并不是每次都调用了
第一您这边rid或者别名传的不对,或者rid或者别名未入库,第二种手机设备关闭推送权限等等都会已取消,需要打开推送重新启动应用
国内推海外也是可以的,但是到达率应该会下降,因为海外连国内tcp服务不稳定,所以最好切换到海外服务器,需要调用这个接口[MobPush setRegionID:1],如果切换到海外服务器,推送的时候,后台推送需要选择海外版推送,如果调用api接口推送,需要用海外域名接口 http://abroad.api.push.mob.com/v3/push/createPush 接口去推送,传值可以参考国内接口去传值
企业账号的证书也可以 使用MobPush
需要检查下扩展是否添加
有些用户一直说他的证书是对的,但是上传还是报错,可能他之前申请的证书是可以支持开发环境也可以支持生产环境测试的,这样的上传的不行的,需要去根据我们的文档里的制作证书的方法在重新制作一个只支持开发环境的证书在上传
需要检查请求的参数,参数里可能有的传值有问题
新增用户数:当日新增与MobTech服务器保持连接的用户数
活跃用户数:当日内MobPush SDK与MobTech服务器建立过长链接的用户总数量
目标数:近30天内MobPush SDK与MobTech服务器建立过长链接的用户总数量,且在装、推送权限开启(其实也叫有效目标数)
下发数:由服务器实际下发到客户端的消息总数,包含TCP下发数(不包含离线池的数据)+MobTech请求厂商,并厂商返回成功的数量
到达数:客户端SDK接收到消息的数量
点击数:Push点击数+补量点击数
下发率:下发数/目标数
到达率:到达数/下发数
点击率:点击数/到达数
触达率:到达数/目标数
关于率的统计都精确到小数点2位
通过flutter build iOS来打包然后发布到蒲公英上,推送的时候选择iOS正式环境推送,前台能收到,但后台不能收到的问题,需要改用achiver打ADHOC类型的ipa包 然后发布到蒲公英后,在重新安装测试,这样前台后台才能收到。