当前位置: 首页 > news >正文

同一设备多账号登录,如何避免消息推送“串门”?

对各应用厂商而言,推送通知消息是App提高用户活跃度和转化率的高性价比营销工具。然而,当一个用户设备登录多个账号时,开发者可能会遇到同一条消息在同一设备的不同账号上重复展示的问题,这不仅降低了消息推送的精准度,还可能对用户造成困扰。

为解决这一问题,HarmonyOS SDK推送服务(Push Kit)推出了通知消息账号校验功能。该功能允许开发者根据终端设备上不同账号的属性来推送消息,确保通知精准地发送给对应设备上的对应账号。例如,在华为手机上,某个应用同时登录了账号A和账号B。当账号A切换至账号B后,原本发送给账号A的通知消息在到达设备后将不会展示,从而避免账号B看到账号A的消息。

错误示例:同一设备账号A切换至账号B后,接收并展示账号A的通知消息

若要实现账号校验功能,其关键便在于profileId。profileId是应用内账号id匿名标识,无论用户是选择华为账号作为应用登录账号,还是选择使用应用账号直接登录账号,该profileId都是应用通过账号映射的唯一匿名标识。所以我们需要为待绑定的账号生成一个非空唯一的profileId,这里不建议使用真实的账号id,推荐使用账号id自行生成对应的匿名标识,能与该账号id建立唯一映射关系即可,生成算法无限制。

那么,当用户选择华为账号作为应用登录账号并登录账号A成功后,开发者可调用Push Kit绑定接口bindAppProfileId()将已生成的账号A的profileId绑定到当前设备的应用token上。Push Token标识了每台设备上的每个应用,是Push Kit实现消息推送的前提条件,应用服务器在发送通知消息时token中若携带该账号A的profileId,则只有当前设备登录的华为账号为账号A时,才会展示通知消息;若不携带profileId,则无论当前设备登录的华为账号是否为账号A,都正常展示通知消息。

下面,我们来看一下实现推送服务账号校验功能的具体开发步骤。

开发步骤

  1. 首先,在发送通知消息之前,我们需要先获取Push Token。
    import { pushService } from '@kit.PushKit';import { hilog } from '@kit.PerformanceAnalysisKit';import { BusinessError } from '@kit.BasicServicesKit';import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';export default class EntryAbility extends UIAbility {// 入参 want 与 launchParam 并未使用,为初始化项目时自带参数async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {// 获取Push Tokentry {const pushToken: string = await pushService.getToken();hilog.info(0x0000, 'testTag', 'Succeeded in getting push token');} catch (err) {let e: BusinessError = err as BusinessError;hilog.error(0x0000, 'testTag', 'Failed to get push token: %{public}d %{public}s', e.code, e.message);}// 上报Push Token并上报到您的服务端}}
  1. 为确保应用可正常收到通知消息,建议应用发送通知前调用requestEnableNotification()方法弹出提醒,告知用户需要允许接收通知消息。
    import { notificationManager } from '@kit.NotificationKit';import { BusinessError } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit';import { common } from '@kit.AbilityKit';const TAG: string = '[PublishOperation]';const DOMAIN_NUMBER: number = 0xFF00;let context = this.getUIContext().getHostContext() as common.UIAbilityContext;notificationManager.isNotificationEnabled().then((data: boolean) => {hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data));if(!data){notificationManager.requestEnableNotification(context).then(() => {hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);}).catch((err : BusinessError) => {if(1600004 == err.code){hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);} else {hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);}});}}).catch((err : BusinessError) => {hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);});
  1. 为待绑定的账号生成一个非空唯一的profileId,调用bindAppProfileId()方法,添加当前设备上该用户与应用的关系。
    import { hilog } from '@kit.PerformanceAnalysisKit';import { pushCommon, pushService } from '@kit.PushKit';import { BusinessError } from '@kit.BasicServicesKit';// 定义需要绑定的profileId,建议使用账号id对应的匿名标识const profileId = '1****9';// 绑定应用账号pushService.bindAppProfileId(pushCommon.AppProfileType.PROFILE_TYPE_APPLICATION_ACCOUNT, profileId).then(() => {hilog.info(0x0000, 'testTag', 'Succeeded in binding app profile id');}).catch((err: BusinessError) => {hilog.error(0x0000, 'testTag', 'Failed to bind app profile id: %{public}d %{public}s', err.code, err.message);});
  1. 建议您将Push Token和生成的profileId上报到应用服务端,便于应用服务端向终端推送消息。

  2. 应用服务端调用REST API推送通知消息,通知消息示例如下:

    // Request URLPOST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send// Request HeaderContent-Type: application/jsonAuthorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****push-type: 0// Request Body{"payload": {"notification": {"category": "MARKETING","title": "普通通知标题","body": "普通通知内容","profileId": "111***222","clickAction": {"actionType": 0}}},"target": {"token": ["IQAAAA**********4Tw"]}}

