最近公司产品想要提高用户体验,便让我研究一下华为推送的问题。其实推送最重要的就是进程保活的这个问题,这是一个比较棘手的问题。现在比较普遍的做法是集成多个厂商的推送,例如小米,华为,魅族推送等,再加一个另外的第三方推送(个推,极光,信鸽)。今天主要讲的是华为推动接入的一些步骤和问题,而接入的版本是hms 2.5.2.300。
https://hwid1.vmall.com/CAS/portal/userRegister/regbyemail.html?service=https%3A%2F%2Flogin.vmall.com%2Foauth2%2Fv2%2Fauthorize%3Fresponse_type%3Dtoken%26client_id%3D6099200%26state%3D93235025%26redirect_uri%3Dhttp%253A%252F%252Fdeveloper.huawei.com%252Fdevunion%252FopenPlatform%252Fhtml%252FhandleLogin.html%253Fp%253Dhttp%25253A%25252F%25252Fdeveloper.huawei.com%25252Fdevunion%25252Fui%25252Fdevplan.html&loginChannel=89000000&reqClientType=89
这里面是需要进行实名制登记注册,身份证照片还有手持身份证照片什么的,审核大概一天左右就OK了
创建应用:
然后申请push权益服务
android studio集成的方法是Gradle+maven
1、打开项目的build.gradle–>allprojects–>repositories配置maven仓库
2、添加项目依赖,在子项目的build.gradle–>dependencies
其中2.5.2.300是版本号,以后有更新的版本出来,就直接在这里改就好了
然后sync一下,这样子就已经集成完毕了,是不是很方便呢ヽ( ̄▽ ̄)ノ
(3)添加一些特定的activity(跳转所需的透明页面)和provider(读取升级文件)
(5)添加混淆
proguard-rules.pro文件添加
-keep class com.huawei.hms.**{*;}
(6)配置签名
因为hms平台上的应用要签名的SHA256指纹,在android studio上就可以获取,只需要在Terminal上输入keytool -list -v -keystore 签名地址 ,再输入密钥的密码就OK了
通过以上的步骤,准备工作就已经差不多了,剩下就是连接华为移动服务了
在Activity的onCreate方法里面添加,同时实现ConnectionCallbacks, OnConnectionFailedListener两个接口
//创建华为移动服务client实例用以使用华为push服务
//需要指定api为HuaweiId.PUSH_API
//连接回调以及连接失败监听
client = new HuaweiApiClient.Builder(this)
.addApi(HuaweiPush.PUSH_API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
//建议在oncreate的时候连接华为移动服务
//业务可以根据自己业务的形态来确定client的连接和断开的时机,但是确保connect和disconnect必须成对出现
client.connect();
@Override
public void onConnected() {
//华为移动服务client连接成功,在这边处理业务自己的事件
Log.i(TAG, "HuaweiApiClient 连接成功");
}
@Override
public void onConnectionSuspended(int arg0) {
//HuaweiApiClient断开连接的时候,业务可以处理自己的事件
Log.i(TAG, "HuaweiApiClient 连接断开");
client.connect();
}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
Log.i(TAG, "HuaweiApiClient连接失败,错误码:" + arg0.getErrorCode());
}
@Override
protected void onDestroy() {
super.onDestroy();
//建议在onDestroy的时候停止连接华为移动服务
//业务可以根据自己业务的形态来确定client的连接和断开的时机,但是确保connect和disconnect必须成对出现
client.disconnect();
}
当连接成功之后,就要去获取token。华为官方提供了两种方法获取token,分别是同步和异步获取,但是我们通常习惯性都是用异步的方法获取
/**
* 使用异步接口来获取pushtoken
* 结果通过广播的方式发送给应用,不通过标准接口的pendingResul返回
* CP可以自行处理获取到token
* 同步获取token和异步获取token的方法CP只要根据自身需要选取一种方式即可
*/
private void getTokenAsyn() {
if(!client.isConnected()) {
Log.i(TAG, "获取token失败,原因:HuaweiApiClient未连接");
return;
}
PendingResult tokenResult = HuaweiPush.HuaweiPushApi.getToken(client);
tokenResult.setResultCallback(new ResultCallback() {
@Override
public void onResult(TokenResult result) {
//这边的结果只表明接口调用成功,是否能收到响应结果只在广播中接收,广播这块后面会有讲到
}
});
}
/**
* 应用需要创建一个子类继承com.huawei.hms.support.api.push.PushReceiver,
* 实现onToken,onPushState ,onPushMsg,onEvent,这几个抽象方法,用来接收token返回,push连接状态,透传消息和通知栏点击事件处理。
* onToken 调用getToken方法后,获取服务端返回的token结果,返回token以及belongId
* onPushState 调用getPushState方法后,获取push连接状态的查询结果
* onPushMsg 推送消息下来时会自动回调onPushMsg方法实现应用透传消息处理。本接口必须被实现。 在开发者网站上发送push消息分为通知和透传消息
* 通知为直接在通知栏收到通知,通过点击可以打开网页,应用 或者富媒体,不会收到onPushMsg消息
* 透传消息不会展示在通知栏,应用会收到onPushMsg
* onEvent 该方法会在设置标签、点击打开通知栏消息、点击通知栏上的按钮之后被调用。由业务决定是否调用该函数。
*/
public class HuaweiPushRevicer extends PushReceiver {
public static final String TAG = "HuaweiPushRevicer";
@Override
public void onToken(Context context, String token, Bundle extras) {
String belongId = extras.getString("belongId");
Log.i(TAG, "belongId为:" + belongId);
Log.i(TAG, "Token为:" + token);
System.out.println("Token为:" + token);
}
@Override
public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) {
try {
//CP可以自己解析消息内容,然后做相应的处理
String content = new String(msg, "UTF-8");
Log.i(TAG, "收到PUSH透传消息,消息内容为:" + content);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public void onEvent(Context context, Event event, Bundle extras) {
Intent intent = new Intent();
intent.setAction(ACTION_UPDATEUI);
intent.putExtra("type", 3);
intent.putExtra("pushMsg", "收到通知栏消息点击事件");
context.sendBroadcast(intent);
if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
int notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0);
Log.i(TAG, "收到通知栏消息点击事件,notifyId:" + notifyId);
Toast.makeText(context,"通知栏点击事件",Toast.LENGTH_LONG).show();
if (0 != notifyId) {
NotificationManager manager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notifyId);
}
}
String message = extras.getString(BOUND_KEY.pushMsgKey);
super.onEvent(context, event, extras);
}
@Override
public void onPushState(Context context, boolean pushState) {
Log.i("TAG", "Push连接状态为:" + pushState);
}
}
1、有的时候经常错误码是6003,这个是比较普遍的错误,通常都是没有配置sha256签名,或者说安装的app没有安装对应的签名
2、不能获取token,要把应用和华为移动服务的自启动权限打开;而在非华为手机上,例如我测试的这台,有可能是有广播限制,就是因为有酷狗app,所以广播被限制了,卸载了就好。
3、如果还有问题的话,可以自己去拉取一下log,方法为:
第一步: adb shell setprop log.tag.hwpush VERBOSE
第二步: adb logcat –v time > D:\hwpush.log
抓日志前,先关闭应用,到抓日志的时候,在命令行输入以上两句,然后点击应用,一直到点击申请devicetoken之后过几秒,关闭命令行,那么在D盘上就可以看到一个hwpush.log的文件,查看关键字“pushlog”进行分析。
更详细的可以到官网查看对应的文档:http://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush.html?page=hmssdk_huaweipush_devguide