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

news/2025/10/18 16:27:23/文章来源:https://www.cnblogs.com/HarmonyOSSDK/p/19147200

对各应用厂商而言,推送通知消息是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.mzph.cn/news/938714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强合规行业DevOps选型:告别工具拼凑,找到真正适配的国产化DevOps方案

强合规行业DevOps平台选型需“建体系”,传统开源工具组合易陷数据割裂、合规难达标困境。本文对比三款DevOps产品,其中国产DevOps平台契合信创DevOps需求,内置合规卡点与追溯能力,适配国产化环境,助力企业平衡合规…

实用指南:精读 C++20 设计模式:行为型设计模式——观察者模式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

大疆无人机RTMP推流至LiveNVR实现web页面实时播放与录像回放,并可以转GB28181协议级联推送给上级监控视频管理平台

@目录1、无人机推流转国标2、获取RTMP推流地址2.1、RTMP推流地址格式2.2、推流地址示例2、设备RTMP推流3、配置拉转RTMP3.1、直播流地址格式3.2、直播流地地址示例3.3、通道配置直播流地址4、配置级联到GB28181国标平台…

Character Animator 2025下载安装教程:2D角色动画软件零基础入门,附最新下载安装教程及激活方法

还在找Character Animator 2025怎么下载安装?这份保姆级教程帮你一步到位!不管是做虚拟主播、短视频动画,还是教育课件制作,掌握CH 2025的安装方法是第一步。本文包含详细下载渠道、安装步骤、快捷键及常见问题,看…

2025年彩钢瓦/镀锌板/折弯件/C型钢/Z型钢/压型瓦/楼承板/次檩条厂家推荐排行榜,专业钢结构安装与定制加工实力解析

2025年彩钢瓦/镀锌板/折弯件/C型钢/Z型钢/压型瓦/楼承板/次檩条厂家推荐排行榜,专业钢结构安装与定制加工实力解析随着我国建筑工业化的快速发展,钢结构建筑因其施工周期短、抗震性能好、可回收利用等优势,在工业厂…

2025 年最新金相厂家最新推荐排行榜:涵盖金相磨抛机 / 切割机 / 显微镜 / 抛光机 / 预磨机设备,助力企业精准选择优质品牌

当前材料检测行业持续发展,金相检测作为材料分析核心环节,对石油机械、铁路器材、航空航天等领域的产品质量与安全起着关键作用。随着市场需求升级,金相品牌数量激增,但品牌间技术实力、产品质量和服务水平差距明显…

武汉图核科技

武汉图核科技新的名字 以前的名字是英语单词音译过来的,没有什么具体含义,也不容易看出是做什么的。中国人还是取个中文名好一些,于是想换个名字,要言简意赅,简单好记。不擅长取名,找AI来帮忙:一眼相中了图核科…

maven的概述以及在mac安装部署

maven的概述以及在mac安装部署pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

完整教程:display ospf peer 概念及题目

完整教程:display ospf peer 概念及题目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧

Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");列表_切片赋值_slice_assignment_嫁接 回忆上次…

2025中国开发者必看:主流代码托管平台本土化能力深度测评

2025中国开发者必看:主流代码托管平台本土化能力深度测评 在数字化转型加速推进的当下,代码托管平台已成为软件开发团队不可或缺的基础设施。随着国内开发者群体的快速扩张,对代码托管服务的本土化需求也日益凸显。…

开源数据采集工具 logstash(收集日志)/telegraf(收集指标)

Telegraf 是一个用 Go 编写的代理程序,是收集和报告指标和数据的代理。可收集系统和服务的统计数据,并写入到 InfluxDB 数据库。Telegraf 具有内存占用小的特点,通过插件系统开发人员可轻松添加支持其他服务的扩展。…

2025年粉末冶金制品厂家推荐排行榜,粉末冶金零件,金属注射成形,结构件,齿轮,轴承公司最新精选

2025年粉末冶金制品厂家推荐排行榜:粉末冶金零件、金属注射成形、结构件、齿轮、轴承公司最新精选行业背景与发展趋势粉末冶金技术作为现代制造业的核心工艺之一,在汽车、家电、机械装备等领域发挥着越来越重要的作用…

多模态大语言模型LISA - 详解

多模态大语言模型LISA - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

2025 年升降平台车厂家最新推荐口碑排行榜:覆盖多类型产品,聚焦实力厂家,为企业选购提供权威参考剪叉式/手动液压/电动液压升降平台车厂家推荐

在工业生产、仓储物流等领域,升降平台车是不可或缺的关键设备,其质量与性能直接关系到企业运营效率与生产安全。当前市场上,升降平台车品牌繁杂,部分厂家技术落后、工艺不规范、售后不完善,导致企业选购时面临诸多…

供应商图纸协同是什么?主要有哪几个核心原则?

供应商图纸协同是确保制造业供应链高效运作的基础。它不仅涉及图纸和数据的安全传递,也需要关注信息的准确性和及时性。企业通过建立数字平台,可以统一管理图纸及相关文件,加快信息流转。这一过程强调了沟通的重要性…

「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)

「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)如果您需要支持Java EE 5中引入的简化基于注释的POJO编程模型,那么EJB开发工具就是您的正确选择。在此您将了解到:EJB开发工具和EJB项目 持久性支持和EJB项目…

2025 年堆高车厂家最新推荐排行榜:聚焦专利技术、华为等大牌合作案例及国内优质品牌解析手动液压/手动液压/卷筒/油桶堆高车厂家推荐

当前,仓储物流与生产制造行业对堆高车的需求持续攀升,但其市场供给呈现 “质量参差、选型复杂” 的态势。一方面,部分厂家缺乏核心技术,产品故障率高、维护成本高,难以适配高强度作业;另一方面,企业采购时易受低…

chromadb的使用

chromadb的使用from chromadb.config import Settings from chromadb.utils import embedding_functions import os import chromadb # 设置 Chroma 配置 persist_directory = "database" if not os.path.ex…

TResult Funcin T, out TResult的应用

TResult Func<in T, out TResult>的应用在 C# 中,Func<bool, string>是一个委托类型,表示一个接受 bool类型参数并返回 string类型的方法。 // 声明 Func<bool, string> 变量 Func<bool, strin…