官方文档:https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/push-basic-client
前置步骤:
- 在https://developer.huawei.com/consumer/cn/注册成为开发者。
- 准备自己APP的SHA256指纹证书,官方文档地址https://developer.huawei.com/consumer/cn/codelab/HMSPreparation/index.html#4
- 在华为开发者平台创建自己的APP
- 下载SDK、文档和DEMO。https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/HMSAgent_2.6.3.301.zip
- 通过Maven 仓库离线包下载地址下载关于推送的包:
http://developer.huawei.com/repo/com/huawei/android/hms/base/2.6.3.301/base-2.6.3.301.aar
http://developer.huawei.com/repo/com/huawei/android/hms/push/2.6.3.301/push-2.6.3.301.aar
创建成功后,你会在华为开发者平台上看到类似的界面效果,下面就是我APP的界面。
image.png
image.png
完成上面的前置步骤后,就可以开始在自己的APP中接入华为推送了。
①解压缩的文件夹内,双击运行GetHMSAgent_cn.bat。![](https://img.haomeiwen.com/i15032307/b5dc718d3900983c.png)
![](https://img.haomeiwen.com/i15032307/80bde4da5edb530d.png)
![](https://img.haomeiwen.com/i15032307/c86efaf5e85d678e.png)
![](https://img.haomeiwen.com/i15032307/a0693af6759b574f.png)
③在build.gradle中添加aar
implementation files('libs/huawei-base-2.6.3.301.aar')
implementation files('libs/huawei-push-2.6.3.301.aar')
网上的很多教程和官网,都是配置maven动态加载华为的推送库,也是可以,但是由于不稳定,而且有时候gradle更新之后,对应的动态库会更新,华为的库经常更新失败,导致了项目都无法运行,避免这种情况,我手动导入了aar库,避免更新失败的问题。
④配置manifest.xml
<!--注册华为推送-->
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="appid=你的APPID"></meta-data>
<!-- 接入HMSSDK PUSH模块需要注册,
第三方相关 :接收Push消息(注册、透传消息、通知栏点击事件)广播,
此receiver类需要开发者自己创建并继承com.huawei.hms.support.api.push.PushReceiver类,
参考示例代码中的类:com.huawei.hmsagent.HuaweiPushRevicer-->
<receiver android:name=".mctpush.huaweiPush.HuaWeiMessageReceiver"
android:permission="com.cjy.test.mctpush.huaweiPush.permission.PROCESS_PUSH_MSG">
<intent-filter>
<!-- 必须,用于接收token -->
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
<!-- 必须, 用于接收透传消息 -->
<action android:name="com.huawei.android.push.intent.RECEIVE" />
<!-- 必须, 用于接收通知栏消息点击事件 此事件不需要开发者处理,只需注册就可以-->
<action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY"/>
</intent-filter>
</receiver>
<activity android:name=".mctpush.huaweiPush.HuaWeiPushMessageActivity"
android:configChanges="keyboardHidden|screenSize|orientation"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoBar">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:host="你填写的host"
android:path="/push_message"
android:scheme="huawei_scheme"/>
</intent-filter>
</activity>
<!--注册华为推送结束-->
上面需要注意的是HuaWeiPushMessageActivity,这是我自己写的类,用于处理点击消息通知的相关跳转逻辑。配置中可以看到有host、path、scheme等配置,这三个都是自定义的,定义好之后,跟之后服务端的推送有关。
我上面配置,后台发送是配置的intent URI是
huawei_scheme://com.cjy.test/push_message?native_redirect=13&page_type=3#Intent;launchFlags=0x10000000;end
其中page_type、native_redirect就是参数和对应的值。
⑤编写HuaWeiMessageReceiver和HuaWeiPushMessageActivity
public class HuaWeiMessageReceiver extends PushReceiver {
/**
* 用来接收token返回
* 调用getToken方法后,获取服务端返回的token结果,返回token以及belongId
* @param context
* @param token
*/
@Override
public void onToken(Context context, String token) {
super.onToken(context, token);
Log.d("HMS","huawei token:"+token);
}
@Override
public void onToken(Context context, String token, Bundle extras) {
super.onToken(context, token, extras);
}
/**
* push连接状态
* 调用getPushState方法后,获取push连接状态的查询结果
*/
@Override
public void onPushState(Context context, boolean pushState) {
super.onPushState(context, pushState);
}
/**
* 透传消息
* 推送消息下来时会自动回调onPushMsg方法实现应用透传消息处理。本接口必须被实现。 在开发者网站上发送push消息分为通知和透传消息
* 通知为直接在通知栏收到通知,通过点击可以打开网页,应用 或者富媒体,不会收到onPushMsg消息
*/
@Override
public boolean onPushMsg(Context context, byte[] msgBytes, Bundle extras) {
return super.onPushMsg(context, msgBytes, extras);
}
/**
* 通知栏点击事件处理
* 该方法会在设置标签、点击打开通知栏消息、点击通知栏上的按钮之后被调用。由业务决定是否调用该函数。
*/
@Override
public void onEvent(Context context, Event event, Bundle extras) {
super.onEvent(context, event, extras);
}
}
public class HuaWeiPushMessageActivity extends AppCompatActivity {
private int nativeRedirect = 0;
private String url = "";
private int pageType = 0;
private int newsType = 0;
private long newsId = 0;
private int openMethod = ActivityUtils.OPEN_IN;
private String thumb = "";
private String title = "";
private String content = "";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Uri uri = intent.getData();
if (uri != null) {
KLog.v("HuaWeiPushMessage", uri.toString());
if (uri.getQueryParameter(MessageEntity.NativeRedirect) != null && !uri.getQueryParameter(MessageEntity.NativeRedirect).equals("")) {
nativeRedirect = Integer.valueOf(uri.getQueryParameter(MessageEntity.NativeRedirect));
}
url = uri.getQueryParameter(MessageEntity.Link);
if (uri.getQueryParameter(MessageEntity.PageType) != null && !uri.getQueryParameter(MessageEntity.PageType).equals("")) {
pageType = Integer.valueOf(uri.getQueryParameter(MessageEntity.PageType));
}
if (uri.getQueryParameter(MessageEntity.NewsType) != null && !uri.getQueryParameter(MessageEntity.NewsType).equals("")) {
newsType = Integer.valueOf(uri.getQueryParameter(MessageEntity.NewsType));
}
if (uri.getQueryParameter(MessageEntity.NewsId) != null && !uri.getQueryParameter(MessageEntity.NewsId).equals("")) {
newsId = Long.valueOf(uri.getQueryParameter(MessageEntity.NewsId));
}
if (uri.getQueryParameter(MessageEntity.OpenMethod) != null && !uri.getQueryParameter(MessageEntity.OpenMethod).equals("")) {
openMethod = Integer.valueOf(uri.getQueryParameter(MessageEntity.OpenMethod));
}
thumb = uri.getQueryParameter(MessageEntity.Thumb);
title = uri.getQueryParameter(MessageEntity.Title);
content = uri.getQueryParameter(MessageEntity.Description);
if (TnaotApplication.Companion.instance().isExistMainActivity()) {//是否已经启动APP
//跳转到具体页面的代码
} else {
//启动APP的代码
}
this.finish();
} else {
//启动APP的代码
this.finish();
}
}
}
⑥在第一个主activity中注册初始化
if (PushUtil.getPhoneType(this).equals(PushUtil.PHONE_TYPE_HUAWEI)) {
PushUtil.connectHMS(this);
PushUtil.getHMSToken();
}
public static void connectHMS(Activity activity) {
/**
* SDK连接HMS
*/
HMSAgent.connect(activity, new ConnectHandler() {
@Override
public void onConnect(int rst) {
Log.d("HMS", "HMS connect end:" + rst);
}
});
}
public static void getHMSToken() {
HMSAgent.Push.getToken(new GetTokenHandler() {
@Override
public void onResult(int rtnCode) {
Log.d("HMS", "get token: end code=" + rtnCode);
}
});
}
全部流程大致如此,剩下的就是如何保存token、上报服务端、与服务端对接接口参数等,这些都属于自身项目逻辑,这里不一一记录了。
网友评论