本文参考了华为推送平台官网及其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());
}
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相关的Receiver和Service 在一个进程中,请勿
修改下面部分:
<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版本,荣耀6plus,P7 3.0版本,4X, 4A等。
Emui3.1上,Push广播基本不被限制,但个别型号机型存在问题,如:荣耀5x等。
Emui4.0及以上,Push广播有较高概率被限制,不被限制的机型如:荣耀畅玩4C,荣耀畅玩4X,Mate S,P8 MAX等。
如广播被限制,需要将应用设为开机启动项。所以对于及时性或到达率要求非常高的应用,我们建议应用要考虑替代方案。
后续Push版本,华为将采用新的设计方案,解决被限制的问题,但发布计划待定。
非华为手机:
第三方手机(如:小米、OPPO、三星等),由于rom的限制,需要将应用设为开机启动项
文/topwqp(简书作者)
原文链接:http://www.jianshu.com/p/47a6826f9815
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。