You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:46:07