iOS RemoveDeliveredNotifications(string[] identifier) 当应用在后台时不会删除通知
iOS RemoveDeliveredNotifications(string[] identifier) will not delete the notification(s) when app in background
也许有人可以帮助我。
在我的应用程序中,我使用推送通知来通知用户一条新消息已写入数据库。一位用户可以接受通知并处理内容或将其关闭。如果用户接受它,则会向所有其他较早收到通知的设备发送静默推送。这是我处理此静默通知的代码:
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);
}
}
问题是在将应用程序带到前台之前,通知在通知中心仍然可见。但随后它被删除了。
有没有办法强制该方法立即删除通知,而不仅仅是在(重新)打开应用程序时?
当您想清除从此应用发送的通知时。将其应用程序的徽章设置为 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);
此外,只有当您的应用处于后台或前台时才能收到静默通知。如果终止,这将失败。
要删除通知,请向所有设备发送静默推送通知,并将通知 ID 作为应删除的负载。
在客户端上实施 UNNotificationServiceExtension
允许您通过 ID 删除当前显示的通知:UNUserNotificationCenter.current().removeDeliveredNotifications
.
这为您提供了在服务器端完全控制此逻辑的优势。
也许有人可以帮助我。 在我的应用程序中,我使用推送通知来通知用户一条新消息已写入数据库。一位用户可以接受通知并处理内容或将其关闭。如果用户接受它,则会向所有其他较早收到通知的设备发送静默推送。这是我处理此静默通知的代码:
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);
}
}
问题是在将应用程序带到前台之前,通知在通知中心仍然可见。但随后它被删除了。
有没有办法强制该方法立即删除通知,而不仅仅是在(重新)打开应用程序时?
当您想清除从此应用发送的通知时。将其应用程序的徽章设置为 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);
此外,只有当您的应用处于后台或前台时才能收到静默通知。如果终止,这将失败。
要删除通知,请向所有设备发送静默推送通知,并将通知 ID 作为应删除的负载。
在客户端上实施 UNNotificationServiceExtension
允许您通过 ID 删除当前显示的通知:UNUserNotificationCenter.current().removeDeliveredNotifications
.
这为您提供了在服务器端完全控制此逻辑的优势。