华为推送-华为PUSH SDK Android版接入方法

news/2024/11/29 3:58:39/

     本文参考了华为推送平台官网及其Demo:http://developer.huawei.com/cn/consumer/wiki/index.php?title=%E6%8E%A5%E5%85%A5%E8%AF%B4%E6%98%8E

    整理了整个接入过程以及常用用法


推送问题参考:
Android 端外推送 http://gold.xitu.io/post/57a19c012e958a0066715d0c 
华为推送那些坑 :    http://www.jianshu.com/p/47a6826f9815
Push SDK-客户端常见问题  http://club.huawei.com/thread-10205061-1-1-2851.html  
首先确保应用的Appid和AppSecret没有填写错误

检查通道是否连接:  adb shell netstat –ano | find "118"

集成过程

1.拷贝jar及res资源文件
androidManifest.xml文件中的所有activity, receiver, service, meta-data拷 贝至自己的AndroidManifest.xml文件中
2.混淆打包
   
开发者编译APK时请不要混淆本SDK,避免功能异常。 在配置文件中加入:
-keep class com.huawei.android.pushagent.**{*;}
-keep class com.huawei.android. pushselfshow.**{*;}
-keep class com.huawei.android. microkernel.**{*;}
-keep class com.baidu.mapapi.**{*;}

3.App 使用 SDK 进行开发
1.Token 申请
   
// 获取客户端AccessToken,获取之前请先确定该应用(包名)已经在开发者联盟上创建成功,并申请、审核通过Push权益
// 该测试应用已经注册过
PushManager.requestToken(PustDemoActivity.this);


2.设置标签信息,标签以 key-value 的 Map 提供
   
String tag1KeyStr = mEdTag1Key.getText().toString();
String tag1ValueStr = mEdTag1Value.getText().toString();
HashMap<String, String> map = new HashMap<String, String>();
if (!TextUtils.isEmpty(tag1KeyStr)
&& !TextUtils.isEmpty(tag1ValueStr)) {
map.put(tag1KeyStr, tag1ValueStr);
}
try {
PushManager.setTags(TagReportActivity.this, map);
} catch (PushException e) {
Log.e(TAG, e.toString());
}


3.获取当前设备当前应用已经设置的标签信息

   
Map<String, String> tags;
try {
tags = PushManager.getTags(TagReportActivity.this);
String tip = "";
if (null != tags && !tags.isEmpty()) {
for (Map.Entry<String, String> mapEntry : tags.entrySet()) {
String key = mapEntry.getKey();
String value = mapEntry.getValue();
tip += ("tagKey:"+ key + ", tagValue:" + value+"; ");
}
Log.w(TAG, tip);
Toast.makeText(TagReportActivity.this, tip, Toast.LENGTH_SHORT).show();
}
} catch (PushException e) {
Log.e(TAG, e.toString());
}


删除当前设备当前应用的标签信息
   
String delKeyStr = mEdDeleteKey.getText().toString();
List<String> list = new ArrayList<String>();
list.add(delKeyStr);
try {
PushManager.deleteTags(TagReportActivity.this, list);
} catch (PushException e) {
Log.e(TAG, e.toString());
}


回调接口说明

回调接口由业务继承com.huawei.android.pushagent.api.PushEventReceiver 现必要的回调方法。 各回调方法都是在新开启的线程中处理。

1.实现 Token 返回给应用: 本接口必须被实现


2. 实现消息透传给应用:  本接口必须被实现

3. 实现业务事件的回调   由业务 决定是否调用该函数。
   
public void onEvent(Context context, Event event, Bundle extras) {
if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
int notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0);
if (0 != notifyId) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notifyId);
}
String content = "收到通知附加消息: " + extras.getString(BOUND_KEY.pushMsgKey);
Log.w(PustDemoActivity.TAG, content);
showPushMessage(PustDemoActivity.RECEIVE_NOTIFY_CLICK_MSG, content);
} else if (Event.PLUGINRSP.equals(event)) {
final int TYPE_LBS = 1;
final int TYPE_TAG = 2;
int reportType = extras.getInt(BOUND_KEY.PLUGINREPORTTYPE, -1);
boolean isSuccess = extras.getBoolean(BOUND_KEY.PLUGINREPORTRESULT, false);
String message = "";
if (TYPE_LBS == reportType) {
message = "LBS report result :";
} else if(TYPE_TAG == reportType) {
message = "TAG report result :";
}
Log.w(PustDemoActivity.TAG, message + isSuccess);
showPushMessage(PustDemoActivity.RECEIVE_TAG_LBS_MSG, message + isSuccess);
}
super.onEvent(context, event, extras);
}


   
注意事项
1)建议不要在继承的PushEventReceiver中做过多的逻辑处理,如启线程、
启动hander等。
2 push业务逻辑需要将push相关的ReceiverService 在一个进程中,请勿
修改下面部分:
<receiver android:name=" com.huawei.android.pushagent.PushEventReceiver "
android:process=":pushservice">
<receiver android:name="com.huawei.android.pushagent.PushBootReceiver"
android:process=":pushservice" >
<service android:name=" com.huawei.android.pushagent.PushService "
android:process=":pushservice">
3)因为APP涉及到多进程,每个进程启动时,会默认初始化Application,所
以为了防止标签重复上报,建议不要在自定义的Application类里面调用标签上
报等操作。
4)在某些手机上申请token不成功,可能是被手机系统或其他安全性软件限
制,建议在手机中设置允许应用开机自启动再尝试






   
透传消息偶尔不能够拉起应用
在小米手机上,给这个应用设置:保持后台运行和允许开机启动。在部分品牌手机上也可以使用该方法解决。
   
