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

.NET7 MAUI iOS后台APN推送异常:UNUserNotificationCenterDelegate未触发

.NET7 MAUI iOS APN推送非前台状态异常问题

我开发了一个未使用Firebase的.NET7 MAUI iOS应用,当前APN推送在应用非前台状态下存在异常,具体场景如下:

场景1:应用前台状态

推送可被AppDelegate的ReceivedRemoteNotification方法接收,将通知信息存入本地数据库后,通过Plugin.LocalNotification展示本地通知,通知显示正常,点击可打开指定页面,功能无问题。

场景2:应用后台状态

虽能正常处理推送、存入数据库并展示自定义本地通知,但会额外弹出一个无响应的默认通知。代码中未调用UNUserNotificationCenter.Current.AddNotificationRequest(request, OnNotificationError)添加通知,需要阻止这个默认通知显示。

场景3:应用未运行状态

仅显示无响应的默认通知,推送数据未存入数据库。需要确保数据入库,且即便需用户登录,仍要在GUI中展示通知以便用户跳转至对应页面。

调试情况

iOS模拟器无法调试通知(无通知显示),通过AppCenter Analytics的logUsage()排查,发现后台时日志未记录,推测UNUserNotificationCenterDelegate的WillPresentNotification和DidReceiveNotificationResponse方法未触发。


现有代码

AppDelegate.cs

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    UNUserNotificationCenter.Current.Delegate = new UserNotificationCenterDelegate(); // 自定义类

    // 通知注册和权限检查代码(已验证可用,示例中省略)
}


[Export("application:didReceiveRemoteNotification:")]
public void ReceivedRemoteNotification(UIApplication application, NSDictionary notification) 
{
    // 处理通知、存入数据库并展示本地通知的代码
    // 应用前台时运行正常
}

UserNotificationCenterDelegate.cs

public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate, IUNUserNotificationCenterDelegate
{
    [Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
    public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
    {
        // 尝试在应用未运行时存入数据库,但未生效,不确定是否执行
        completionHandler(UNNotificationPresentationOptions.None); // 本应阻止默认通知显示
    }

    [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
    public override void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
    {
        // 本应在点击默认通知时触发,不确定是否执行

        if (!response.IsDismissAction)
        {
            // 打开对应页面的代码
        }
        completionHandler();// 告知调用方已处理
    }

}

待解决问题

  • 应用后台时,远程推送的接收入口在哪里?如何确保数据存入数据库(似乎不是AppDelegate的ReceivedRemoteNotification);
  • 如何控制应用后台时是否显示默认通知(UNUserNotificationCenterDelegate的WillPresentNotification未生效);
  • 默认通知被点击时,应在哪里编写打开对应页面的代码(UNUserNotificationCenterDelegate的DidReceiveNotificationResponse未触发,若解决前两个问题可能无需此操作)。

更新内容

发现微软文档未提及的另一个方法:

[Export("application:didReceiveRemoteNotification:fetchCompletionHandler:")]
public void DidReceiveRemoteNotification(UIApplication application, NSDictionary notification, Action<UIBackgroundFetchResult> completionHandler)
{
    // 将通知写入数据库并展示本地通知的代码
    
    completionHandler(UIBackgroundFetchResult.NewData);
}

根据Apple文档说明:该方法在应用前台或后台运行时由系统调用,告知应用有带数据的远程通知到达,用于处理传入的远程通知。
实现该方法后,应用未运行时可将推送存入数据库并展示本地通知,但仍会显示默认通知,需解决阻止默认通知的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:21:03