0

也许有人可以帮助我。在我的应用程序中,我使用推送通知来通知用户一条新消息已写入数据库。一位用户可以接受通知并处理内容或将其关闭。如果用户接受它,则会向所有其他较早收到通知的设备发送静默推送。这是我处理此静默通知的代码:

public override void ReceivedRemoteNotification(UIApplication application, NSDictionary remoteNotification)
    {
        try
        {                
            if (remoteNotification != null)
            {
                var alert = remoteNotification[FromObject("aps")];
                if (alert != null)
                {
                    string id = ((NSDictionary)alert)[FromObject("deleteId")].Description;
                    if (!String.IsNullOrEmpty(id))
                    {
                        List<string> idents = new List<string>();

                        UNUserNotificationCenter.Current.GetDeliveredNotifications(completionHandler: (UNNotification[] t) =>
                        {
                            foreach (UNNotification item in t)
                            {
                                UNNotificationRequest curRequest = item.Request;
                                var notificationId = ((NSDictionary)curRequest.Content.UserInfo[FromObject("aps")])[FromObject("notificationId")].Description;
                                if (id == notificationId)
                                {
                                    idents.Add(curRequest.Identifier);
                                }
                            }
                            UNUserNotificationCenter.Current.RemoveDeliveredNotifications(idents.ToArray());
                        });
                    }
                }
            }

        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
    }

问题是通知在通知中心仍然可见,直到应用程序被带到前台。但随后它被删除。

有没有办法强制该方法立即删除通知,而不仅仅是在(重新)打开应用程序时?

4

2 回答 2

0

当您要清除从此应用程序发送的通知时。将其应用程序的标记设置为 0 以实现此目的。

正如您所说,您向其他用户发送静默通知,然后DidReceiveRemoteNotification()会触发。在这种情况下,我们可以清除所有通知:

public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
    var aps = userInfo["aps"] as NSDictionary;
    if (aps["content-available"].ToString() == "1")
    {
        //check if this is a silent notification.
        UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;
    }
    completionHandler(UIBackgroundFetchResult.NewData);
}

请注意,从 iOS 8.0 开始,您的应用程序需要注册用户通知才能设置应用程序图标徽章编号。所以请在下面添加代码FinishedLaunching()

UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Badge, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);

此外,只有当您的应用程序处于后台或前台时,才能收到静默通知。如果它被终止,这将失败。

于 2018-03-20T10:38:03.000 回答
0

要删除通知,您需要向所有设备发送静默推送通知,通知 ID 作为应删除的有效负载。

在您实施的客户端上,您UNNotificationServiceExtension可以通过其 ID 删除当前显示的通知:UNUserNotificationCenter.current().removeDeliveredNotifications.

这为您提供了一个优势,即您可以完全控制服务器端的此逻辑。

于 2018-10-13T12:58:35.203 回答