一、主流推送方案对比
方案 | 到达率 | 系统资源占用 | 国内支持 | 海外支持 | 特色功能 |
---|---|---|---|---|---|
Firebase Cloud Messaging (FCM) | 90-95% | 低 | 不可用 | 完美支持 | 多平台统一推送 |
极光推送 | 85-90% | 中 | 优秀 | 部分支持 | 厂商通道集成 |
华为Push Kit | 98%+ | 低 | 仅华为 | 华为设备 | 系统级通道 |
小米推送 | 95%+ | 低 | 仅小米 | 无 | 自研长连接 |
个推 | 80-85% | 中高 | 优秀 | 无 | 大数据标签 |
WebSocket自建 | 70-80% | 高 | 依赖实现 | 依赖实现 | 完全可控 |
二、技术选型决策矩阵
1. 关键考量因素
graph TD
A[推送方案选择] --> B{目标市场}
B -->|国内| C[厂商通道集成]
B -->|海外| D[FCM优先]
A --> E{设备覆盖}
E -->|华为设备多| F[华为Push Kit]
E -->|小米设备多| G[小米推送]
A --> H{功能需求}
H -->|精准营销| I[个推/极光]
H -->|即时通讯| J[自建WebSocket]
2. 推荐组合方案
-
国内全机型覆盖:极光/个推 + 厂商通道(华为/小米/OPPO等)
-
海外市场:FCM + 极光海外版
-
IM即时通讯:自建WebSocket + FCM保活
三、极光推送集成详解
1. 基础集成步骤
// build.gradle
implementation 'cn.jiguang.sdk:jpush:4.8.5' // 核心库
implementation 'cn.jiguang.sdk:jcore:3.3.8' // 基础组件
// 华为通道额外集成
implementation 'cn.jiguang.sdk.plugin:huawei:4.8.5'
2. 初始化配置
// Application中初始化
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
JPushInterface.setDebugMode(BuildConfig.DEBUG);
JPushInterface.init(this);
// 注册厂商通道
JPushInterface.registerXiaomi(this, "MI_APPID", "MI_APPKEY");
JPushInterface.registerHuawei(this);
}
}
3. 厂商通道特殊处理
<!-- 华为推送必须配置 -->
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="appid=您的APPID" />
<!-- 小米推送需要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
四、FCM集成关键点
1. 国内设备保活策略
class MyFirebaseService : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage) {
if (isMainlandChina()) {
// 国内设备通过极光二次转发
JPushInterface.sendNotification(this, convertToLocalMsg(remoteMessage))
} else {
// 海外直接处理FCM消息
handleNormalMessage(remoteMessage)
}
}
}
2. 令牌同步机制
// 确保FCM Token同步到自有服务器
override fun onNewToken(token: String) {
RetrofitClient.updatePushToken(
userId = getUserId(),
fcmToken = token,
jpushId = JPushInterface.getRegistrationID(this)
)
}
五、高级功能实现
1. 智能通道切换
fun sendPushNotification(user: User, message: PushMessage) {
when {
user.isHuaweiDevice -> HuaweiPushClient.send(message)
user.isOverseas -> FCMClient.send(message)
else -> JPushClient.send(message)
}
}
2. 推送到达率监控
sequenceDiagram
App->>Server: 消息接收回执(MSG_ID)
Server->>Database: 记录到达时间
Database->>Analytics: 生成统计报表
Analytics->>Admin: 展示各通道到达率
六、深度应答
架构设计问题:
Q:"如何设计一个高到达率的推送系统?"
推荐回答结构:
-
通道分层:
-
第一层:厂商系统通道(华为/小米)
-
第二层:FCM/极光等第三方通道
-
第三层:TCP长连接保活
-
-
智能路由:
public void routePush(PushMessage msg) { if (device.isHuawei && !msg.isHighPriority) { huaweiChannel.send(msg); } else if (device.hasFCM && isOverseas) { fcmChannel.send(msg); } else { tcpConnection.send(msg); } }
-
补偿机制:
-
本地消息队列持久化
-
状态检测重发(基于ACK机制)
-
离线消息合并
-
性能优化问题:
Q:"推送服务如何降低电量和流量消耗?"
解决方案:
-
心跳优化:
-
自适应心跳间隔(从15分钟到6小时动态调整)
-
基于网络状态的差异化策略(Wi-Fi vs 蜂窝数据)
-
-
数据压缩:
fun compressPayload(data: String): ByteArray { return GZIPOutputStream(ByteArrayOutputStream()) .apply { write(data.toByteArray()) } .toByteArray() }
-
批量处理:
-
多条通知合并发送
-
重要程度分级(延迟非紧急消息)
-
数据对比建议:
-
准备实际数据:"在我们电商APP中,通过厂商通道集成使华为设备到达率从82%提升至98%"
-
技术决策依据:"选择极光是因为其支持11家国内厂商通道自动切换"