推送通知优化
场景
推送到达率低(< 70%),部分用户收不到通知,需要提升送达率。
排查与方案
1. 推送不到的原因
| 原因 | 占比 | 解决 |
|---|---|---|
| 系统杀后台进程 | 30% | 厂商推送通道 |
| 用户关闭通知权限 | 25% | 引导开启 + 应用内降级 |
| 网络不通 | 15% | 离线消息补发 |
| 长连接断开 | 20% | 厂商通道 + 心跳保活 |
| Token 过期 | 10% | 定期刷新 Token |
2. 多通道策略
// 统一推送注册 — 按厂商选择通道
object PushManager {
fun register(context: Context) {
when {
isHuaweiDevice() -> HmsPushManager.register(context)
isXiaomiDevice() -> MiPushManager.register(context)
isOppoDevice() -> OppoPushManager.register(context)
hasGooglePlay(context) -> FirebaseMessaging.getInstance().token
else -> SelfPushManager.connect(context) // 自建长连接兜底
}
}
}
3. 通知体验优化
| 优化 | 说明 |
|---|---|
| 通知渠道分组 | 按类型创建 NotificationChannel,用户可分别控制 |
| 大图 / 富文本 | BigPictureStyle、BigTextStyle |
| 点击跳转 | PendingIntent 带 Deep Link,直达目标页 |
| 消息去重 | 服务端消息 ID 去重,避免重复展示 |
| 静默推送 | data 消息不弹通知,App 内处理 |
val channel = NotificationChannel(
"chat_messages",
"聊天消息",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "新消息通知"
enableVibration(true)
}
notificationManager.createNotificationChannel(channel)
面试答题要点
- 国内必须接入厂商推送通道(系统级,不被杀)
- 海外用 FCM,国内用华为/小米/OPPO 等厂商通道
- 通知权限引导和降级方案
- NotificationChannel 分组管理(Android 8.0+)