MAUI本身不支持推送通知,需结合各平台原生能力(Android的FCM、iOS的APNs)及后端服务(如OneSignal、Azure)实现;关键步骤包括平台配置、统一获取上报设备token、处理前后台通知,并推荐使用OneSignal等托管服务降低开发成本。
MAUI 本身不直接支持推送通知,因为它跨平台且没有内置的推送服务 SDK。真正实现推送需要结合各平台原生能力(Android 的 FCM、iOS 的 APNs)和后端推送服务(如 Firebase、Azure Notification Hubs、OneSignal 等)。下面分关键步骤讲清楚怎么在 MAUI 中落地推送通知。
MAUI 应用要收推送,得先让每个平台能注册设备令牌(token),这是推送的“地址”。跳过这步,后面全白搭。
Platforms/Android/MainActivity.cs 的 OnCreate 中调用 FirebaseMessaging.Instance.Token 获取 FCM token;同时确保 AndroidManifest.xml 已声明网络权限、添加 com.google.firebase.messaging.FirebaseMessagingService 服务,并配置 google-services.json(放在 Platforms/Android 下并设为 GoogleServicesJson 类型)。Platforms/iOS/AppDelegate.cs 的 FinishedLaunching 中调用 UIApplication.SharedApplication.RegisterForRemoteNotifications();还需在 Apple Developer Portal 开启 Push Notifications Capability,并配置有效的推送证书或密钥(.p8 文件),Xcode 中也要开启 Background Modes → Remote notifications。建议封装一个平台无关的接口,比如 IPushRegistrationService,在各平台实现具体逻辑,然后在启动时调用:
FirebaseMessaging.Instance.TokenRefresh 事件,拿到 token 后通过依赖注入传给业务层或上传到你自己的后端。DidRegisterForRemoteNotifications 和 DidFailToRegisterForRemoteNotifications 方法,解析 NSData 得到 device token 字符串(十六进制格式),同样上传。MauiProgram.cs 中注册该服务:builder.Services.AddSingleton() (iOS 对应替换)。用户点击通知打开 App 时,需捕获参数;App 在前台时,系统默认不弹横幅(FCM 默认行为),需手动显示。
FirebaseMessagingService 子类中重写 OnMessageReceived,判断 app 是否在前台(可用 ActivityManager 检查),前台时用 NotificationCompat.Builder 手动构建并发出通知。IUNUserNotificationCenterDelegate,在 WillPresentNotification 中返回 UNNotificationPresentationOptions.Alert 让前台也显示;在 DidReceiveNotificationResponse 中解析 n
otification.Request.Content.UserInfo 获取自定义数据(如跳转页面)。Application.Current.OnResume() 或自定义消息事件(如 WeakEventManager)把通知内容传递给 ViewModel 做后续处理(例如导航到详情页)。自己对接 FCM/APNs + 自建后端发推送门槛高、维护成本大。对大多数项目,直接集成 OneSignal 是最快方案:
OneSignalSDK.Xamarin.iOS 和 OneSignalSDK.Xamarin.Android NuGet 包。MainActivity.OnCreate 调用 OneSignal.Initialize("YOUR_APP_ID");iOS:在 AppDelegate.FinishedLaunching 初始化并设置委托。基本上就这些。核心不是“MAUI 怎么推”,而是“MAUI 怎么桥接原生推送能力”。平台配置、token 上报、前后台通知处理三块缺一不可。用好 OneSignal 这类 SDK,能省下 80% 的重复工作。