Firebase Functions发送FCM成功,但Unity端onMessageReceived未调用
问题排查与解决方案
针对Firebase Functions日志确认消息发送成功,但Unity客户端OnMessageReceived未触发的问题,结合你的业务场景与代码,可按以下步骤排查修复:
1. 确认主题订阅与发送的一致性
检查Unity客户端订阅的主题字符串和Functions中发送的主题字符串完全匹配:
- Unity中
SubscribeAsyncGeoLocation方法将geoLocation的+替换为_后订阅,Functions中同样对geoLocation做了替换并发送到/topics/${geoLocation}。 - 对比双方日志输出的
geoLocation值,确保无大小写、额外空格或特殊字符处理差异。
2. 配置前台消息接收逻辑
当Unity应用处于前台时,FCM的notification类型消息默认不会触发OnMessageReceived回调,需显式配置前台展示选项:
在Firebase初始化成功后添加以下代码:
// 配置前台通知展示规则,确保回调能触发 FirebaseMessaging.MessageReceivedForegroundNotificationPresentationOptions = ForegroundNotificationPresentationOptions.Alert | ForegroundNotificationPresentationOptions.Badge | ForegroundNotificationPresentationOptions.Sound;
同时补充平台配置:
- Android:确保AndroidManifest中已配置FCM所需的权限与服务组件
- iOS:在Xcode中开启推送权限,并在Unity Player Settings中勾选
Remote Notification Enabled
3. 确保Firebase初始化在主线程执行
Unity的ContinueWith默认在后台线程执行,事件绑定需在主线程完成,修改Start方法的初始化逻辑:
private void Start() { FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => { var dependencyStatus = task.Result; if (dependencyStatus == DependencyStatus.Available) { FirebaseMessaging.TokenRegistrationOnInitEnabled = true; FirebaseMessaging.TokenReceived += OnTokenReceived; FirebaseMessaging.MessageReceived += OnMessageReceived; // 新增前台通知配置 FirebaseMessaging.MessageReceivedForegroundNotificationPresentationOptions = ForegroundNotificationPresentationOptions.Alert | ForegroundNotificationPresentationOptions.Badge | ForegroundNotificationPresentationOptions.Sound; } else { Debug.LogError($"Firebase 초기화 실패: {dependencyStatus}"); } }); }
注:需确保Unity项目已导入
Firebase.Unity.Editor包以使用ContinueWithOnMainThread方法
4. 验证FCM令牌与主题关联有效性
- 确认
OnTokenReceived回调正常触发,客户端已获取有效的FCM令牌 - 在Firebase控制台的云消息传递模块中,手动发送测试消息到目标主题:
- 若手动发送能收到,说明Functions的主题字符串拼接可能存在隐藏错误
- 若手动发送也收不到,说明客户端订阅流程或FCM基础配置存在问题
5. 检查SDK版本兼容性
确保Unity的Firebase Messaging SDK与Firebase Functions的Admin SDK版本兼容,建议升级至双方最新稳定版:
- Unity Firebase SDK:通过Package Manager更新
- Firebase Admin SDK:在Functions项目目录执行
npm update firebase-admin
6. 排查消息Payload潜在问题
- Android端:
click_action字段需要在AndroidManifest中配置对应的<intent-filter>,否则可能影响消息正常处理(即使不影响接收,也会导致点击跳转失效) - 确保Payload的
title、body等字段不包含FCM规范外的特殊字符
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

