ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

免打扰为什么还能收到消息?接收、提及例外与系统通知条件

免打扰为什么还能收到消息?接收、提及例外与系统通知条件 开启免打扰后没有听见提示声是消息没有收到还是提醒被减少了群里有人 自己时又该怎样理解这项设置如果把“没有提示声”直接判成“消息接收失败”排查会跑到网络链路如果把群内提及理解成无条件响铃又会忽略系统通知许可。本文分别处理消息到达、提醒决策与系统呈现用一个独立 JavaScript 函数检查这两种误判。作为功能背景米米商聊的产品方手机端说明确认免打扰影响提醒不阻止消息接收群内提及存在提醒例外。本文仅采用这些已确认事实接下来的字段、优先级与情境数据为独立教学模型不是产品源码或实际推送架构。文章与配图使用 AI 辅助示例另做独立验证。1. 先区分消息接收与提醒方式目前资料支持以下描述功能事实需要保留的边界免打扰主要调整提醒方式消息仍正常接收不能把这项设置解释为阻止接收消息群内 提醒存在例外不能承诺开启后任何情况都没有提醒聊天可以置顶置顶是查找与展示安排不应直接等同于提醒强度“消息仍正常接收”描述的是免打扰设置的作用不是断网、进程退出或后台受限时仍然实时送达的承诺。本文也不把未读红点、未读数字等具体样式作为功能结论。它们需要结合当前客户端与版本核对不能仅凭某种样式没有出现就判断“消息没收到”。桌面端的完整免打扰流程本轮没有对应的逐项实测资料不直接套用手机操作步骤。2. 消息与提醒至少有三种状态对类似聊天产品进行设计时可以把一个事件拆成以下问题消息是否已经进入客户端的数据处理流程应用根据会话偏好与提及规则是否准备请求提醒系统是否允许并实际呈现这次通知这三个问题不应只用一个success表示。例如消息已经进入会话应用选择不请求系统通知是一个明确的提醒策略结果它不等于消息数据处理失败。应用请求了通知也不等于系统一定已经呈现更不等于用户已经看见或理解了内容。图通用设计模型。提醒请求被抑制不代表已到达的消息从会话中消失不是 App 实际界面或内部链路。对日志、测试和反馈材料而言记录“收到事件”“规则决定”“系统请求结果”通常比只记录“通知成功/失败”更有解释力。具体日志字段如何设计仍应根据实际系统决定本文不将示例字段说成产品已有能力。3. 用独立函数表达提醒优先级下面只处理已经交给客户端的消息事件返回是否建议请求一次系统通知不发送通知也不处理消息网络接收。示例选择以下规则本人发送、会话不匹配、已经提醒过、当前会话可见时不额外请求系统通知系统通知条件不允许时不请求免打扰抑制普通消息但可通过mentionOverride显式决定是否保留对本人提及的例外。其中“当前会话可见时不额外请求”是本文选择的示例策略不代表产品现有行为。mentionOverride同样是讲解用配置产品中具体的 处理应以当前客户端规则为准。functionvalidId(value){returntypeofvaluestringvalue.length0valuevalue.trim();}functionnotificationPlan(message,preferences,environment){constnoreason({requestSystemNotice:false,reason});if(!message||!preferences||!environment)returnno(invalid-input);constids[message.id,message.senderId,message.conversationId,preferences.currentUserId,preferences.conversationId];if(!ids.every(validId))returnno(invalid-input);if(!Array.isArray(message.mentionedIds)||![...message.mentionedIds].every(validId))returnno(invalid-input);constflags[preferences.dnd,preferences.mentionOverride,environment.systemAllowed,environment.conversationVisible,environment.alreadyNotified];if(!flags.every(valuetypeofvalueboolean))returnno(invalid-input);if(message.conversationId!preferences.conversationId)returnno(wrong-conversation);if(message.senderIdpreferences.currentUserId)returnno(self-message);if(environment.alreadyNotified)returnno(already-notified);if(environment.conversationVisible)returnno(conversation-visible);if(!environment.systemAllowed)returnno(system-not-allowed);constmentionsMemessage.mentionedIds.includes(preferences.currentUserId);constexceptionmentionsMepreferences.mentionOverride;if(preferences.dnd!exception)returnno(conversation-dnd);return{requestSystemNotice:true,reason:preferences.dnd?mention-exception:regular-message};}这里保留reason让排查能够找到具体条件。以已到达、他人发送、会话匹配、当前会话不可见且尚未提醒的消息为例模型会给出不同结果会话免打扰对本人提及系统条件允许示例结果与原因开启否是不请求conversation-dnd开启是且启用例外是请求mention-exception开启是且启用例外否不请求system-not-allowed这三行使用同一条已到达消息的假设提醒决定不同消息是否已经到达并没有因此改变。提及例外也不会绕过系统条件。单个false无法解释是会话偏好还是系统条件导致不请求。mentionedIds用账号标识表达提及对象不通过正文中的“某个昵称”字符串判断。模型希望避免把引用文字或同名昵称直接当成一次有效提及实际产品如何解析提及对象仍需要其真实协议与实现资料。alreadyNotified是调用方提供的状态函数没有维护去重记录。工程接入时需要明确它代表哪一个动作已经完成以及失败重试怎样处理不能把“消息已接收”直接写成“提醒已完成”。4. 系统通知条件应由平台适配层提供应用内会话偏好和系统通知许可属于不同来源的条件。例如在支持的 Web 环境中Notification.permission有granted、denied、default三种状态不能把尚未授权的default当成允许。MDNNotification.permissionAndroid 官方文档也说明了 Android 13 起的通知运行时权限及相关适用情形。Android通知运行时权限两种平台的接口并不相同。本文函数中的systemAllowed是为了让模型保持独立而使用的布尔输入实际接入应由对应平台适配层计算不据此判断功能背景中的产品使用了 Web Notification API。即使条件允许函数返回true也只是建议提出请求。展示、声音和失败处理应由真实平台调用结果与对应设置决定不能把纯函数测试当作系统通知呈现测试。5. 用明确预期检查普通消息与例外将下段代码接在前一段后可以直接用 Node.js 运行。测试使用虚构账号和会话标识不读取真实聊天内容。constassertrequire(node:assert/strict);constMextra({id:m1,senderId:peer,conversationId:room,mentionedIds:[],...extra});constPextra({currentUserId:me,conversationId:room,dnd:false,mentionOverride:true,...extra});constEextra({systemAllowed:true,conversationVisible:false,alreadyNotified:false,...extra});constcases[[普通消息,M(),P(),E(),true,regular-message],[免打扰普通消息,M(),P({dnd:true}),E(),false,conversation-dnd],[对本人提及例外,M({mentionedIds:[me]}),P({dnd:true}),E(),true,mention-exception],[提及其他人,M({mentionedIds:[other]}),P({dnd:true}),E(),false,conversation-dnd],[例外未启用,M({mentionedIds:[me]}),P({dnd:true,mentionOverride:false}),E(),false,conversation-dnd],[系统条件不允许,M(),P(),E({systemAllowed:false}),false,system-not-allowed],[提及不绕过系统条件,M({mentionedIds:[me]}),P({dnd:true}),E({systemAllowed:false}),false,system-not-allowed],[当前会话可见,M(),P(),E({conversationVisible:true}),false,conversation-visible],[提及不改变可见会话策略,M({mentionedIds:[me]}),P({dnd:true}),E({conversationVisible:true}),false,conversation-visible],[本人发送,M({senderId:me}),P(),E(),false,self-message],[会话不匹配,M({conversationId:other-room}),P(),E(),false,wrong-conversation],[已经提醒过,M(),P(),E({alreadyNotified:true}),false,already-notified],[字符串不是布尔配置,M(),P({dnd:false}),E(),false,invalid-input],[缺少有效用户ID,M(),P({currentUserId:}),E(),false,invalid-input],[正文文字不是结构化提及,M({body:me}),P({dnd:true}),E(),false,conversation-dnd]];for(const[name,message,prefs,env,allowed,reason]ofcases){assert.deepEqual(notificationPlan(message,prefs,env),{requestSystemNotice:allowed,reason},name);}for(const[,message,prefs,env]ofcases){assert.deepEqual(notificationPlan(message,{...prefs,pinned:true},env),notificationPlan(message,{...prefs,pinned:false},env),置顶不改变本模型提醒策略);}constinputs[M({mentionedIds:[me]}),P({dnd:true}),E()];constbeforeJSON.stringify(inputs);notificationPlan(...inputs);assert.equal(JSON.stringify(inputs),before,不改写输入对象);console.log(17组检查通过);本次在 Node.js v24.19.0 实际运行了文章中的两个代码块15组明确预期样例、置顶不变性和输入不被改写两组检查全部通过。范围是独立函数不包含产品客户端、真实消息服务或系统通知 API 的集成测试。6. 实际验收怎样避免判断错对象对类似聊天系统做验收时适合分别记录以下观察结果观察项可以回答什么问题会话中是否出现目标消息已到达事件是否进入对应界面的处理流程规则返回的结果与原因哪一个提醒条件在起作用系统通知请求的实际结果请求是否被平台接受或失败用户是否打开并查看内容不能只凭发出提醒就推断用户已看见这些是验收建议不是当前客户端日志或回执功能的清单。收到事件、提出提醒、系统呈现与人的实际阅读分别是什么状态应按真实材料说明。回到开头的问题会话中已有目标消息而没有提示声应先检查提醒规则与平台条件会话中没有消息则还需要检查接收与数据处理不能仅凭免打扰设置定位原因。群内提及可以成为应用策略的例外但不会证明系统一定已呈现通知。把接收、决策、请求和呈现分开记录才能让“没有响”成为可以继续排查的问题。参考资料MDNNotification.permissionWeb通知许可的三个状态未知决定按拒绝处理。Android DevelopersNotification runtime permissionAndroid通知运行时权限与适用边界。功能背景采用产品方提供的手机端说明示例策略和通知平台文档不作为产品内部实现证据。
返回列表