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

大约 3 分钟

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

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

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

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

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

步骤二 在环信即时通讯云控制台上传推送证书

环信即时通讯云控制台open in new window上传华为推送证书。

  1. 环信即时通讯云控制台open in new window首页的应用列表中,点击目标应用的操作栏中的管理

  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,将 token 上传至环信服务器,与 IM 的登录账号绑定。

/**
     * 申请华为 Push Token:
     * 1. getToken 接口只有在 AppGallery Connect 平台开通服务后申请 token 才会返回成功。
     *
     * 2. EMUI 10.0 及以上版本的华为设备上,getToken 接口直接返回 token。如果当次调用失败 Push 会缓存申请,之后会自动重试申请,成功后则以onNewToken 接口返回。
     *
     * 3. 低于 EMUI 10.0 的华为设备上,getToken 接口如果返回为空,确保 Push 服务开通的情况下,结果后续以 onNewToken 接口返回。
     *
     * 4. 服务端识别 token 过期后刷新 token,以 onNewToken 接口返回。
     */
    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);