.NET7 MAUI iOS后台APN推送异常:UNUserNotificationCenterDelegate未触发
我开发了一个未使用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

