.NET MAUI Android应用完全关闭时FCM推送通知失效
解决.NET MAUI Android应用完全关闭后无法接收FCM通知的问题
以下是针对你问题的排查与修复步骤:
1. 确认Firebase服务在AndroidManifest中正确注册
尽管你使用了[Service]特性,但可以手动在AndroidManifest.xml的<application>标签内添加服务注册,确保系统能识别你的FirebaseService:
<service android:name="com.companyname.internconnect.Services.FirebaseService" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
2. 创建通知渠道(Android 8.0+ 强制要求)
Android 8.0及以上版本必须创建通知渠道才能显示通知。在应用启动时(比如MainActivity的OnCreate方法)添加渠道创建代码:
using Android.App; using Android.Content; using Android.OS; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); CreateNotificationChannel(); } private void CreateNotificationChannel() { if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { var channel = new NotificationChannel( ApplicationConstants.ChannelId, "FCM通知渠道", NotificationImportance.High) { Description = "接收Firebase推送通知" }; var notificationManager = GetSystemService(NotificationService) as NotificationManager; notificationManager?.CreateNotificationChannel(channel); } }
3. 补充必要权限(适配Android 12+)
在AndroidManifest.xml中添加通知权限及可选的电池优化豁免权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- 可选:避免电池优化限制后台唤醒 --> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
若需要申请电池优化豁免,可添加代码引导用户设置:
using Android.Content; using Android.OS; using Android.Provider; private void RequestBatteryOptimizationExemption() { if (Build.VERSION.SdkInt >= BuildVersionCodes.M) { var intent = new Intent(); var packageName = PackageName; var powerManager = GetSystemService(PowerService) as PowerManager; if (!powerManager.IsIgnoringBatteryOptimizations(packageName)) { intent.SetAction(Settings.ActionRequestIgnoreBatteryOptimizations); intent.SetData(Android.Net.Uri.Parse($"package:{packageName}")); StartActivity(intent); } } }
4. 检查FCM消息发送格式
FCM消息分两种类型,处理逻辑不同:
- 通知消息:包含
notification字段,应用关闭时由Android系统直接显示通知,无需应用代码处理。 - 数据消息:仅包含
data字段,需要FirebaseMessagingService处理。应用完全关闭时,系统会尝试唤醒Service,但格式错误或系统限制可能导致无法触发。
根据需求选择消息格式:
- 若需应用关闭时自动显示通知,发送通知消息(含
notification字段)。 - 若需自定义处理逻辑,发送数据消息(仅
data字段),同时确保Service配置正确。
5. 调整PendingIntent配置
在ShowNotification方法中,将PendingIntent的ActivityFlags改为NewTask,确保应用完全关闭时能正确启动:
var intent = new Intent(this, typeof(MainActivity)); intent.AddFlags(ActivityFlags.NewTask | ActivityFlags.ClearTop);
6. 验证Service的导出设置
确保FirebaseService的Exported属性设为true,Android 12+要求接收外部Intent的组件必须显式配置该属性:
[Service(Exported = true)] [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })] public class FirebaseService : FirebaseMessagingService { // 你的现有代码 }
内容的提问来源于stack exchange,提问作者Kelvin Kirwa
相关产品推荐
相关产品推荐

