当前位置: 首页 > 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,都正常展示通知消息。

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

开发步骤

    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.hskmm.com/?act=detail&tid=32797

相关文章:

  • 强合规行业DevOps选型:告别工具拼凑,找到真正适配的国产化DevOps方案
  • 大疆无人机RTMP推流至LiveNVR实现web页面实时播放与录像回放,并可以转GB28181协议级联推送给上级监控视频管理平台
  • Character Animator 2025下载安装教程:2D角色动画软件零基础入门,附最新下载安装教程及激活方法
  • 2025年彩钢瓦/镀锌板/折弯件/C型钢/Z型钢/压型瓦/楼承板/次檩条厂家推荐排行榜,专业钢结构安装与定制加工实力解析
  • 2025 年最新金相厂家最新推荐排行榜:涵盖金相磨抛机 / 切割机 / 显微镜 / 抛光机 / 预磨机设备,助力企业精准选择优质品牌
  • 武汉图核科技
  • 完整教程:display ospf peer 概念及题目
  • 2025中国开发者必看:主流代码托管平台本土化能力深度测评
  • 开源数据采集工具 logstash(收集日志)/telegraf(收集指标)
  • 2025年粉末冶金制品厂家推荐排行榜,粉末冶金零件,金属注射成形,结构件,齿轮,轴承公司最新精选
  • 2025 年升降平台车厂家最新推荐口碑排行榜:覆盖多类型产品,聚焦实力厂家,为企业选购提供权威参考剪叉式/手动液压/电动液压升降平台车厂家推荐
  • 供应商图纸协同是什么?主要有哪几个核心原则?
  • 2025 年堆高车厂家最新推荐排行榜:聚焦专利技术、华为等大牌合作案例及国内优质品牌解析手动液压/手动液压/卷筒/油桶堆高车厂家推荐
  • 2025 年最新推荐!编码器源头厂家排行榜:聚焦无磁 / 光学 / 脉冲等多类型产品,精选行业优质企业
  • Excelize 开源基础库发布 2.10.0 版本更新
  • 高效搞定outlook大附件怎么发送的方法与技巧
  • 2025年点胶机厂家权威推荐榜:精密点胶设备、自动化点胶系统、桌面点胶机源头厂家综合实力解析
  • HAP 签名提取:从定位到解析的实操指南
  • 深入解析:Redis List 类型全解析
  • 内外网文件传输工具有哪些?最强合集在这里
  • 汇川伺服常用参
  • IC 测试革新
  • 2025 年自动售卖机厂家最新推荐榜单:智能 / 无人 / 文创 / 盲盒 / 食品全品类优选,高性价比品牌选购指南
  • 使用SecureCRT从linux上传下载文件方法
  • 2025年保洁公司权威推荐榜:苏州/昆山驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁全方位解析
  • Content Hub接口文档
  • 2025年防水织带/鞋垫/编织包/松紧带/鞋带/织带/飞织鞋面厂家最新推荐榜单:专业工艺与创新设计深度解析
  • 2025年方钢/扁钢/圆钢/光轴/六角钢/异型钢/冷拉冷拔钢/热轧钢厂家最新权威推荐榜:Q355B/Q345B/16Mn/45#/40Cr/A3/Q235B钢材实力解析
  • NVIDIA Jetson TX2 边缘盒子运行姿态检测模型记录
  • 2025年电源适配器厂家权威推荐榜:笔记本适配器/工业电源/充电器厂家实力与市场口碑深度解析