android接入华为推送

最近公司产品想要提高用户体验,便让我研究一下华为推送的问题。其实推送最重要的就是进程保活的这个问题,这是一个比较棘手的问题。现在比较普遍的做法是集成多个厂商的推送,例如小米,华为,魅族推送等,再加一个另外的第三方推送(个推,极光,信鸽)。今天主要讲的是华为推动接入的一些步骤和问题,而接入的版本是hms 2.5.2.300。

1、注册成为华为开发者

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了

2、添加应用以及点亮HMS权益

创建应用:

android接入华为推送_第1张图片

然后申请push权益服务

android接入华为推送_第2张图片

3、集成SDK

android studio集成的方法是Gradle+maven
1、打开项目的build.gradle–>allprojects–>repositories配置maven仓库
android接入华为推送_第3张图片

2、添加项目依赖,在子项目的build.gradle–>dependencies
这里写图片描述
其中2.5.2.300是版本号,以后有更新的版本出来,就直接在这里改就好了
然后sync一下,这样子就已经集成完毕了,是不是很方便呢ヽ( ̄▽ ̄)ノ

4、配置manifest

(1)添加权限
android接入华为推送_第4张图片

(2)添加APPID
这里写图片描述

(3)添加一些特定的activity(跳转所需的透明页面)和provider(读取升级文件)
android接入华为推送_第5张图片

(4)添加两个receiver,用来接收广播信息
android接入华为推送_第6张图片

(5)添加混淆
proguard-rules.pro文件添加
-keep class com.huawei.hms.**{*;}

(6)配置签名
因为hms平台上的应用要签名的SHA256指纹,在android studio上就可以获取,只需要在Terminal上输入keytool -list -v -keystore 签名地址 ,再输入密钥的密码就OK了
android接入华为推送_第7张图片

通过以上的步骤,准备工作就已经差不多了,剩下就是连接华为移动服务了

客户端开发

1、连接华为移动服务

在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();
}

2、获取token

当连接成功之后,就要去获取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) {
            //这边的结果只表明接口调用成功,是否能收到响应结果只在广播中接收,广播这块后面会有讲到
        }   
    });
}

3、自定义广播,获取token,push连接状态

/**
 * 应用需要创建一个子类继承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);

    }
}

最后,还要安装华为移动服务,就可以使用了。
android接入华为推送_第8张图片

效果演示

android接入华为推送_第9张图片

android接入华为推送_第10张图片

补充

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

你可能感兴趣的:(Android开发)