HMS推送Android端集成

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文件声明:

<meta-data
        android:name="push_kit_auto_init_enabled"
        android:value="true"/>

<service
    android:name=".push.hmsPush.service.HmsPushService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
    </intent-filter>
</service>

详细代码:

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.
@Override
public 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:

HMS推送服务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值