一、消息免打扰功能设计
1. 用户自主控制
- 开关入口:在「我的-设置-消息通知」中提供「免打扰模式」总开关,支持按时间段(如22:00-8:00)或全天开启。
- 分类管理:允许用户单独关闭促销、订单状态、社区互动等类别的消息,避免“一刀切”影响核心功能体验。
- 临时关闭:支持长按消息弹窗快速关闭当前会话通知(如客服对话)。
2. 智能场景化
- 地理位置触发:当用户离开常用收货地址范围时,自动减少非紧急消息推送(如附近门店活动)。
- 行为学习:通过用户操作习惯(如频繁关闭某类消息)智能推荐免打扰策略。
3. 用户体验优化
- 静音提示:免打扰期间,App图标角标仍显示未读数,但无声音/震动提醒。
- 紧急消息穿透:允许用户设置特定关键词(如“订单异常”“缺货通知”)突破免打扰限制。
二、万象源码部署的隐私合规实现
1. 数据最小化原则
- 消息偏好存储:仅在本地存储用户的免打扰时段和分类选择,不向服务器上传详细行为日志。
- 匿名化处理:若需分析用户消息偏好,对设备ID、IP等标识符进行哈希脱敏。
2. 权限透明化
- 动态权限申请:在首次开启免打扰时,明确告知用户“需访问系统通知权限以实现功能”,并提供跳过选项。
- 权限回收入口:在设置中单独列出“消息权限管理”,支持一键关闭App的通知权限。
3. 源码级隐私保护
- 加密通信:用户免打扰设置通过HTTPS+TLS 1.3加密传输,防止中间人攻击。
- 审计日志:在源码中嵌入日志模块,记录免打扰设置的变更操作(仅限内部调试,不存储用户数据)。
三、技术实现示例(基于万象开源框架)
```javascript
// 1. 前端免打扰设置界面(React Native示例)
const NotificationSettings = () => {
const [isDndEnabled, setIsDndEnabled] = useState(false);
const [dndStartTime, setDndStartTime] = useState(22:00);
const [dndEndTime, setDndEndTime] = useState(08:00);
const saveSettings = async () => {
// 仅存储本地,不上传服务器
await AsyncStorage.setItem(@dnd_settings, JSON.stringify({
isDndEnabled,
dndStartTime,
dndEndTime
}));
// 调用系统API更新通知策略
if (Platform.OS === android) {
Notifications.setNotificationChannel(...);
}
};
return (
{
setDndStartTime(start);
setDndEndTime(end);
}} />
);
};
// 2. 后端消息推送逻辑(Node.js示例)
app.post(/api/push-message, async (req, res) => {
const { userId, messageType, content } = req.body;
// 检查用户免打扰设置(从本地缓存或轻量级数据库读取)
const dndSettings = await getLocalDndSettings(userId);
if (dndSettings.isDndEnabled && isNowInDndPeriod(dndSettings)) {
return res.status(200).json({ message: "消息已静默处理" });
}
// 正常推送逻辑
await sendPushNotification(userId, messageType, content);
res.status(200).json({ message: "推送成功" });
});
```
四、合规与用户体验平衡
1. 隐私政策声明
- 在App隐私政策中明确说明消息设置的数据处理方式,强调“用户控制优先”。
- 提供「数据删除」入口,允许用户一键清除所有消息偏好记录。
2. A/B测试优化
- 通过灰度发布测试不同免打扰策略对用户活跃度的影响,避免过度静默导致用户流失。
3. 应急通道
- 保留「紧急通知」类别(如订单配送延迟),此类消息不受免打扰设置影响,但需限制频率。
五、部署建议
- 开源审计:若使用万象开源代码,需审查其消息推送模块是否默认收集用户行为数据,必要时修改源码。
- 沙盒环境测试:在部署前模拟不同用户设置组合,确保逻辑无漏洞。
通过上述设计,生鲜App可在尊重用户选择的同时,保障核心业务通知的触达率,实现功能与隐私的平衡。