Unity项目安卓端FirebaseMessaging.TokenReceived事件未触发问题
可能遗漏的配置和修正方案
- Firebase初始化顺序错误
你当前的代码直接在Start方法中注册FCM事件,没有等待Firebase依赖初始化完成,这是最常见的回调不触发原因。需要先完成Firebase依赖检查,再注册事件、执行FCM相关操作,参考修正代码:
public class FCM : MonoBehaviour { public TextMeshProUGUI text; void Start() { // 先完成Firebase依赖检查 Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => { var dependencyStatus = task.Result; if (dependencyStatus == Firebase.DependencyStatus.Available) { // 初始化完成后再注册事件 Firebase.Messaging.FirebaseMessaging.TokenReceived += TokenReceived; Firebase.Messaging.FirebaseMessaging.MessageReceived += MessageReceived; } else { Debug.LogError("Firebase依赖不可用: " + dependencyStatus); } }); } public void MessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) { Debug.Log("Message received: " + e.Message); } public void TokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs e) { Debug.Log("Token received: "+ e.Token); text.text = "received a token"; } }
安卓通知权限未申请
Android 13(API等级33)及以上系统要求应用主动申请POST_NOTIFICATIONS运行时权限,没有该权限时FCM不会生成Token,自然无法触发回调,需要在应用启动时主动申请该权限。Token触发场景限制
TokenReceived事件仅在首次安装应用生成Token、Token到期刷新、应用卸载重装这几个场景触发,正常冷启动如果本地已有有效Token不会触发该事件。可以主动调用Firebase.Messaging.FirebaseMessaging.GetTokenAsync()接口直接获取当前Token,不需要依赖事件触发,可靠性更高:
// Firebase初始化完成后调用 Firebase.Messaging.FirebaseMessaging.GetTokenAsync().ContinueWith(tokenTask => { if (tokenTask.IsCompletedSuccessfully) { string currentToken = tokenTask.Result; // 直接将currentToken存入数据库即可 } });
安卓端配置检查
- 确认
Assets/Plugins/Android/google-services.json文件是从对应Firebase项目下载的,应用包名和Firebase后台配置完全一致 - 确认打包时开启代码混淆(minifyEnabled=true)的情况下,已经添加了Firebase相关的混淆规则,避免FCM相关类被裁剪导致回调失效
- 确认
AndroidManifest.xml中已经正确配置FCM所需的服务、接收器,以及安卓8.0以上要求的默认通知Channel ID
- 确认
测试场景修正
卸载设备上已安装的旧版本应用,重新打包安装首次启动时才会触发TokenReceived事件;同时确保设备的Google Play服务版本为最新,FCM功能依赖Google Play服务运行,版本过低会导致Token生成失败。
内容的提问来源于stack exchange,提问作者Clyon97
相关产品推荐
相关产品推荐

