android接入华为推送
2017-08-03 11:26
1031 查看
最近公司产品想要提高用户体验,便让我研究一下华为推送的问题。其实推送最重要的就是进程保活的这个问题,这是一个比较棘手的问题。现在比较普遍的做法是集成多个厂商的推送,例如小米,华为,魅族推送等,再加一个另外的第三方推送(个推,极光,信鸽)。今天主要讲的是华为推动接入的一些步骤和问题,而接入的版本是hms 2.5.2.300。
这里面是需要进行实名制登记注册,身份证照片还有手持身份证照片什么的,审核大概一天左右就OK了
![](http://img.blog.csdn.net/20170802193922300?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后申请push权益服务
![](http://img.blog.csdn.net/20170802194544409?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1、打开项目的build.gradle–>allprojects–>repositories配置maven仓库
![](http://img.blog.csdn.net/20170802195138130?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2、添加项目依赖,在子项目的build.gradle–>dependencies
![](http://img.blog.csdn.net/20170802195358057?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其中2.5.2.300是版本号,以后有更新的版本出来,就直接在这里改就好了
然后sync一下,这样子就已经集成完毕了,是不是很方便呢ヽ( ̄▽ ̄)ノ
![](http://img.blog.csdn.net/20170802200219444?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(2)添加APPID
![](http://img.blog.csdn.net/20170803094956017?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(3)添加一些特定的activity(跳转所需的透明页面)和provider(读取升级文件)
![](http://img.blog.csdn.net/20170803100229351?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(4)添加两个receiver,用来接收广播信息
![](http://img.blog.csdn.net/20170803100439501?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(5)添加混淆
proguard-rules.pro文件添加
-keep class com.huawei.hms.**{*;}
(6)配置签名
因为hms平台上的应用要签名的SHA256指纹,在android studio上就可以获取,只需要在Terminal上输入keytool -list -v -keystore 签名地址 ,再输入密钥的密码就OK了
![](http://img.blog.csdn.net/20170803101805551?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
通过以上的步骤,准备工作就已经差不多了,剩下就是连接华为移动服务了
最后,还要安装华为移动服务,就可以使用了。
![](http://img.blog.csdn.net/20170803105933240?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20170803110428848?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20170803110939075?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodWFueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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
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权益
创建应用:然后申请push权益服务
3、集成SDK
android studio集成的方法是Gradle+maven1、打开项目的build.gradle–>allprojects–>repositories配置maven仓库
2、添加项目依赖,在子项目的build.gradle–>dependencies
其中2.5.2.300是版本号,以后有更新的版本出来,就直接在这里改就好了
然后sync一下,这样子就已经集成完毕了,是不是很方便呢ヽ( ̄▽ ̄)ノ
4、配置manifest
(1)添加权限(2)添加APPID
(3)添加一些特定的activity(跳转所需的透明页面)和provider(读取升级文件)
(4)添加两个receiver,用来接收广播信息
(5)添加混淆
proguard-rules.pro文件添加
-keep class com.huawei.hms.**{*;}
(6)配置签名
因为hms平台上的应用要签名的SHA256指纹,在android studio上就可以获取,只需要在Terminal上输入keytool -list -v -keystore 签名地址 ,再输入密钥的密码就OK了
通过以上的步骤,准备工作就已经差不多了,剩下就是连接华为移动服务了
客户端开发
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> tokenResult = HuaweiPush.HuaweiPushApi.getToken(client); tokenResult.setResultCallback(new ResultCallback<TokenResult>() { @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); } }
最后,还要安装华为移动服务,就可以使用了。
效果演示
补充
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
相关文章推荐
- 华为推送-华为PUSH SDK Android版接入方法
- Android 接入华为推送教程
- android 小米,华为,百度推送封装(QJPushService 使用)
- 第三方推送(小米华为友盟)接入实践
- Android集成小米华为推送以及收不到离线消息的坑
- Android游戏接入——华为篇
- JPush集成华为推送的一些问题-Android端
- cocos 项目 接入友盟 android 推送sdk
- 服务器端接入有盟推送,实现为android 和 ios推送的功能
- Android友盟推送接入
- AndroidStudio接入信鸽推送常见问题(附安卓接入视频教程)
- android 极光推送接入
- Android 接入 PubNubSDK 推送
- Android集成华为推送的问题总结
- 【android&gradle】华为推送HwPush_SDK_V2705.jar与百度地图.jar冲突
- Android 推送集成华为,小米,友盟
- ANDROID接入华为SDK遇到的SHA256withRSA的问题解决
- 解决 cocos android 接入友盟推送 sdk 在5.0以下的系统出现UnsatisfiedLinkError 错误
- Android推送服务——百度云推送
- Android开发之利用MQTT协议实现消息的即时推送