文档管理中心
我的

多发送者功能

从Push SDK 5.0.4版本开始,推送服务提供了多发送者功能,该功能支持多个发送者向某个应用推送消息。举例来说,华为钱包在手机上是一个应用,华为商城和华为视频想给安装了华为钱包的用户推送华为商城促销和华为视频会员充值有优惠的营销消息,华为钱包是目标应用,华为商城和华为视频都是发送者,该场景就需要使用多发送者能力。

配置多发送者权限

目标应用开发者登录AppGallery Connect网站,点击“开发与服务”,在项目列表中找到您的项目,通过“增长 > 推送服务 > 配置”导航到“配置”页签,添加其他发送者ID(即发送者应用归属的项目ID),为其他发送者配置向您的应用发送消息的权限。

说明

发送者ID可在AppGallery Connect顶部导航栏选择“开发与服务”,左侧导航栏选择“项目设置”,该页面的项目ID即是发送者ID。

客户端应用开发

  1. 目标应用开发者在AppGallery Connect网站上点击“开发与服务”,在项目列表中找到您的项目,将“项目设置”里的“agconnect-services.json”文件拷贝到您Android工程应用级根目录下。

    说明

    请确认agconnect-services.json文件中含有project_id字段,如果没有,您需重新下载该文件,否则调用getToken(subjectId)会报错。

  2. 目标应用开发者集成Push SDK,并通过getToken方法为发送者申请Push Token,这个方法的入参为发送者的项目ID。

    Java
    Kotlin
    public class MainActivity extends AppCompatActivity {
        private void getSubjectToken() {
            // 创建一个新线程
            new Thread() {
                @Override
                public void run() {
                    try {
                        // 发送者的项目ID
                        String projectId = "the id of sender";                    
                        // 目标应用为发送者申请token
                        String token = HmsInstanceId.getInstance(MainActivity.this).getToken(projectId);
                        Log.i(TAG, "get token success");
    
                        // 判断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.");
        }
    }
    class MainActivity : AppCompatActivity {
        private fun getSubjectToken() {
            // 创建一个新线程
            object : Thread() {
                override fun run() {
                    try {
                        // 发送者的项目ID
                        val projectId = "the id of sender"
                        // 目标应用为发送者申请token
                        val token = HmsInstanceId.getInstance(this@MainActivity).getToken(projectId)
                        Log.i(TAG, "get token success")
    
                        // 判断token是否为空
                        if(!TextUtils.isEmpty(token)) {
                            sendRegTokenToServer(token)
                        }
                    } catch (e: ApiException) {
                        Log.e(TAG, "get token failed, $e")
                    }
                }
            }.start()
        }
        private fun sendRegTokenToServer(token: String?) {
            Log.i(TAG, "sending token to server.")
        }
    }

    EMUI 10.0版本以下的华为终端设备需要从onNewToken中接收目标应用为发送者申请的Push Token。

    Java
    Kotlin
    @Override
    public void onNewToken(String token, Bundle bundle) {         
        // 获取push token
        Log.i(TAG, "received refresh token");
        
        // 判断push token是否为空
        if (!TextUtils.isEmpty(token)) {
            refreshedTokenToServer(token);
        }
    }
    private void refreshedTokenToServer(String token) {
        Log.i(TAG, "sending token to server.");
    }
    override fun onNewToken(token: String?, bundle: Bundle?) {    
        // 获取push token
        Log.i(TAG, "received refresh token")
        
        // 判断push token是否为空
        if (!token.isNullOrEmpty()) { 
            refreshedTokenToServer(token)    
        }
    }
    private fun refreshedTokenToServer(token: String) { 
        Log.i(TAG, "sending token to server.")
    }

  3. 目标应用开发者拿到Push Token后将其传给发送者,发送者获取Push Token后可以给目标应用推送消息。

    • 通知栏消息:当用户点击通知栏消息后,您可以通过在intent中读取“_hw_from”属性来区分发送者,详情可参见自定义点击消息动作。
    • 透传消息:在EMUI 9.1.0版本之后,您可以调用RemoteMessages里的getFrom方法,根据返回值来区分发送者。

服务端开发指导

  1. 发送者服务端获取鉴权信息,可以通过OAuth 2.0开放鉴权(客户端模式)或者基于服务账号生成鉴权令牌(JSON Web Token)方式。
  2. 发送者服务端调用下行消息API为目标应用推送消息,更多消息体内容请参见下行消息,相关错误码请参见错误码。

    HTTPS POST URL:

    POST https://push-api.cloud.huawei.com/v1/[clientid]/messages:send
    说明

    “[clientid]”请替换为目标应用的Client ID(在项目设置页面获取)。

    请求消息头示例:

    Content-Type: application/json; charset=UTF-8
    Authorization: Bearer CF3Xl2XV6jM***************vNm3WccUIaDg== 
    说明

    通知栏消息体示例:

    {
        "validate_only": false,
        "message": {
            "android": {
                "notification": {
                    "title": "test title",
                    "body": "test body",
                    "click_action": {
                        "type": 3
                    }
                }
            },
            "token": ["pushtoken1"]
        }
    }
    透传消息体示例:
    {
        "validate_only": false,
        "message": {
            "data": "{'param1':'value1','param2':'value2'}",
            "token": ["pushtoken1"]
        }
    }
    说明

    “token”为目标应用为发送者申请的Push Token。