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

.NET MAUI推送通知点击报错、接收限制及Manifest配置问题

.NET MAUI Firebase推送通知问题解决指南

问题1:仅应用运行时能收到通知

后台状态下,系统托盘会直接处理纯notification类型的消息,不会触发FirebaseMessagingService的OnMessageReceived方法。要实现后台收通知并传递跳转参数,需调整消息结构和代码逻辑。

解决步骤

  • 发送Firebase消息时,必须包含data字段(可同时保留notification字段),示例Payload:
    {
      "to": "DEVICE_TOKEN",
      "data": {
        "NavigateTo": "/DetailsPage",
        "title": "新通知",
        "body": "您有一条新消息"
      },
      "notification": {
        "title": "新通知",
        "body": "您有一条新消息"
      }
    }
    
  • 修改FirebaseService的SendNotification方法,适配Android 12+的PendingIntent标记:
    private void SendNotification(string messageBody, string title, IDictionary<string, string> data)
    {
        var intent = new Intent(this, typeof(MainActivity));
        // 添加SingleTop避免重复创建Activity实例
        intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
    
        foreach (var key in data.Keys)
        {
            intent.PutExtra(key, data[key]);
        }
    
        // 适配Android 12+的Immutable标记
        var flags = PendingIntentFlags.OneShot;
        if (OperatingSystem.IsOSPlatformVersionAtLeast("android", 31))
        {
            flags |= PendingIntentFlags.Immutable;
        }
    
        var pendingIntent = PendingIntent.GetActivity(this, MainActivity.NotificationId, intent, flags);
    
        var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.ChannelId)
            .SetContentTitle(title)
            .SetSmallIcon(Resource.Drawable.ic_notification)
            .SetContentText(messageBody)
            .SetChannelId(MainActivity.ChannelId)
            .SetContentIntent(pendingIntent)
            .SetPriority(NotificationCompat.PriorityDefault);
    
        var notificationManager = NotificationManagerCompat.From(this);
        notificationManager.Notify(MainActivity.NotificationId, notificationBuilder.Build());
    }
    

问题2:点击通知跳转时抛出System.InvalidOperationException: 'Window was already created'

错误原因是导航逻辑触发过早,MAUI的AppShell尚未完成初始化,或操作未在UI线程执行。

解决步骤

  1. 修改MainActivity,将导航参数暂存到Preferences,延迟到OnResume阶段处理:
    protected override void OnCreate(Bundle? savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // 无论Intent是否有参数,都先创建通知渠道
        CreateNotificationChanel();
    
        if (Intent?.Extras != null)
        {
            foreach (var key in Intent.Extras.KeySet() ?? [])
            {
                if (key == "NavigateTo")
                {
                    var page = Intent.Extras.GetString(key);
                    if (!string.IsNullOrEmpty(page))
                    {
                        Preferences.Set("NavigateTo", page);
                    }
                }
            }
        }
    }
    
    protected override void OnResume()
    {
        base.OnResume();
    
        if (Preferences.ContainsKey("NavigateTo"))
        {
            var page = Preferences.Get("NavigateTo", string.Empty);
            Preferences.Remove("NavigateTo");
            if (!string.IsNullOrEmpty(page))
            {
                // 确保在UI线程发送导航消息
                MainThread.BeginInvokeOnMainThread(() =>
                {
                    WeakReferenceMessenger.Default.Send(new PushNotificationReceivedMessage
                    {
                        PageToNavigate = page
                    });
                });
            }
        }
    }
    
  2. 修改App类的订阅方法,等待AppShell初始化完成后再执行导航:
    private void SubScribeOnNotificationNavigation()
    {
        WeakReferenceMessenger.Default.Register<PushNotificationReceivedMessage>(this, async (recipient, message) =>
        {
            // 等待AppShell实例就绪
            while (AppShell.Current == null)
            {
                await Task.Delay(100);
            }
            // 在UI线程执行导航操作
            await MainThread.InvokeOnMainThreadAsync(async () =>
            {
                await AppShell.Current.GoToAsync(message.PageToNavigate);
            });
        });
    }
    

问题3:添加默认通知渠道元数据后出现APT2260错误

错误原因是AndroidManifest中引用的字符串资源不存在,需手动定义对应资源。

解决步骤

  1. 在Android项目的Resources/values/strings.xml中添加渠道ID的字符串定义:
    <string name="default_notification_channel_id">MyChanel</string>
    
  2. 在AndroidManifest.xml中配置元数据:
    <application ...>
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/default_notification_channel_id" />
    </application>
    

内容的提问来源于stack exchange,提问作者Wasyster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:53:15