Android 阿里推送正常推送以及辅助通道走过的坑,Android经典面试
3.6 VIVO依赖
如需配置VIVO通道还需要添加VIVO推送SDK依赖:
dependencies {
......
compile 'com.aliyun.ams:third_vivopush:2.9.0.1'
}
在AndroidManifest文件中添加如下配置:
<meta-data
android:name="com.vivo.push.api_key"
android:value="请填写vivo平台上注册应用的appKey" />
<meta-data
android:name="com.vivo.push.app_id"
android:value="请填写vivo平台上注册应用的appID" />
4. Proguard配置
- 如果集成推送SDK的工程开启代码混淆,在Proguard配置的基础上,需要添加以下辅助通道的Proguard配置。
# 小米通道
-keep **class** com.xiaomi.** {*;}
-dontwarn com.xiaomi.**
# 华为通道
-keep **class** com.huawei.** {*;}
-dontwarn com.huawei.**
# GCM/FCM通道
-keep **class** com.google.firebase.**{*;}
-dontwarn com.google.firebase.**
# OPPO通道
-keep **public** **class** * **extends** android.app.Service
# VIVO通道
-keep **class** com.vivo.** {*;}
-dontwarn com.vivo.**
# 魅族通道
-keep **class** com.meizu.cloud.** {*;}
-dontwarn com.meizu.cloud.**
5. 在应用中初始化辅助通道
将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败
// 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
MiPushRegister.**register**(applicationContext, "小米AppID", "小米AppKey");
// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。
HuaWeiRegister.**register**(application);
//GCM/FCM辅助通道注册
GcmRegister.**register**(**this**, sendId, applicationId); //sendId/applicationId为步骤获得的参数
// OPPO通道注册
OppoRegister.**register**(applicationContext, appKey, appSecret); // appKey/appSecret在OPPO开发者平台获取
// 魅族通道注册
MeizuRegister.**register**(applicationContext, "appId", "appkey"); // appId/appkey在魅族开发者平台获取
// VIVO通道注册
VivoRegister.**register**(applicationContext);
本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
6. 在日志中查看初始化情况
华为通道初始化成功,可以看到以下日志:(如不成功,检查是否在华为控制台配置SHA256指纹证书,目前华为需要配置)
小米通道初始化成功,可以看到以下日志:
GCM/FCM通道初始化成功,可以看到以下日志:
- `05-19 19:18:44.530 19153-19177/com.xxx D/MPS:GcmRegister: token from register:eWIXLYCNP0Q:APA91bFUAgxj6XYf5okyoCBnRPw1UwITndzXrvPDgbdI2N44PYm17hFEBiNXNQJrJ8bOG_xjw3c3UPDAhzNMTLNjlAKcjUanKyLA6E3k4wEmgZuhgUT0
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
2UMmMvH2LVA1L2Z4-l-cT_Ug`
OPPO通道是否注册成功, 可以通过过滤MPS:oppo
关键字查看, 注册成功会打印onRegister regid=****
相关日志, 否则检查参数是否正确填入;
VIVO通道是否注册成功, 可以通过过滤MPS:vivo
关键字查看, 注册成功会打印getRegId regId:****
相关日志, 否则检查参数是否正确填入;
魅族通道初始化成功,可以看到以下日志:
收到小米通道下行的消息:(需要将sdk日志等级设置到DEBUG)
12-09 22:24:34.065 19566-25042/com.xxx D/MPS:MiPushReceiver: onReceiveMessage,msg=[{"f":262,"b":"{\"content\"\ ... ... ,"i":"f__-rnje3_OH74gE|VG0g3kwMnGADAGrXZku1FFW5"}]
收到GCM/FCM通道下发的消息:
05-19 19:20:04.900 19153-20391/com.alibaba.push2 D/MPS:GcmRegister: onReceiveMessage payload msg:[......]
若小米通道注册失败(未看到小米注册成功日志),请查看系统日志(logcat设置NoFilters),以PushService|BroadcastQueue
为正则式进行过滤,示例如下图:
MiPushBroadcastReceiver未配置:
MIPUSH_RECEIVE权限未配置:
注1:如果控制台配置了小米/华为
的信息,app需要加对应的jar包依赖,不然会有crash的风险。
客户端接入完毕,服务端推送时如果设备无法收到推送,可先查看 移动推送Android SDK:Android辅助通道和弹窗排查步骤
7. 辅助弹窗
当前部分国产品牌设备管控严格,接入推送功能的App进程在后台被清理后,收不到推送通知;接入辅助弹窗后,可以借助对应品牌的系统通道,保证App后台被清理后,仍能收到推送通知;
当前辅助弹窗已接入小米、华为、OPPO、VIVO、魅族(小米辅助弹窗:
v2.3.0及以上支持
;华为辅助弹窗:v3.0.8及以上支持
;OPPO辅助弹窗:v3.1.4及以上支持
);当前华为辅助弹窗仅支持Emotion UI(华为定制ROM)4.1级以上版本的设备;
7.1 客户端
该功能的使用需要接入推送辅助通道,确保使用
最新
的辅助通道扩展包,具体参考上文;辅助弹窗送达的通知展示效果,和普通通知相同;
服务端指定辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类
AndroidPopupActivity
(MiPushSystemNotificationActivity
已废弃,小米、华为、OPPO等厂商通道弹窗统一继承AndroidPopupActivity
),否则无法获取到通知的相关信息,并且会影响通知到达率的统计;AndroidPopupActivity
中提供抽象方法onSysNoticeOpened()
,实现该方法后可获取到辅助弹窗通知的标题
、内容
和额外参数
,在通知点击时触发,原本的通知回调onNotification()
和onNotificationOpened()
不适用于辅助弹窗;指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:
android:exported=true
接入如下所示:
**import** com.alibaba.sdk.android.push.AndroidPopupActivity;
**public** **class** PopupPushActivity **extends** AndroidPopupActivity {
**static** **final** String TAG = "PopupPushActivity";
@Override
**protected** **void** onCreate(Bundle savedInstanceState) {
**super**.onCreate(savedInstanceState);
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
@Override
**protected** **void** onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
}
}
7.2 服务端
OpenAPI 2.0的推送高级接口提供了
AndroidPopupActivity
、AndroidPopupTitle
和AndroidPopupBody
三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline
参数也需要设置为true);辅助弹窗仅对后台进程被清理的小米/华为/VIVO/OPPO/魅族 设备生效,对非接入厂商通道设备和在线的设备不生效;
当辅助弹窗生效时,推送接口的
Title
、Body
、AndroidActivity
以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;PushRequest pushRequest = **new** PushRequest();
// 其余设置省略
// 通知
pushRequest.setPushType("NOTICE");
// 标题
pushRequest.setTitle(dateFormat.format(**new** Date()));
// 内容
pushRequest.setBody("PushRequest body");
// 额外参数
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
// 设置辅助弹窗打开Activity
pushRequest.setAndroidPopupActivity("*****");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("*****");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("*****");
7.3 场景解析
以下几种普通推送结合辅助弹窗推送的场景,帮助您快速理解辅助弹窗功能的配置。
客户端配置
客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends AndroidPopupActivity;
- 普通通知回调配置:
**public** **class** MyMessageReceiver **extends** MessageReceiver {
/**
* 推送通知的回调方法
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
**public** **void** onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap);
}
}
- MainActivity定义:
**package** com.alibaba.push.testdemo;
**public** **class** MainActivity **extends** Activity {
@Override
**protected** **void** onCreate(Bundle savedInstanceState) {
Log.d(TAG, "Main");
}
}
- SecondActivity定义:
**package** com.alibaba.push.testdemo;
**import** com.alibaba.sdk.android.push.AndroidPopupActivity;
**public** **class** SecondActivity **extends** AndroidPopupActivity {
/**
* 辅助弹窗指定打开Activity回调
* @param title 标题
* @param content 内容
* @param extraMap 额外参数
*/
@Override
**protected** **void** onSysNoticeOpened(String title, String content, Map<String, String> extraMap) {
Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);
}
}
场景1:普通推送打开App + 辅助弹窗
服务端配置如下:
PushRequest pushRequest = **new** PushRequest();
// 其余设置省略
// 通知
pushRequest.setPushType("NOTICE");
// 标题
pushRequest.setTitle("hello");
// 内容
pushRequest.setBody("PushRequest body");
// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
pushRequest.setAndroidOpenType("APPLICATION");
// 设置辅助弹窗打开Activity
pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("hello2");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("PushRequest body2");
// 设定android类型设备通知的扩展属性
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
推送结果:
非小米、华为等厂商通道设备和在线设备
收到普通推送通道弹出的通知,点击后打开App,进入首页
MainActivity
,如果设备在前台,保持当前界面不变;onNotification()回调输出
Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;清理进程后的小米、华为等厂商通道设备
辅助弹窗通道弹出通知,点击后跳转到
SecondActivity
;onSysNoticeOpened()回调输出
Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}
;
场景2:普通推送打开Activity + 辅助弹窗
服务端配置如下:
PushRequest pushRequest = **new** PushRequest();
// 其余设置省略
// 通知
pushRequest.setPushType("NOTICE");
// 标题
pushRequest.setTitle("hello");
// 内容
pushRequest.setBody("PushRequest body");
// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
pushRequest.setAndroidOpenType("ACTIVITY");
// 指定普通推送要打开的Activity
pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");
// 设置辅助弹窗打开Activity
pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("hello2");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("PushRequest body2");
// 设定android类型设备通知的扩展属性
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
推送结果:
非小米、华为等厂商通道设备和在线设备
收到普通推送通道弹出的通知,点击后跳转到
SecondActivity
;onNotification()回调输出
Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;清理进程后的小米、华为等厂商通道设备
辅助弹窗通道弹出通知,点击后跳转到
SecondActivity
;onSysNoticeOpened()回调输出
Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}
;
其它坑说明:
阿里文档地址:https://help.aliyun.com/knowledge_detail/57105.html
https://emas.console.aliyun.com/?spm=5176.13194971.0.0.4ff3cb3coyVKHq#/product/3619196/push/25233908/2
服务端需要配置通知chinalId
1.华为地址:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/android-intelligent-classification-0000001050040120-V5?spm=a2c4g.11186623.2.26.779f708fmtlOup 通知chinalId =HIGH
2.VIVO https://dev.vivo.com.cn/documentCenter/doc/359?spm=a2c4g.11186623.2.25.779f708fmtlOup VIVO通知chinalId =1
3.小米 通知chinalId =pre54
4.OPPO 通道id=1
PopupPushActivity(接收辅助通道的act) 在xml里面一定要设置,这个包名路径要传给后台,后台也得设置一下
1.json文件,这个我们直接在阿里云的应用配置里面下载就可以了(有个下载配置文件)
2.动态形式来获取需要配置的参数
//阿里推送动态注册AppKey,AppSecret
if (BuildConfig.APPLICATION_ID.equals(“xxxxxx”)) {
mPushService.register(applicationContext, “xxxxxx”, “xxxxxxx”, mPushRegisterCallback);
}
else if (BuildConfig.APPLICATION_ID.equals(“com.xxxxxx.xxx.debug”)) {
mPushService.register(applicationContext, “xxxx”, “xxxx”, mPushRegisterCallback);
}
//动态获取华为和vivo的值
ApplicationInfo appInfo = null;
// String value=null;
try {
appInfo = mContext.getPackageManager().getApplicationInfo(
mContext.getPackageName(), PackageManager.GET_META_DATA);
// appInfo.metaData.putString(“com.huawei.hms.client.appid”, “appid=xxxxx”);
// value = appInfo.metaData.getString(“com.huawei.hms.client.appid”);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
//辅助通道动态注册
if (BuildConfig.APPLICATION_ID.equals(“com.xxxxx”)) {
//小米
MiPushRegister.register(applicationContext, “xx”, “xx”);
//魅族
MeizuRegister.register(applicationContext, “xx”, “xx”);
//oppo
OppoRegister.register(applicationContext, “xx”,
“xx”);
//vivo
appInfo.metaData.putString(“com.vivo.push.api_key”, “xx”);
appInfo.metaData.putString(“com.vivo.push.app_id”, “xx”);
//华为
appInfo.metaData.putString(“com.huawei.hms.client.appid”, “appid=xx”);
} else if (BuildConfig.APPLICATION_ID.equals(“com.xxxx.xxxx”)) {
//小米
MiPushRegister.register(applicationContext, “xxxx”, “xxxxxx”);
//魅族
MeizuRegister.register(applicationContext, “xxxxx”, “xxxx”);
//oppo
OppoRegister.register(applicationContext, “xxxx”,
“xxxxx”);
//vivo
appInfo.metaData.putString(“com.vivo.push.api_key”, “xxxx”);
appInfo.metaData.putString(“com.vivo.push.app_id”, “xxxxx”);
//华为
appInfo.metaData.putString(“com.huawei.hms.client.appid”, “appid=xxxxx”);
}
3.各种机型的小坑
说明:一定要在各大平台注册,将应用加入
1.0PPO
oppo阿里AppKey 对应的是key,但是MasterSecret 对应的是oppo平台的appserversecret ,不是appsecret,切记,在APPlication里面填写的是appsecret,OPPO有时候会接收不到消息,请打开设置,在进入应用管理,找到当前的应用,强制停止,这样就离线了,在辅助通道推送就有通知了
还必须配置下面的内容
2.Xiaomi
Android 8+适配
自Android 8.0(API Level 26)起,Android推出了NotificationChannel机制,旨在对通知进行分类管理。如果用户App的targetSdkVersion大于等于26,且并未设置NotificaitonChannel,那么创建的通知是不会弹出显示。
请参见Android 8.0以上设备接收不到推送通知进行适配。 必须配置NotificaitonChannel,否则收不到通知,可以在小米推送平台申请,有个通知类别,在里面申请,有很多选择
re84 | 即时通讯(IM)消息(如聊天、加好友等) | 申请 |
pre61 | 个人状态变化(如会员升级、登录下线等) | 申请 |
pre72 | 个人资源变化(如钱包、积分等) | 申请 |
pre213 | 个人关注的内容更新提醒(如关注的教学任务更新、主动设置的书籍更新提醒等用户主动订阅的提醒) | 申请 |
pre102 | 个人日程相关提醒(如登机、酒店入住提醒等) | 申请 |
pre233 | 个人交易提醒(如银行、股票的交易提醒等) | 申请 |
pre54 | 个人家庭IoT类提醒(如摄像机监控区域有变化的提醒、扫地机器人清扫完成的通知等) | 撤销 |
pre96 | 个人订单状态变化(如购物发货、退款等) |
3.华为基本没遇到什么坑(appid配置在bulid里面,动态配置也行
<meta-data
android:name=“com.huawei.hms.client.appid”
android:value="${HUAWEI_ID}"/>
manifestPlaceholders = [icon: “@mipmap/ic_launcher”, VIVO_KEY: “1124d88d99cf58e738b18f9d1848c690”, VIVO_ID: “104115367”
, HUAWEI_ID: “appid=100902017”]
)
Android 阿里推送正常推送以及辅助通道走过的坑,Android经典面试相关推荐
- Android 阿里推送正常推送以及辅助通道走过的坑,字节跳动+阿里+华为+腾讯等大厂Android面试题
dependencies { ...... compile 'com.aliyun.ams:third_vivopush:2.9.0.1' } 在AndroidManifest文件中添加如下配置: & ...
- Android 阿里推送正常推送以及辅助通道走过的坑
android开发中 app的保活和推送到达都是个绕不过去的坎 他俩相辅相成 目前阿里推送的辅助推送通道可以进一步的帮助实现这个推送的到达率 https://help.aliyun.com/d ...
- android阿里推送实现移动推送辅助通道配置
android开发中 app的保活和推送到达都是个绕不过去的坎 他俩相辅相成 目前阿里推送的辅助推送通道可以进一步的帮助实现这个推送的到达率 https://help.aliyun.com/d ...
- Android 阿里云移动推送厂商辅助通道集成详解
厂商通道配置 1.添加额外依赖项 implementation 'com.aliyun.ams:alicloud-android-push:3.1.9.1'implementation 'com.al ...
- 【转】android系统的APP消息推送机制
原文:https://www.jianshu.com/p/f898a2c02b05 参考文章: http://blog.csdn.net/carson_ho/article/details/52862 ...
- 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送
转自:http://zhangtielei.com/posts/blog-android-push.html 说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有找到 ...
- 阿里云APP消息推送中间件使用
1.所需jar包 建议使用较新版本,项目一开始使用低版本时,有出现推送失败的情况 <dependency><groupId>com.aliyun</groupId> ...
- 阿里云的第三方推送通道 与融云的推送通道冲突问题
冲突提示一般如下,4.4 和5.0以上报错不太一样,主要是阿里云的第三方通道集成了小米的推送和华为的推送,融云也是小米的推送,结果就冲突了 More than one file was found w ...
- Android socket 编程 实现消息推送(二)
上篇文章Android socket 编程 实现消息推送(一)讲到socket编程的消息推送原理,现在我们来看看基于Android客户机socket编程实现消息推送的过程. 根据消息推送的原理图,我们 ...
最新文章
- WPF中读取txt文件并让其在RichTextBox中显示
- python实现etl_为什么选择R而不是Python做ETL
- html 图片自由缩放_PS中的“缩放”
- iOS 开发中的各种证书
- .Net中使用OracleDataAdapter
- Android 高效开发调试神器 JRebel
- Gpower软件真不错
- LeetCode 答案(Easy)(601-700)
- 冈萨雷斯数字图像处理开篇
- 数据分析之利用EXCEL做数据分析
- 自建公众号服务器开发教程,01-微信公众号开发入门篇
- 1217: 青蛙(二)
- swift 苹果登录
- pthread-win32库编译及使用方法注意事项
- jenkins发送邮件添加附件
- 利用tushare进行股票数据分析
- 翻译Prism4碰到生单词
- 日本研制超音速小飞机或达音速2倍
- 10年大数据平台经验,总结出这份数据建设干货(内含多张架构图)
- jsp+ssm计算机毕业设计动物保护网站【附源码】
热门文章
- 独行月球现在成本多少?分红周期长吗?沈腾主演?
- 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...
- Q104807: HOWTO: Logging an MSI Installation
- 【excel函数使用】
- 头脑灵活的属猴人性格及运势
- [设计模式]原型设计模式
- 关于刷新网页F5,Ctrl+F5amp;amp;Shift+F5
- 极客头条贡献者招募:欢迎懂分享的人
- CSDN付费专栏写作协议
- 学习随记1:VMware Fusion上对Windows Xp系统的磁盘分区操作