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

大约 4 分钟

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

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

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

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

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

步骤二 上传推送证书

声网控制台open in new window上传华为推送证书。

  1. 展开控制台左上角下拉框,选择需要开通即时通讯 IM 服务的项目。

  2. 点击左侧导航栏的全部产品

  3. 在下拉列表中找到即时通讯 IM 并点击。

  4. 即时通讯 IM 页面,进入功能配置标签页。

  5. 推送证书 页签下,点击添加推送证书

  6. 在弹出的对话框中,选择华为页签,配置相关参数,点击保存。参数相关信息,详见你在华为开发者后台创建的 应用信息中的 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 服务器,从而与当前 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 后上传至IM 服务器。

    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);
    
上次编辑于: