HMS推送Android端集成
发布日期:2021-05-07 10:20:51 浏览次数:20 分类:技术文章

本文共 6659 字,大约阅读时间需要 22 分钟。

SDK说明

推送消息类型

Push Kit可发送两种类型的消息给终端:通知栏消息和透传消息。

受限说明

送达率说明

Push Kit致力于提供安全可靠的消息发送通道,保障消息成功送达。影响消息的送达情况因素有:

  • 终端设备是否在线。
  • 如果设备离线,Push Kit会缓存消息,待用户上线后,再将消息投递给用户。Push Kit只缓存一次用户的消息,若用户在线后还发不通,Push Kit不再缓存。
  • 用户手机上集成Push SDK的应用是否被卸载。
  • 网络状况是否稳定。
  • 终端手机的安全控制策略。
  • 不同厂商终端设备对HMS Core(APK)的支持度。
  • 透传消息送达依赖应用进程是否存在。

配置AppGallery Connect

1.生成签名证书指纹

2.打开命令行工具(使用CMD命令),执行cd命令进入keytool.exe所在的目录(图中样例为PC上java程序安装在C盘的Program Files目录)。
在这里插入图片描述
值得注意的是,使用Android studio自带jdk的话,它的位置是在这里

File—>Othor Settings—>Defaut Project Structure

在这里插入图片描述

另外,在Android studio的话,可以直接在Terminal上输入keytool -list -v -keystore 签名地址

,再输入密钥的密码就OK了。

3.执行命令keytool -list -v -keystore ,按命令行提示进行操作。为应用签名文件的完整路径。例如:

keytool -list -v -keystore C:\TestApp.jks

4.根据结果获取对应的SHA256指纹

在这里插入图片描述

5.配置签名证书指纹:

  • 登录AppGallery Connect网站,点击“我的项目”。
  • 在项目列表中找到您的项目,在项目中点击需要配置签名证书指纹的应用。
  • 在“项目设置 > 常规”页面的“应用”区域,点击“SHA256证书指纹”后的图标,输入生成的SHA256指纹
  • 下载如图显示的"agconnect-services.json"

集成HMS Core SDK

添加应用的AppGallery Connect配置文件

将刚才下载的"agconnect-services.json"文件拷贝到应用级根目录下。

在这里插入图片描述

配置HMS Core SDK的Maven仓地址

1.打开Android Studio项目级“build.gradle”文件。

在这里插入图片描述

2.添加HUAWEI agcp插件以及Maven代码库

  • 在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。

  • 在“allprojects > repositories”中配置HMS Core SDK的Maven仓地址。

  • 如果App中添加了“agconnect-services.json”文件则需要在“buildscript > dependencies”中增加agcp配置。

    buildscript { 		repositories {  		google()  		jcenter()  		maven {url 'https://developer.huawei.com/repo/'}  	}  	dependencies {  		...  		classpath 'com.huawei.agconnect:agcp:1.4.1.300'  	}  }  allprojects {      repositories {          google()          jcenter()          maven {url 'https://developer.huawei.com/repo/'}      }  }

添加编译依赖

1.打开应用级的“build.gradle”文件。

在这里插入图片描述

2.在“dependencies”中添加如下编译依赖。

dependencies {	implementation 'com.huawei.hms:push:{version}'}

说明

{version}请替换为实际的SDK版本号,版本号索引请参见版本更新说明,例如:implementation ‘com.huawei.hms:push:5.0.2.300’。

3.在文件头apply plugin: 'com.android.application’下一行添加如下配置。

apply plugin: 'com.huawei.agconnect'

配置签名

注意:这里配置的签名需要与前面步骤中拿去生成“agconnect-services.json”文件的签名数据一致。

将生签名文件拷贝到工程的app目录下,在build.gradle文件中配置签名。

