Xamarin iOS应用图标角标显示1但无通知,求问题原因及解决方法
iOS 应用角标残留数字“1”问题排查与解决
问题原因
你的代码仅完成了远程通知权限的注册,没有处理通知清除后的角标清零逻辑,常见触发场景包括:
- 用户点击通知进入APP后,未主动将角标数值重置为0;
- 服务器曾推送过角标为1的通知,但后续未发送清零角标的推送指令;
- APP启动/回到前台时,未检查系统通知中心状态并同步更新角标。
解决办法
1. 前台主动清零角标
在APP进入前台或激活时,强制将角标设为0,同时清空通知中心的历史通知(避免角标和通知内容不一致):
// 在AppDelegate的WillEnterForeground或DidBecomeActive方法中添加 public override void WillEnterForeground(UIApplication application) { base.WillEnterForeground(application); // 清零角标 UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0; // 清除所有本地通知(iOS 9及以下) UIApplication.SharedApplication.CancelAllLocalNotifications(); // iOS 10+ 用UNUserNotificationCenter清除通知 UNUserNotificationCenter.Current.RemoveAllDeliveredNotifications(); }
2. 处理推送通知时同步更新角标
当收到远程通知或用户点击通知进入APP时,根据实际通知数量调整角标:
// 处理远程通知的方法(iOS 9及以下) public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler) { // 从推送payload中获取角标数值,或直接清零 if (userInfo.ContainsKey(new NSString("aps"))) { var aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary; if (aps.ContainsKey(new NSString("badge"))) { int badgeCount = Convert.ToInt32(aps.ObjectForKey(new NSString("badge")).ToString()); UIApplication.SharedApplication.ApplicationIconBadgeNumber = badgeCount; } else { // 无角标字段时清零 UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0; } } completionHandler(UIBackgroundFetchResult.NewData); } // iOS 10+ 用UNUserNotificationCenter代理 [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")] public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler) { // 点击通知后清零角标 UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0; center.RemoveAllDeliveredNotifications(); completionHandler(); }
3. 服务器推送清零指令
当APP无未读通知时,服务器可以发送携带badge: 0的推送 payload,APP收到后会自动清零角标:
{ "aps": { "badge": 0 } }
内容的提问来源于stack exchange,提问作者Xeijin
相关产品推荐
相关产品推荐

