Xamarin跨平台Firebase推送通知无法正常工作求助
解决Xamarin中Plugin.FirebasePushNotification推送无法接收的问题
我来帮你一步步排查这个推送通知的问题,结合你提供的代码和配置,下面是几个关键的检查点和修复方案:
1. 确认google-service.json的配置与位置
首先要确保你的google-service.json文件:
- 完全匹配Firebase控制台中创建的应用包名(和Android项目的
AndroidManifest.xml里的package属性一致) - 放在Android项目的Assets文件夹下,并且在属性窗口设置
Build Action为AndroidAsset - 文件里的API密钥、项目ID等信息没有错误
2. 检查AndroidManifest.xml的权限与组件配置
插件可能不会自动添加所有必需的配置,手动确认以下内容是否存在:
权限配置
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> <!-- Android 13+ 需要的通知权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" android:maxSdkVersion="33" />
服务与接收器配置
<service android:name="com.google.firebase.messaging.FirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="${applicationId}" /> </intent-filter> </receiver>
3. 验证Token是否正常获取
你的代码在OnStart中打印了Token,先确认调试窗口是否输出了有效的Token:
- 如果Token为空或未输出,说明Firebase初始化失败,大概率是
google-service.json配置错误或者包名不匹配 - 拿到Token后,直接用这个Token在Postman中测试推送,确保目标设备正确
4. 修正Postman的推送请求格式
确保你的FCM请求格式正确,旧版API的示例如下:
请求URL
https://fcm.googleapis.com/fcm/send
请求头
Authorization: key=你的Firebase服务器密钥Content-Type: application/json
请求体
{ "to": "你的设备Token", "notification": { "title": "测试标题", "body": "测试消息" }, "data": { "custom_key": "自定义数据" } }
注意:如果只发送
data字段,应用在后台或杀死状态下可能不会弹出通知,建议同时包含notification和data字段。
5. 修复MainApplication的初始化代码
你的MainApplication的OnCreate方法缺少base.OnCreate();调用,这会导致初始化异常,修正后:
public override void OnCreate() { base.OnCreate(); // 必须添加这一行 FirebasePushNotificationManager.Initialize(this, new NotificationUserCategory[] { new NotificationUserCategory("message", new List<NotificationUserAction> { new NotificationUserAction("Reply", "Reply", NotificationActionType.Foreground), new NotificationUserAction("Forward", "Forward", NotificationActionType.Foreground) }), new NotificationUserCategory("request", new List<NotificationUserAction> { new NotificationUserAction("Accept", "Accept", NotificationActionType.Default, "check"), new NotificationUserAction("Reject", "Reject", NotificationActionType.Default, "cancel") }) }, true); }
6. 处理Android 13+的通知权限申请
Android 13及以上版本需要手动申请通知权限,在MainActivity的OnCreate中添加:
protected override void OnCreate(Bundle bundle) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(bundle); // 申请Android 13+通知权限 if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu) { if (CheckSelfPermission(Manifest.Permission.PostNotifications) != Permission.Granted) { RequestPermissions(new string[] { Manifest.Permission.PostNotifications }, 100); } } global::Xamarin.Forms.Forms.Init(this, bundle); LoadApplication(new App()); FirebasePushNotificationManager.ProcessIntent(Intent); }
7. 排查厂商后台限制问题
如果应用在前台能收到推送,后台/杀死状态下收不到,大概率是国内厂商(小米、华为、OPPO等)的后台限制:
- 进入系统设置,将应用加入后台白名单
- 允许应用自启动和后台运行权限
按照以上步骤逐一排查,应该能解决你的推送接收问题。
内容的提问来源于stack exchange,提问作者Aswathy K R
相关产品推荐
相关产品推荐

