在即时通讯 IM 中集成华为 HMS 推送

大约 3 分钟

在即时通讯 IM 中集成华为 HMS 推送

环信即时通讯 IM SDK 中已集成华为 HMS 推送相关逻辑,你还需要完成以下步骤。

步骤一 在华为开发者后台创建应用

华为开发者后台open in new window创建应用,开启推送服务,并上传对应的证书指纹。

详见华为官方介绍:华为 HMS 消息推送服务集成open in new window

步骤二 上传推送证书

  1. 登录 环信控制台open in new window,在 应用管理 页面点击测试版或正式版的应用的 App Key。

  2. 选择 增值功能 > 消息推送

  3. 证书管理 页面,点击 添加推送证书。在 添加推送证书 对话框中选择 华为 页签,配置华为推送参数。参数相关信息,详见你在华为开发者后台创建的 应用信息中的 App ID 和 SecretKey 以及程序的包名open in new window

image

参数类型是否必需描述
证书名称String华为 Client ID。
推送密钥String华为 Client Secret。
应用包名String华为 App package name。
项目 IDString项目 ID。
CategoryString自动分类权益申请 Category。该参数仅对离线推送有效。
ActionString点击通知后的动作。组件定义的 intent-filter action name。该参数仅对离线推送有效。
ActivityClassString角标显示,应用入口类路径。示例:com.easemob.MainActivity。该参数仅对离线推送有效。

步骤三 集成华为推送 SDK

  1. 集成 HMS Core SDK,参见 华为官网集成文档open in new window

  2. 注册继承自 HmsMessageService 的服务到 AndroidManifest.xml 中。

    <!--华为 HMS Config-->
    <service android:name=".service.HMSPushService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    <!-- huawei push end -->
    
  3. 获取华为推送 Token 并上传open in new window

完成环信 IM SDK 的初始化与登录后,你需要获取华为推送的 token,并将其上传至环信服务器,从而与当前 IM 登录账号进行绑定。

获取 Token 的注意事项

在调用华为 getToken 接口前,请了解以下行为特征:

  1. 服务开通前提getToken 接口仅在 AppGallery Connect 平台已开通推送服务后才能成功返回 token。
  2. EMUI 10.0 及以上版本getToken 接口会直接返回 token。若本次调用失败,Push 服务会缓存申请并自动重试,成功后通过 onNewToken 接口返回。
  3. 低于 EMUI 10.0 版本:若 getToken 接口返回为空,在确保 Push 服务已开通的情况下,结果会后续通过 onNewToken 接口返回。
  4. Token 刷新:当服务端识别到 token 过期并刷新后,新 token 会通过 onNewToken 接口返回。

示例代码

以下示例代码演示了如何判断华为推送的可用性,并在子线程中获取 token 后上传至环信服务器。

    public void getHMSToken(Activity activity){
        // 判断是否启用 FCM 推送
        if (EMClient.getInstance().isFCMAvailable()) {
            return;
        }
        try {
            if(Class.forName("com.huawei.hms.api.HuaweiApiClient") != null){
                Class<?> classType = Class.forName("android.os.SystemProperties");
                Method getMethod = classType.getDeclaredMethod("get", new Class<?>[] {String.class});
                String buildVersion = (String)getMethod.invoke(classType, new Object[]{"ro.build.version.emui"});
                //在某些手机上,invoke 方法不报错
                if(!TextUtils.isEmpty(buildVersion)){
                    EMLog.d("HWHMSPush", "huawei hms push is available!");
                    new Thread() {
                        @Override
                        public void run() {
                            try {
                                // read from agconnect-services.json
                               // String appId = AGConnectServicesConfig.fromContext(activity).getString("client/app_id");
                                String appId = new AGConnectOptionsBuilder().build(activity).getString("client/app_id");
                                EMLog.e("AGConnectOptionsBuilder","appId:"+appId);
                                // 申请华为推送 token
                                String token = HmsInstanceId.getInstance(activity).getToken(appId, "HCM");
                                EMLog.d("HWHMSPush", "get huawei hms push token:" + token);
                                if(token != null && !token.equals("")){
                                    //没有失败回调,假定 token 失败时 token 为 null
                                    EMLog.d("HWHMSPush", "register huawei hms push token success token:" + token);
                                    // 上传华为推送 token
                                    EMClient.getInstance().sendHMSPushTokenToServer(token);
                                }else{
                                    EMLog.e("HWHMSPush", "register huawei hms push token fail!");
                                }
                            } catch (ApiException e) {
                                EMLog.e("HWHMSPush","get huawei hms push token failed, " + e);
                            }
                        }
                    }.start();
                }else{
                    EMLog.d("HWHMSPush", "huawei hms push is unavailable!");
                }
            }else{
                EMLog.d("HWHMSPush", "no huawei hms push sdk or mobile is not a huawei phone");
            }
        } catch (Exception e) {
            EMLog.d("HWHMSPush", "no huawei hms push sdk or mobile is not a huawei phone");
        }
    }
  1. 在即时通讯 IM SDK 初始化时,配置启用华为推送。

    EMOptions options = new EMOptions();
    ...
    EMPushConfig.Builder builder = new EMPushConfig.Builder(this);
    builder.enableHWPush();
    // 将 pushconfig 设置为 ChatOptions
    options.setPushConfig(builder.build());
    // 初始化 IM SDK
    EMClient.getInstance().init(this, options);
    
上次编辑于: