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

基于Xamarin.Forms实现数据库变更时的跨端推送通知功能

在Xamarin.Forms中实现数据库新增内容触发的跨平台推送通知

嘿,针对你要在Xamarin.Forms(Android+iOS)里实现「数据库新增邀请记录时推送给被邀请用户」的需求,我给你梳理一套落地的方案,都是实际项目里常用的思路~

一、先理清核心流程

首先要避开一个坑:别让APP一直轮询数据库,既耗电又低效。正确的闭环应该是这样:

  • 后端监控数据库的新增记录(比如邀请记录被插入)
  • 后端匹配到被邀请用户的设备推送令牌(提前存在数据库里的)
  • 后端调用推送服务(FCM给Android,APNs给iOS)发送通知
  • Xamarin.Forms端接收并处理通知(展示提示、跳转页面等)

二、后端怎么触发推送

假设你的后端是.NET生态(和Xamarin适配最顺畅),举个简单的实现逻辑:

  1. 当邀请记录被插入后(比如用EF Core的SaveChangesAsync完成后),提取被邀请用户ID
  2. 通过用户ID从数据库中取出对应的设备推送令牌(这个令牌是APP首次启动时注册推送服务后传给后端的)
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:14:05