官方文档中说明:透传消息需要设置开机自启动才能拉起应用
华为手机上:
Emui3.0上,Push广播有很大概率被限制,如: Mate7 3.0版本,荣耀6plusP7 3.0版本,4X 4A等。
Emui3.1上,Push广播基本不被限制,但个别型号机型存在问题,如:荣耀5x等。
Emui4.0及以上,Push广播有较高概率被限制,不被限制的机型如:荣耀畅玩4C,荣耀畅玩4XMate SP8 MAX等。
如广播被限制,需要将应用设为开机启动项。所以对于及时性或到达率要求非常高的应用,我们建议应用要考虑替代方案。
后续Push版本,华为将采用新的设计方案,解决被限制的问题,但发布计划待定。
非华为手机:
第三方手机(如:小米、OPPO、三星等),由于rom的限制,需要将应用设为开机启动项
文/topwqp(简书作者)
原文链接:http://www.jianshu.com/p/47a6826f9815
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。


http://www.ppmy.cn/news/853736.html

相关文章

华为手机长按图片无法下载

手机浏览器图片长按无法下载之华为手机的限制问题&#xff08;uniapp实现的H5推广海报图片点击下载问题&#xff09; 直接上代码 解决问题的核心代码 make_canvas(img01, img02, scale) {img02.tempFilePath this.qrcode;const query uni.createSelectorQuery().in(this);var…

python3网络爬虫--爬取华为应用市场app数据(附源码)

文章目录 一&#xff0e;准备工作1&#xff0e;工具 二&#xff0e;思路1&#xff0e;整体思路2&#xff0e;爬虫思路三&#xff0e;分析网页1&#xff0e;分析主页/应用页2&#xff0e;分析appid3&#xff0e;分析uri 四&#xff0e;撰写爬虫五&#xff0e;得到数据六&#xf…

STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060

STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060 Proteus仿真小实验&#xff1a; STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060 功能&#xff1a; 硬件组成&#xff1a;本系统由2个设备组成 设备1&#xff1a;STM32F103R6单片机 8位数…

服务器数据恢复-HP服务器双循环校验raid5数据恢复案例

服务器数据恢复环境&#xff1a; 一台HP ProLiant DL系列某型号服务器&#xff0c;hp smart array控制器&#xff0c;挂载了一台国产磁盘阵列&#xff0c;磁盘阵列中是一组由十几块SCSI硬盘组建的RAID5&#xff0c;RAID中的冗余采用双循环的校验方式。 服务器操作系统为LINUX&a…

OpenCV中的RGB与YUV转换

1 基本概念 YUV 颜色空间从模拟电视时代开始就被广泛应用于彩色图像的转换与处理。其基于一个 3x3 的矩阵&#xff0c;通过线性变换将 RGB 像素转换为一个亮度&#xff08;Luma&#xff09;分量 Y 以及两个色度&#xff08;Chroma&#xff09;分量 U 和 V。由于模拟电视存在着多…

智能网联汽车——智能化

一、无人驾驶的系统组成 算法端包括面向传感、感知和决策等关键步骤的算法&#xff0c;从传感器原始数据中提取有意义的信息以了解周遭的环境情况&#xff0c;并且根据环境变化做出决策&#xff1b;客户端包括机器人操作系统以及硬件平台&#xff0c;融合多种算法以满足实时性与…

MiniGPT4 在RTX-3090 Ubuntu服务器部署步骤详解

主要参考知乎帖子&#xff1a; MiniGPT-4 本地部署 RTX 3090 - 知乎 MiniGPT-4部署比麻烦&#xff0c;首先需要获取LLaMA权重&#xff0c;并结合Vicuna的bitwise XOR增量文件完成Vicuna模型权重生成&#xff0c;最后准备好预训练的MiniGPT-4进行模型部署。为了便于理解&#…

情报学研究路径

1. 基础材料收集 法律法规&#xff08;国家法律、规章制度、标准规范&#xff09;政策&#xff08;规划、指导意见、产业报告、领导讲话&#xff09;论文、专利 门外汉–>假装的专家&#xff08;2-3周&#xff09;—>专业人士(2-3月)—>资深人士&#xff08;2-3年&a…