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

如何在Xamarin.Forms中实现通知点击事件以打开PCL项目XAML页面

搞定Xamarin.Forms通知点击跳转PCL页面的方案

嘿,我来帮你搞定这个通知点击跳转的问题!既然你已经用Dependency Service实现了基础通知功能,那接下来的核心就是在原生平台捕获通知点击事件,然后通知PCL层完成页面导航。下面分步骤给你拆解:

整体思路

当用户点击通知时,原生平台(Android/iOS)会触发对应的回调,我们在回调里通过MessagingCenter(或者自定义回调接口)给PCL层发送一个“跳转指令”,然后PCL层利用NavigationPage完成目标XAML页面的跳转。


Android平台实现

1. 给通知绑定带跳转标记的Intent

在你创建Android通知的代码里,需要给PendingIntent附加一个包含目标页面信息的Intent,这样点击通知时就能触发这个Intent:

public void SendNotificationWithNavigation(string title, string message, string targetPage)
{
    // 创建指向MainActivity的Intent
    var intent = new Intent(Android.App.Application.Context, typeof(MainActivity));
    // 附加跳转标记,这里用字符串标识目标页面
    intent.PutExtra("NavigateTo", targetPage);
    // 创建PendingIntent,确保每次通知点击都会更新Intent内容
    var pendingIntent = PendingIntent.GetActivity(
        Android.App.Application.Context, 
        0, 
        intent, 
        PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Immutable);

    // 构建通知并设置点击Intent
    var notificationBuilder = new NotificationCompat.Builder(Android.App.Application.Context, "你的通知渠道ID")
        .SetContentTitle(title)
        .SetContentText(message)
        .SetSmallIcon(Resource.Drawable.ic_notification)
        .SetContentIntent(pendingIntent)
        .SetAutoCancel(true);

    // 发送通知
    var notificationManager = NotificationManagerCompat.From(Android.App.Application.Context);
    notificationManager.Notify(1, notificationBuilder.Build());
}

2. 在MainActivity中处理跳转指令

不管应用是在前台、后台还是被杀死状态,点击通知都会触发MainActivity的相关回调,我们在这里提取跳转标记并通知PCL:

public class MainActivity : FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // 应用被杀死后重启,处理启动Intent
        HandleNotificationIntent(Intent);
    }

    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);
        // 应用在后台时,处理新的Intent
        HandleNotificationIntent(intent);
    }

    private void HandleNotificationIntent(Intent intent)
    {
        if (intent?.HasExtra("NavigateTo") == true)
        {
            var targetPage = intent.GetStringExtra("NavigateTo");
            // 通过MessagingCenter给PCL层发消息
            MessagingCenter.Send<object, string>(this, "NavigateToPage", targetPage);
        }
    }
}

iOS平台实现

1. 设置通知代理并处理点击回调

在iOS的AppDelegate里,我们需要实现UNUserNotificationCenterDelegate来捕获通知点击事件:

[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init();
        LoadApplication(new App());

        // 设置通知中心的代理
        UNUserNotificationCenter.Current.Delegate = this;

        return base.FinishedLaunching(app, options);
    }

    // 处理通知点击事件
    [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
    public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
    {
        var userInfo = response.Notification.Request.Content.UserInfo;
        // 提取跳转标记
        if (userInfo.ContainsKey(new NSString("NavigateTo")))
        {
            var targetPage = userInfo[new NSString("NavigateTo")].ToString();
            // 通过MessagingCenter给PCL层发消息
            MessagingCenter.Send<object, string>(this, "NavigateToPage", targetPage);
        }

        // 必须调用completionHandler
        completionHandler();
    }
}

2. 创建带跳转标记的通知

在iOS的通知实现代码里,把目标页面信息放到通知的UserInfo中:

public void SendNotificationWithNavigation(string title, string message, string targetPage)
{
    var content = new UNMutableNotificationContent();
    content.Title = title;
    content.Body = message;
    content.Sound = UNNotificationSound.Default;
    // 附加跳转标记
    content.UserInfo = new NSDictionary("NavigateTo", targetPage);

    // 创建通知请求
    var request = UNNotificationRequest.FromIdentifier("notification_id", content, UNTimeIntervalNotificationTrigger.CreateTrigger(0.1, false));

    // 添加到通知中心
    UNUserNotificationCenter.Current.AddNotificationRequest(request, (error) =>
    {
        if (error != null)
        {
            // 处理错误
        }
    });
}

PCL/共享项目中的导航处理

现在回到PCL层,我们需要订阅MessagingCenter的消息,然后完成页面跳转:

1. 在App.xaml.cs中订阅消息

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        // 确保MainPage是NavigationPage(如果还不是的话)
        MainPage = new NavigationPage(new MainPage());

        // 订阅通知跳转消息
        MessagingCenter.Subscribe<object, string>(this, "NavigateToPage", (sender, targetPage) =>
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                // 根据标记跳转到对应页面
                switch (targetPage)
                {
                    case "TargetPage":
                        var targetPageInstance = new TargetPage();
                        if (MainPage is NavigationPage navPage)
                        {
                            navPage.PushAsync(targetPageInstance);
                        }
                        else
                        {
                            // 如果当前不是NavigationPage,重新设置
                            MainPage = new NavigationPage(targetPageInstance);
                        }
                        break;
                    // 可以添加更多页面的跳转逻辑
                }
            });
        });
    }

    protected override void OnTerminate()
    {
        // 取消订阅,避免内存泄漏
        MessagingCenter.Unsubscribe<object, string>(this, "NavigateToPage");
        base.OnTerminate();
    }
}

2. 整合到Dependency Service

把上面的通知创建方法封装到你的INotificationService接口中,这样PCL层就能直接调用:

public interface INotificationService
{
    void SendNotificationWithNavigation(string title, string message, string targetPage);
}

然后在Android和iOS的Dependency Service实现中,实现这个方法即可。


注意事项

  • 确保你的MainPage是NavigationPage,否则PushAsync会抛出异常。
  • MessagingCenter记得在合适的时机取消订阅(比如App终止时),避免内存泄漏。
  • Android的PendingIntentFlags要加上Immutable(Android 12+要求),避免权限问题。
  • iOS需要确保已经在Info.plist中配置了通知权限(你已经实现了通知功能,应该已经配置过了)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:29:11