SNS对接FCM端点推送通知投递失败及乱序问题求助
SNS 对接 FCM 推送通知投递异常排查求助
我在测试SNS与Firebase Cloud Messaging(FCM)端点的推送通知投递情况时遇到以下问题:
- 应用后台状态:发送10条通知,SNS返回全部发送成功,但应用仅收到2条
- 应用前台状态:发送10条通知,遗漏1条,且收到的通知存在乱序问题
发送通知的脚本如下:
import boto3 import json # 原脚本遗漏该导入,需补充 from datetime import datetime sns_client = boto3.client('sns') def send_message_to_endpoint(endpoint_arn, message): response = sns_client.publish( TargetArn=endpoint_arn, Message=json.dumps(message), MessageStructure='json' ) return response def send_multiple_notifications(endpoint_arn, start_id, num_notifications): for i in range(num_notifications): current_timestamp = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S +00:00") message = { "GCM": json.dumps({ "data": { "sentAt": current_timestamp, "userId": 10, "orgId": 1, "notificationType": "ACCESS_CHANGE_NOTIF", "notificationId": start_id + i } }) } response = send_message_to_endpoint(endpoint_arn, message) print(f"Notification {start_id + i} sent: {response}") endpoint_arn = "application arn" send_multiple_notifications(endpoint_arn, start_id=80, num_notifications=10)
排查思路
1. 核对FCM端投递数据
- 登录Firebase控制台,查看Cloud Messaging的性能报告,对比SNS发送量和FCM实际接收/投递量,定位丢包环节是SNS→FCM还是FCM→设备
- 查看FCM的错误日志,排查是否存在设备令牌失效、请求限流、权限配置错误等问题
2. 调整消息结构与优先级
- 当前仅使用
data字段,Android后台状态下FCM对纯data消息的投递优先级较低,容易被系统拦截。建议添加notification字段或设置高优先级:"GCM": json.dumps({ "notification": { "title": "权限变更通知", "body": "您的权限已更新" }, "data": { # 原data字段内容 }, "priority": "high" }) - 注意:纯
data消息需要客户端自行处理唤醒逻辑,若应用进程被系统回收,可能无法接收
3. 排查SNS侧传输问题
- 检查SNS端点状态,确认Endpoint ARN是否有效,未被禁用
- 开启SNS的投递状态日志,查看每条通知的投递详情,获取FCM返回的错误码或失败原因
- 脚本短时间内批量发送通知可能触发限流,尝试在循环中添加
time.sleep(1)降低发送频率,测试丢包是否缓解
4. 解决通知乱序问题
- FCM不保证消息投递顺序,需在客户端通过
notificationId或sentAt字段自行排序后展示 - 检查客户端消息接收逻辑,是否存在异步处理导致的顺序错乱(如网络延迟使后发消息先到达)
5. 客户端接收逻辑排查
- 前台状态:确认FCM消息接收回调方法实现正确,无逻辑异常导致消息遗漏
- 后台状态:检查设备是否开启省电模式(Android Doze/iOS低电量模式),这类模式会限制后台消息接收,测试关闭省电模式后的投递情况
- 确认客户端FCM SDK版本为最新,旧版本可能存在已知的投递bug
内容的提问来源于stack exchange,提问作者Pallavi Naik
相关产品推荐
相关产品推荐

