• 【ACG】博主在专栏更新内容后,及时通知关注他的用户去阅读


    业务场景

    当用户打开应用时,系统发送Push消息给用户,向用户推荐博主信息。用户关注博主后,将保存用户的订阅信息,当关注的博主更新内容时,向订阅的用户发送短信,提醒用户及时查看最新内容。从而持续增强了用户的互动性。

    cke_276.png

    向用户发送Push消息

    1.在应用中集成推送服务

    2.接收透传的Push消息。

    3.在AndroidManifest.xml配置PushService,用于接收通知消息。

    1. android:name=".ui.PushService"
    2. android:exported="false">
    3. <intent-filter>
    4. <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
    5. intent-filter>
    6. <meta-data
    7. android:name="push_kit_auto_init_enabled"
    8. android:value="true" /

    4. PushService继承自HmsMessageService,处理接收到的消息后, 使用自定义通知显示消息。

    1. private void processWithin10s(RemoteMessage message) {
    2. if (!TextUtils.isEmpty(message.getData())) {
    3. JSONObject object = new JSONObject(message.getData());
    4. String title = object.optString("title") + "";
    5. String content = object.optString("content") + "";
    6. String articleId = object.optString("articleId") + "";
    7. String authorId = object.optString("authorId") + "";
    8. NotificationUtils.sendNotify(this, title, content, articleId, authorId);
    9. }

    使用云数据库存储信息

    1.开通云数据库服务

    2.新增和导出对象类型。新增Author、Article、SubscriptionRecord表,具体字段请下载Demo参考对应类名的实体类。

    3.新增存储区

    4.集成云数据库SDK

    5.初始化云数据库

    1. public static void initAGConnectCloudDB(Context context) {
    2. AGConnectCloudDB.AGConnectCloudDB.initialize(context);
    3. }

    6.调用getInstance(AGConnectInstance connectInstance, AGConnectAuth auth)方法获取对应数据处理位置的AGConnectCloudDB实例,并使用createObjectType创建对象类型。

    1. mCloudDB = AGConnectCloudDB.getInstance(AGConnectInstance.getInstance(), AGConnectAuth.getInstance());
    2. mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo());

    7.创建Cloud DB zone配置对象,并打开该Cloud DB zone(以Cloud DB zone的同步属性为缓存模式、访问属性为公共存储区为例),详细请参考CloudDBZoneConfig

    1. public void openCloudDBZoneV2() {
    2. mConfig = new CloudDBZoneConfig(ZONE_NAME,CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,
    3. CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC);
    4. mConfig.setPersistenceEnabled(true);
    5. Task<CloudDBZone> openDBZoneTask = mCloudDB.openCloudDBZone2(mConfig, true);
    6. openDBZoneTask.addOnSuccessListener(cloudDBZone -> {
    7. mCloudDBZone = cloudDBZone;
    8. addSubscription();
    9. }).addOnFailureListener(e -> {
    10. callBack.onPhotoErrorMessage("OpenCloudDBZone Failed: " + e.getMessage());
    11. });
    12. }

    8.插入更新数据,用于存储新增或者修改的文章信息。

    1. public void upsertArticle(Article article) {
    2. Task<Integer> upsertTask = mCloudDBZone.executeUpsert(article);
    3. upsertTask.addOnSuccessListener(cloudDBZoneResult -> {
    4. ArrayList<Article> articles = new ArrayList<>();
    5. articles.add(article);
    6. callBack.onUpdate(articles);
    7. }).addOnFailureListener(e -> callBack.onPhotoErrorMessage("upsert Error: " + e.getMessage()));
    8. }

    9.查询数据,用于查询所有文章信息。

    1. public void queryAll() {
    2. Task<CloudDBZoneSnapshot<Article>> queryTask = mCloudDBZone.executeQuery(
    3. CloudDBZoneQuery.where(Article.class),
    4. CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY);
    5. queryTask.addOnSuccessListener(snapshot -> {
    6. processQueryResult(snapshot);
    7. }).addOnFailureListener(e -> {
    8. callBack.onPhotoErrorMessage("queryAll Error: " + e.getMessage());
    9. });
    10. }

    触发记录用户的订阅信息

    1.开通云函数服务

    2.本地编辑和打包操作云数据库的相关函数。

    a.项目中引入AGC云数据库相关模块,并初始化认证信息。

    1. const agconnect = require('@agconnect/common-server');
    2. const clouddb = require('@agconnect/database-server/dist/index.js');
    3. const SubscriptionRecord = require('./model/SubscriptionRecord.js');
    4. let api_client_name = "./model/agc-apiclient-test.json";
    5. let path = require('path');
    6. let api_client_path = path.join(__dirname, api_client_name);
    7. agconnect.AGCClient.initialize(agconnect.CredentialParser.toCredential(api_client_path));
    let body = JSON.parse(event.body);//接收http触发器请求参数

    b.初始化云数据库

    1. try {
    2. const agcClient = agconnect.AGCClient.getInstance();
    3. clouddb.AGConnectCloudDB.initialize(agcClient);
    4. const agconnectCloudDB = clouddb.AGConnectCloudDB.getInstance(agcClient);
    5. const cloudDBZoneConfig = new clouddb.CloudDBZoneConfig('ArticleZone');
    6. cloudDBZoneClient = agconnectCloudDB.openCloudDBZone(cloudDBZoneConfig);
    7. let result = { "message": "openCloudDBZone success" };
    8. logger.info(result);
    9. } catch (error) {
    10. let result = { "initDB message": error.message };
    11. logger.info(result);
    12. callback(result);
    13. }

    c.插入用户订阅信息到云数据库,用于存储用户订阅信息。

    1. async function upsertSubscriptionRecord(SubscriptionRecord, callback, logger) {
    2. if (!cloudDBZoneClient) {
    3. console.log("CloudDBClient is null, try re-initialize it");
    4. let result = { "message": "CloudDBClient is null" };
    5. logger.info(result);
    6. return;
    7. }
    8. try {
    9. resp = await cloudDBZoneClient.executeUpsert(SubscriptionRecord);
    10. console.log('The number of upsert record is:', resp);
    11. let result = { "message": "upsertSubscriptionRecord success " };
    12. logger.info(result);
    13. } catch (error) {
    14. let result = { "upsert err ": error.message };
    15. logger.info(result);
    16. callback(result);
    17. }
    18. }

    d.查询订阅列表,用于判断用户是否订阅作者。

    1. async function querySubscriptionRecordWithOrder(authorId, phone, callback, logger) {
    2. try {
    3. const cloudDBZoneQuery = clouddb.CloudDBZoneQuery.where(SubscriptionRecord.SubscriptionRecord).equalTo("authorId", parseInt(authorId)).equalTo("phone", phone);
    4. const resp = await cloudDBZoneClient.executeQuery(cloudDBZoneQuery);
    5. console.log('The number of query records is:', resp.getSnapshotObjects().length);
    6. isSubscription = resp.getSnapshotObjects().length > 0 ? true : false;
    7. if (isSubscription) {
    8. // await sendSMS(phone);
    9. }
    10. } catch (error) {
    11. let result = { "query err ": error.message };
    12. logger.info(result);
    13. callback(result);
    14. }
    15. }

    3.创建云函数,将上一步打包的函数上传到该云函数中。

    4.在上步创建的云函数中创建HTTP触发器

    5.在应用客户端集成云函数SDK。

    6.初始化云函数,调用HTTP触发器获取云数据库相关操作结果。

    function = AGConnectFunction.getInstance();
    1. HashMap<String, String> map = new HashMap();
    2. map.put("type", "1");
    3. map.put("articleId", msg.getArticleId());
    4. map.put("authorId", msg.getAuthorId());
    5. map.put("phone", MainApplication.phone);
    6. map.put("uid", MainApplication.uid);
    7. function.wrap("insert-article-$latest").call(map)
    8. .addOnCompleteListener(new OnCompleteListener<FunctionResult>() {
    9. @Override
    10. public void onComplete(Task task) {
    11. if (task.isSuccessful()) {
    12. String value = task.getResult().getValue();
    13. JSONObject object = new JSONObject(value);
    14. String message = (String) object.get("message");
    15. //云函数返回成功
    16. } }
    17. });

    内容变更向关注用户发送短信

    1.开通短信服务

    2.调试向用户发送短信

    测试功能

    1.应用中新发布一个文章。

    2.在AGC推送服务页面新增一条推送消息,推送给测试手机,手机是否收到消息提示用户有新内容发布,点击通知栏,是否可以跳转至详情页。

    3.在详情页关注作者,检查数据库中是否已经存入相关信息。

    4.重新发布一个文章,检查是否收到更新内容的推送消息。

    下载Demo

    获取Demo

     欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

  • 相关阅读:
    无监督多视角行人检测 Unsupervised Multi-view Pedestrian Detection
    pytorch 多分类中的损失函数
    回溯框架总结
    冰冰学习笔记:new与delete
    ESP32 485温湿压、噪声4合1传感器测试
    python的/ 和// 学习
    Windows中使用Lex(Win flex-bison)
    吃货联盟系统简单实现(对象+数组)
    别看了,这就是你的题呀(四)
    Mysql InnoDB Buffer Pool
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/126757553