.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线程执行。
解决步骤
- 修改
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 }); }); } } } - 修改
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中引用的字符串资源不存在,需手动定义对应资源。
解决步骤
- 在Android项目的
Resources/values/strings.xml中添加渠道ID的字符串定义:<string name="default_notification_channel_id">MyChanel</string> - 在
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
相关产品推荐
相关产品推荐

