基于Xamarin.Forms实现数据库变更时的跨端推送通知功能
在Xamarin.Forms中实现数据库新增内容触发的跨平台推送通知
嘿,针对你要在Xamarin.Forms(Android+iOS)里实现「数据库新增邀请记录时推送给被邀请用户」的需求,我给你梳理一套落地的方案,都是实际项目里常用的思路~
一、先理清核心流程
首先要避开一个坑:别让APP一直轮询数据库,既耗电又低效。正确的闭环应该是这样:
- 后端监控数据库的新增记录(比如邀请记录被插入)
- 后端匹配到被邀请用户的设备推送令牌(提前存在数据库里的)
- 后端调用推送服务(FCM给Android,APNs给iOS)发送通知
- Xamarin.Forms端接收并处理通知(展示提示、跳转页面等)
二、后端怎么触发推送
假设你的后端是.NET生态(和Xamarin适配最顺畅),举个简单的实现逻辑:
- 当邀请记录被插入后(比如用EF Core的
SaveChangesAsync完成后),提取被邀请用户ID - 通过用户ID从数据库中取出对应的设备推送令牌(这个令牌是APP首次启动时注册推送服务后传给后端的)
- 调用FCM/APNs的API发送推送请求
给你一段FCM发送通知的C#代码片段:
// 构建推送消息 var fcmMessage = new FirebaseAdmin.Messaging.Message() { Token = targetDeviceToken, // 被邀请用户的设备令牌 Notification = new FirebaseAdmin.Messaging.Notification() { Title = "新邀请提醒", Body = $"用户{inviterNickname}邀请你加入协作项目" }, Data = new Dictionary<string, string>() { {"invitationId", invitationId.ToString()}, {"type", "invitation"} } }; // 发送推送 var response = await FirebaseAdmin.Messaging.FirebaseMessaging.DefaultInstance.SendAsync(fcmMessage);
三、Xamarin.Forms端的推送配置与实现
1. 依赖库准备
优先推荐用封装好的NuGet包,减少重复造轮子:
- 跨平台项目+双平台项目都安装:
Plugin.FirebasePushNotification(同时支持FCM和APNs,配置更简单) - iOS额外:需要在Apple开发者后台配置APNs证书,开启推送权限
2. 平台端的推送注册(必须做)
Android端(MainActivity.cs)
在OnCreate里初始化FCM并获取令牌:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); FirebaseApp.InitializeApp(this); // 获取FCM令牌并传给后端存储 FirebaseMessaging.Instance.GetToken().AddOnCompleteListener(task => { if (!task.IsSuccessful) return; var deviceToken = task.Result; SendTokenToBackend(deviceToken); // 自己实现的上传令牌方法 }); // 初始化推送插件 FirebasePushNotificationManager.Initialize(this, new NotificationUserCategory[] { }, true); }
别忘了在AndroidManifest.xml里添加必要权限和服务配置:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <service android:name="com.google.firebase.messaging.FirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
iOS端(AppDelegate.cs)
在FinishedLaunching里申请推送权限并注册APNs:
public override bool FinishedLaunching(UIApplication app, NSDictionary options) { global::Xamarin.Forms.Forms.Init(); LoadApplication(new App()); // 申请推送权限 UNUserNotificationCenter.Current.RequestAuthorization( UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (granted, error) => { if (granted) { InvokeOnMainThread(() => UIApplication.SharedApplication.RegisterForRemoteNotifications()); } }); // 初始化推送插件 FirebasePushNotificationManager.Initialize(options, new NotificationUserCategory[] { }, true); return base.FinishedLaunching(app, options); } // 获取APNs令牌并上传后端 public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) { var token = deviceToken.Description.Trim('<', '>').Replace(" ", ""); SendTokenToBackend(token); // 自己实现的上传令牌方法 }
3. 跨平台接收与处理通知
在Xamarin.Forms的App.xaml.cs里监听通知事件,处理不同状态下的通知:
public App() { InitializeComponent(); MainPage = new NavigationPage(new MainPage()); // 监听前台收到通知(APP在前台运行时) FirebasePushNotificationManager.OnNotificationReceived += (sender, args) => { Device.BeginInvokeOnMainThread(async () => { var result = await DisplayAlert( args.Notification.Title, args.Notification.Body, "查看邀请", "稍后再说"); if (result) { // 跳转至邀请详情页 var invitationId = args.Data["invitationId"]; await MainPage.Navigation.PushAsync(new InvitationDetailPage(invitationId)); } }); }; // 监听用户点击通知(APP在后台或被杀死状态) FirebasePushNotificationManager.OnNotificationOpened += (sender, args) => { Device.BeginInvokeOnMainThread(async () => { var invitationId = args.Data["invitationId"]; await MainPage.Navigation.PushAsync(new InvitationDetailPage(invitationId)); }); }; }
四、关键注意事项
- 令牌更新:Android和iOS的推送令牌可能会变化(比如用户重装APP、系统更新),所以每次APP启动都要检查令牌是否更新,及时同步给后端
- 权限适配:iOS必须用户主动授权推送权限;Android 13+需要申请
POST_NOTIFICATIONS权限,记得在代码里处理权限申请流程 - 后台稳定性:iOS要开启后台模式的「远程通知」;Android要确保FCM服务不被系统后台杀死(可以引导用户开启电池优化白名单)
- 测试流程:先单独用FCM控制台/APNs测试工具验证推送能收到,再结合数据库触发逻辑做端到端测试
内容的提问来源于stack exchange,提问作者Szymon Rożek
相关产品推荐
相关产品推荐

