前言
本文基于实际项目中的 APP 通知技术方案总结而成,内容涵盖在线通知与离线通知的实现原理、消息流转流程以及推荐的技术选型,适用于 Flutter 开发团队参考。
APP 通知是移动应用最基础的功能之一,但要做到稳定可靠、覆盖全面,却涉及不少技术细节。本文将从实战角度梳理通知的完整技术方案。
一、什么是在线通知与离线通知?
在线通知
满足以下任一条件时,APP 处于"在线"状态,可以收到在线通知:
- 应用正在前台运行
- 应用没有完全退出后台,且手机正在充电
在线通知走的是 应用进程,消息直接在 APP 内部流转,延迟低、可控性强。
离线通知
离线通知可以在 APP 任何状态 下收到,包括:
- APP 被系统杀死
- 手机处于锁屏状态
- 应用完全退出
不过离线通知有 推送次数限制,通常每天 10~100 条。如果需要不限次数的推送,需要额外申请。
离线通知走的是 系统进程,通过手机厂商的推送渠道送达。
二、消息流程详解
在线通知消息流
后台创建消息(表单/触发器)
↓
消息队列
↓
APP 监听消息队列 → 拉取最新消息 → 显示通知
- 后台通过表单或触发器方式创建消息
- 消息被投递到消息队列
- APP 在前台运行时持续监听消息队列
- 有新的消息到达时,APP 拉取并显示通知
离线通知消息流
后台创建消息(表单/触发器)
↓
推送系统(EngageLab 等)
↓
手机渠道(APNs / FCM / 华为 / 小米 / OPPO / VIVO)
↓
手机系统拉取消息 → 显示通知
离线通知多了一个关键环节——推送系统。为什么需要它?下文会详细说明。
三、为什么需要推送系统?
推送系统在整个离线通知链路中扮演着 消息中转站 的角色,它的核心价值是:
- 屏蔽手机厂商差异 — 国内外手机厂商的推送接口各不相同,推送系统提供统一 API
- 降低接入成本 — 开发者只需对接推送系统一套接口,即可覆盖所有手机渠道
- 消息管理 — 提供消息状态追踪、推送统计、失败重试等能力
常见的手机推送渠道
| 地区 | 推送渠道 | 说明 |
|---|---|---|
| 国外 | Apple APNs | iOS 设备推送 |
| 国外 | Google FCM | Android 设备推送(Google 服务) |
| 中国大陆 | 华为推送 | 华为手机 |
| 中国大陆 | 小米推送 | 小米/Redmi 手机 |
| 中国大陆 | OPPO 推送 | OPPO/一加手机 |
| 中国大陆 | VIVO 推送 | VIVO/iQOO 手机 |
特别说明:中国大陆的安卓手机出厂不包含 Google 服务,因此没有 FCM。头部手机厂商都推出了自己的推送渠道,需要在各自的应用开发者后台申请开通。
四、技术方案选型
在线通知:flutter_local_notifications
对于 Flutter 开发的 APP,推荐使用 flutter_local_notifications 库实现在线通知功能。
- 开发语言:Flutter / Dart
- 费用:免费
- 功能:支持在 APP 内显示本地通知,包括自定义样式、按钮操作等
离线通知:EngageLab 推送系统
对于需要同时覆盖国内和海外用户的场景,推荐使用 EngageLab 推送系统。
- 集成方式:推送系统封装了各手机厂商的 SDK,提供统一接口
- 费用:按日活跃用户(DAU)付费
- 定价:每 1 万 DAU 约 3,588 美元/年
- 推送限制:不限消息推送数量
五、方案对比总结
| 维度 | 在线通知 | 离线通知 |
|---|---|---|
| 进程 | 应用进程 | 系统进程 |
| 触发条件 | APP 前台/未全退+充电 | 任意状态 |
| 推送限制 | 无限制 | 每天 10~100 条(可申请扩容) |
| 延迟 | 低(应用内直达) | 中(依赖推送系统+手机渠道) |
| 推荐方案 | flutter_local_notifications | EngageLab 推送系统 |
| 费用 | 免费 | 按 DAU 付费 |
六、注意事项
- 权限申请 — 各手机厂商的推送渠道需要在对应开发者后台申请
- 合规要求 — 国内推送需要遵循《APP 个人信息保护管理规定》,在用户同意隐私协议后才能启用推送
- 电量优化 — 频繁的在线通知轮询会影响续航,建议结合 WebSocket 长连接降低功耗
- 离线配额 — 合理规划离线通知的使用场景,避免浪费有限的推送配额
- 多端统一 — 如果同时有 APP 和 Web 端,建议后端消息系统设计时做好统一的消息模型
结语
APP 通知看似简单,实则涉及在线/离线两条链路、多个手机厂商适配、推送系统的选型等技术决策。希望本文的方案总结能对你有所帮助。
如果你有更好的实践经验,欢迎在评论区交流讨论。