免打扰多端同步与冲突
单会话级别与会话类型级别是服务端状态,多端共享。理解同步语义可以避免“手机上静音了,电脑还在弹”的问题。
同步语义
| 动作 | 本端 | 其它端 |
|---|---|---|
| 设置单会话级别 | 立即更新本地读模型 | 收到 `CONVERSATION` 事件,刷新该会话 `notificationLevel` |
| 设置类型级别 | 立即生效于该类型所有会话 | 下次拉取会话列表 / 收到会话事件时刷新 |
| 新消息到达 | 按当前级别决定是否提醒 | 各端独立判断(都读同一份服务端设置) |
| 离线期间修改 | 连接后拉取会话列表得到最新级别 | 以服务端为准 |
冲突处理
- 同一会话两端几乎同时修改:服务端以最后一次写入为准,另一端收到事件后覆盖本地值(不要做“本地优先”合并)。
- 修改失败(网络错误)时回滚乐观更新,并提示用户重试。
- 类型级别与单会话级别同时存在时,单会话优先;不要把类型设置复制到每个会话。
- 本地缓存的级别只用于离线展示,连接恢复后必须刷新。
测试建议
Shell
# 双端登录同一账号(两台设备 / 模拟器 + 真机)
# 1) A 端把群 g_1001 设为免打扰
# 2) B 端等待 CONVERSATION 事件,检查会话 notificationLevel=2 且无红点
# 3) B 端恢复提醒,A 端同步恢复
# 4) 断网修改 → 恢复网络 → 两端以服务端为准收敛