android { signingConfigs {     config {         keyAlias 'xxx'         keyPassword 'xxxx'         storeFile file('xxx.jks')         storePassword 'xxxx'     } } buildTypes {     debug {         signingConfig signingConfigs.config     }     release {         signingConfig signingConfigs.config         minifyEnabled false         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'     } } }

同步工程

在完成以上的配置后,点击工具栏中的gradle同步图标完成“build.gradle”文件的同步,然后将相关依赖下载到本地。

配置Manifest文件

集成最新的HMS Core Push SDK版本后要在“AndroidManifest.xml”文件的application标签下注册自己的Service,此步骤用于接收服务器推送的消息与Token,接收方法见“下文继续会整理到的申请Push Token”。

如下,HmsPushService类继承于HmsMessageService类并实现其中的方法。
在Manifest文件声明:

详细代码:

import android.content.Intent;import android.text.TextUtils;import android.util.Log;import com.huawei.hms.push.HmsMessageService;import com.huawei.hms.push.RemoteMessage;import com.huawei.hms.push.SendException;import java.util.Arrays;public class HmsPushService extends HmsMessageService {    private final static String CODELABS_ACTION = "com.huawei.codelabpush.action";    @Override    public void onNewToken(String token) {        Log.i("received refresh token:" + token);		//...    }    private void refreshedTokenToServer(String token) {        Log.i("sending token to server. token:" + token);		//...    }    /**     * 接收透传消息     * @param message RemoteMessage     */    @Override    public void onMessageReceived(RemoteMessage message) {        Log.i("onMessageReceived is called");        if (message == null) {            LogTool.f("Received message entity is null!");            return;        }       //...    }    private void startJob(RemoteMessage message){        Log.i( "Processing now.");		//...    }    @Override    public void onTokenError(Exception e) {        super.onTokenError(e);    }}

配置混淆脚本

打开工程的混淆配置文件“proguard-rules.pro”,加入排除HMS Core SDK的混淆配置。

-ignorewarnings-keepattributes *Annotation*-keepattributes Exceptions-keepattributes InnerClasses-keepattributes Signature-keepattributes SourceFile,LineNumberTable-keep class com.hianalytics.android.**{*;}-keep class com.huawei.updatesdk.**{*;}-keep class com.huawei.hms.**{*;}

申请Push Token

场景介绍

每个设备上的每个应用的Token都是唯一存在的,客户端调用HmsInstanceId类中的getToken方法向服务端请求应用的唯一标识:Push Token,开发者的服务器根据这个Token推送消息。开发者可以将Token上报到自己的应用服务器维护并加入Token列表,然后调用Push服务器的推送消息API,根据Token批量推送消息,服务器发送消息请参见服务端开发指导。当getToken方法返回为空时,开发者通过HmsMessageService类中的onNewToken方法获取Token值。

开发者也可以通过Push SDK的自动初始化能力来自动获取token。

Token会在包括但不限于下述场景中发生变化:

  • App卸载重装。
  • App调用注销Token方法。
  • 用户恢复出厂设置。
  • 清除应用数据。

应用的Push Token要定期更新(建议应用每次启动的时候都获取Token,如果发现和上次取到的不同,则上报到自己的服务器)。

请勿使用Token跟踪标记用户。

注意事项

  • getToken方法只有在AppGallery Connect平台打开相关服务后申请Token才会返回成功。
  • EMUI 10.0及以上版本的华为设备上,getToken方法直接返回Token。如果当次调用失败Push会缓存申请,之后会自动重试申请,成功后则以onNewToken方法返回。
  • 低于EMUI 10.0的华为设备上,getToken方法返回为空,确保Push服务开通的情况下,Token值后续以onNewToken方法返回。
  • 集成HMS Core SDK最新版本需要HMS Core(APK)的版本不低于3.0.0。如果低于3.0.0版本,当应用有前台界面时HMS Core SDK会提示升级HMS Core(APK)为最新版本,此时HmsInstanceId类中的getInstance的入参必须传入Activity类实例;当应用是后台应用时,如果开发者不想弹出引导升级的页面时,可以传入非Activity类型的Context类实例。
  • 设置了自动初始化能力的应用,不需要显式的调用getToken申请Token,Push SDK会自动通过onNewToken回调方法返回Token。

开发步骤

建议在App启动后首个activity的onCreate方法调用getToken方法。(在实际项目中,我们是直接在Applicatin中调用的)

1.调用getToken方法获取Token。

private void getToken() {new Thread() {    @Override    public void run() {        try {            // read from agconnect-services.json            String appId = AGConnectServicesConfig.fromContext(MainActivity.this).getString("client/app_id");            String token = HmsInstanceId.getInstance(MainActivity.this).getToken(appId, "HCM");            Log.i(TAG, "get token:" + token);            if(!TextUtils.isEmpty(token)) {                sendRegTokenToServer(token);            }        } catch (ApiException e) {            Log.e(TAG, "get token failed, " + e);        }    }}.start();}private void sendRegTokenToServer(String token) {    Log.i(TAG, "sending token to server. token:" + token);}

2.覆写onNewToken方法,Token发生变化时或者EMUI版本低于10.0以onNewToken方法返回。

// This method callback must be completed in 10 seconds. Otherwise, you need to start a new Job for callback processing.@Overridepublic void onNewToken(String token) {    Log.i(TAG, "received refresh token:" + token);    // send the token to your app server.    if (!TextUtils.isEmpty(token)) {        refreshedTokenToServer(token);    }}private void refreshedTokenToServer(String token) {    Log.i(TAG, "sending token to server. token:" + token);}

说明

  • 调用getToken方法后获得的token一定要做判空处理。
  • 在调用getToken方法外一定要增加异常捕获处理。

踩坑

坑1:跳转到自定义的activity:

支持action参数需要EMUI 10.0.0及以上,推送服务App版本为10.1.0及以上。

2.关于要设置通知消息前台展示的话:功能仅能:EMUI 9.1.0以上,HMS Core SDK 4.0以上支持

在这里插入图片描述

3.关于设置横幅通知:

在这里插入图片描述

Ref:

上一篇:oppo推送Android端集成
下一篇:声网Android端集成与一对一音视频功能实现

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月27日 15时43分27秒