使用HMS Core Push Kit整合SDK工具包的方法并利用其向第三方推送信息的教程

87 阅读5分钟

向不同制造商的设备推送信息的实践

推送信息在提高应用程序的用户参与度方面很受欢迎。让我们来学习一下如何向不同厂商的设备发送此类信息。

推送消息,随着移动互联网的普及,已经成为移动应用取得商业成功的一个非常有效的方式。它可以提高用户的参与度和粘性,允许开发者在各种场景下向广大用户发送消息:坐地铁或公交车、在餐厅吃饭、聊天......你说的都可以。不管是什么场景,推送信息总是一个很好的帮手,可以让你直接与你的用户 "对话",让你的用户了解一些信息。

然而,推送信息所带来的这种巨大好处可能会被一个挑战所削弱:手机制造商的多样性。这是因为通常每个制造商都有自己的推送信息渠道,这增加了向不同制造商的手机统一发送你的应用程序的推送信息的难度。当然,有一个简单的解决方案--只向一个制造商的手机发送你的推送信息--但这可能会限制你的用户群,使你无法获得你想要的信息传递效果。

那么这就解释了为什么我们的开发者通常需要为我们的应用程序找到一个解决方案,以便能够向不同品牌的设备推送他们的信息。

我不知道你的情况,但我为我的应用程序找到的解决方案是HMS Core Push Kit。接下来,我将展示我是如何整合这个工具包,并利用其聚合第三方推送信息渠道的能力,在不同厂商生产的手机上实现推送信息,期望获得更大的用户参与度和粘性。让我们继续讨论实施问题。

准备工作

在整合SDK之前,请做好以下准备工作:

1.登录特定制造商的信息推送平台,在该平台上创建一个项目和应用程序,并保存项目的JSON密钥文件。(要求可能因制造商而异,所以请参考具体制造商的文档以了解其要求)。

2.在AppGallery Connet中配置应用信息,但在配置构建依赖性时使用以下构建依赖性来代替。

dependencies {
    implementation 'com.huawei.hms:push-fcm:6.3.0.304'
}

3.在上一步提到的平台上,点击我的项目,在项目中找到应用,并进入成长>推送工具包>设置。在显示的页面上,点击配置其他基于Android的推送旁边的启用,然后复制保存的JSON密钥文件中的密钥并将其粘贴到验证参数文本框中。

开发程序

现在,让我们来看看开发程序。

1.禁用SDK的自动初始化功能。

为此,打开AndroidManifest.xml文件,在**元素中添加元素。注意,在该元素中,name参数有一个固定的值,即 push_kit_auto_init_enabled 。至于值**参数,你可以把它设置为 false ,表示自动初始化被禁用。

<manifest ...>
    ...
    <application ...>      
        <meta-data
            android:name="push_kit_auto_init_enabled"
            android:value="false"/>
        ...
    </application>
    ...
</manifest>

2.以下列任何一种方式初始化推送能力。

  • <meta-data> 元素中push_kit_proxy_init_enabled对应的设为true
    <application>
        <meta-data
            android:name="push_kit_proxy_init_enabled"
            android:value="true" />
    </application>
  • 应用程序类的onCreate方法中明确地调用FcmPushProxy.init
  1. 调用getToken方法来申请一个令牌。
private void getToken() {
    // Create a thread.
    new Thread() {
        @Override
        public void run() {
            try {
                // Obtain the app ID from the agconnect-services.json file.
                String appId = "your APP_ID";

                // Set tokenScope to HCM.
                String tokenScope = "HCM";
                String token = HmsInstanceId.getInstance(MainActivity.this).getToken(appId, tokenScope);
                Log.i(TAG, "get token: " + token);
                
                // Check whether the token is empty.
                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);
}

4.覆盖onNewToken方法。

在SDK被集成和初始化后,getToken方法将不会返回一个令牌。相反,你需要通过使用onNewToken方法来获得一个令牌。

@Override
public void onNewToken(String token, Bundle bundle) {
    Log.i(TAG, "onSubjectToken called, token:" + token );
}
  1. 覆盖onTokenError方法。

如果获取令牌失败,该方法将被调用。

@Override
public void onTokenError(Exception e, Bundle bundle) {
    int errCode = ((BaseException) e).getErrorCode();
    String errInfo = e.getMessage();
    Log.i(TAG, "onTokenError called, errCode:" + errCode + ",errInfo=" + errInfo );
}

6.覆盖onMessageReceived方法以接收数据信息。

@Override
public void onMessageReceived(RemoteMessage message) {
    Log.i(TAG, "onMessageReceived is called");

    // Check whether the message is empty.
    if (message == null) {
        Log.e(TAG, "Received message entity is null!");
        return;
    }

    // Obtain the message content.
    Log.i(TAG, "get Data: " + message.getData()
            + "\n getFrom: " + message.getFrom()
            + "\n getTo: " + message.getTo()
            + "\n getMessageId: " + message.getMessageId()
            + "\n getSentTime: " + message.getSentTime()
            + "\n getDataMap: " + message.getDataOfMap()
            + "\n getMessageType: " + message.getMessageType()
            + "\n getTtl: " + message.getTtl()
            + "\n getToken: " + message.getToken());

    Boolean judgeWhetherIn10s = false;
    // Create a job to process a message if the message is not processed within 10 seconds.
    if (judgeWhetherIn10s) {
        startWorkManagerJob(message);
    } else {
        // Process the message within 10 seconds.
        processWithin10s(message);
    }
}
private void startWorkManagerJob(RemoteMessage message) {
    Log.d(TAG, "Start new job processing.");
}
private void processWithin10s(RemoteMessage message) {
    Log.d(TAG, "Processing now.");
}

7.发送下行链路消息。

目前,你只能在服务器上使用REST APIs,通过第三方制造商的推送消息渠道发送下行消息

以下是使用HTTPS POST调用API的URL。

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

请求头看起来像下面:

Content-Type: application/json; charset=UTF-8
Authorization: Bearer CF3Xl2XV6jMKZgqYSZFws9IPlgDvxqOfFSmrlmtkTRupbU2VklvhX9kC9JCnKVSDX2VrDgAPuzvNm3WccUIaDg==

通知信息体的例子如下。

{
    "validate_only": false,
    "message": {
        "android": {
            "notification": {
                "title": "test title",
                "body": "test body",
                "click_action": {
                    "type": 3
                }
            }
        },
        "token": ["pushtoken1"]
    }
}

就这样,我的应用程序有能力向不同制造商的手机发送推送信息--无需任何其他配置。很简单,对吗?

总结

今天高度发达的移动互联网已经使推送信息成为移动应用提高用户参与度和粘性的重要而有效的方式。推送信息有效发挥作用的一个巨大障碍是高度多样化的手机市场,各种制造商充斥其中。

在这篇文章中,我展示了我的解决方案,即聚合不同厂商的推送渠道,这使得我的应用能够以统一的方式向这些厂商生产的设备推送信息。正如所证明的那样,整个实施过程既简单明了又具有成本效益,通过确保推送信息能够到达由不同制造商支持的更大的用户群,从而提供了更好的信息传递效果。