消息发送成功后,Push Kit会先校验绑定账号(华为账号或应用账号)时的AppProfileType。

若绑定华为账号,则先校验下发消息中携带的profileId和之前应用绑定的profileId是否一致,再校验当前登录的华为账号和绑定时登录的分布式账号是否一致,若全部满足则展示消息,否则不展示消息。

若绑定应用账号则校验下发消息中携带的profileId和之前应用绑定的profileId是否一致,若满足则展示消息,否则不展示消息。

了解更多详情>>

访问推送服务联盟官网

获取账号校验功能开发指导文档

http://www.dtcms.com/a/490759.html

相关文章:

  • 【Linux】认识Framebuffer
  • 深圳做网站公司有哪些公司英文购物网站模板下载
  • 力扣热题100道之560和位K的子数组
  • Pixel-Perfect Depth with Semantics-Prompted Diffusion Transformers,nips 2025
  • 网站可以换主机吗做外贸网站 用国外空间 还是 国内空间 区别
  • **SLAM技术:探索现代定位与地图构建的新纪元**在现代科技领域,同步定位与地图构建(SLAM)技术已成为机器人导航和自动驾驶等领
  • 环保教育展厅建设方案-VR垃圾分类体验游戏-垃圾分类拍拍乐
  • 网站空间怎么更换莱芜在线论坛最新消息
  • 龙岩做网站哪家好如何绑定网站域名
  • [Linux系统编程——Lesson14.基础IO:系统文件IO]
  • golang的一些技巧
  • 高性能 Go 语言带 TTL 的内存缓存实现:精确过期、自动刷新、并发安全
  • ML.NET机器学习框架基本流程介绍
  • Day32_【 NLP _2.RNN及其变体 _(2) LSTM】
  • 重庆建站模板代理怎么做p2p网站
  • iis配置网站是什么网站建设方案书阿里云模板
  • 【计算机视觉】SAM 3 技术深潜:从“分割万物”到“理解概念”的范式转移
  • 「深度学习笔记3」概率论深度解析:从不确定性到人工智能的桥梁
  • 齐河专业企业网站建设做网站引流到天猫
  • 技术贴!【谷歌浏览器】实用工具推荐之谷歌浏览器(Google Chrome)离线纯净版完全安装指南:告别广告与捆绑骚扰
  • Centos7 自建Umami-开源免费的网站访问流量统计分析平台
  • 申威架构安装Java 11 RPM包教程:java-11.0.7-swjdk-11u-8.ky10.sw_64.rpm详细安装步骤
  • 【STM32项目开源】基于STM32的人体健康监测系统
  • 一个做礼品的网站国外网站用什么dns
  • 东莞 网站建设网站定制制作公司
  • Python 线程 类比c++【python】
  • 舆情监测的底层逻辑与技术方法探析
  • 谈谈redis的持久化
  • 网站建设进度深圳网站建设制作营销
  • SSM高校学生社团管理系统n4pcu(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。