【问题标题】:UNUserNotificationCenter removeAllDeliveredNotifications not working in ios 11.2UNUserNotificationCenter removeAllDeliveredNotifications 在 ios 11.2 中不起作用
【发布时间】:2018-06-14 22:40:49
【问题描述】:

我有一个包含多个本地通知的应用。当我尝试清除所有传递的通知时,我调用了这个removeAllDeliveredNotifications 方法。在ios 11.1 之前它工作正常。在ios 11.2 及更高版本中,它无法按预期工作。通知仍保留在通知中心。有人可以帮我解决这个问题。

提前致谢。

【问题讨论】:

  • 我有代码可以清理在 11.2 中停止工作的通知。你在哪里叫它?我发现当我在通知操作中调用它时它可以工作,但在应用程序中、从今日小部件或从 watchOS 收到消息后在后台调用时它不起作用。之前一切正常。对我来说,这似乎是 iOS 中的一个错误。向 Apple 请求了 TSI,但我无法在新项目中从头开始复制该错误,即使它使用与我的应用相同的方法。
  • 感谢您的回复。我在应用程序中调用了“removeAllDeliveredNotifications”。如您所说,该问题存在于 iOS 11.2 及更高版本中。我已经提交了雷达。
  • @gohnjanotis 是的,我尝试了一个新项目,它基本上在应用程序内发送了本地通知。 getDeliveredNotificationsWithCompletionHandler 返回空数组。
  • 有人提交了这个open radar
  • 这是我的radar,请随意复制并归档到Apple,希望他们能尽快解决这个问题。

标签: ios uilocalnotification unnotificationrequest


【解决方案1】:

它仍然为我们工作。我刚刚在 iOS 11.2.2 上检查过。 我在getDeliveredNotificationsWithCompletionHandler: 中使用removeDeliveredNotificationsWithIdentifiers:,在主线程上调用getDeliveredNotificationsWithCompletionHandler

- (void)removePendingNotificationsForObjectID:(SJFObjectID *)objectID {
    __weak __typeof(self) weakSelf = self;
    [self.userNotificationCenter getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> *notifications) {
        __strong __typeof(weakSelf) self = weakSelf;
        NSMutableArray <NSString *> *identifiersToRemove = [@[] mutableCopy];
        for (UNNotification *notification in notifications) {
            SJFObjectID *objectIDFromNotification = [self.notificationToObjectIDMarshaller marshalNotification:notification];
            if ([objectID isEqual:objectIDFromNotification]) {
                [identifiersToRemove addObject:notification.request.identifier];
            }
        }
        [self.userNotificationCenter removeDeliveredNotificationsWithIdentifiers:identifiersToRemove];
    }];
}

虽然我在调试 completionHandler 时会遇到奇怪的行为。如果暂停时间过长(无论这意味着什么),完成处理程序将无法完成(即使在继续执行进程时),从而导致应用程序无响应。可能完成处理程序被终止。

【讨论】:

  • 感谢您提供额外信息。我要疯了,想弄清楚发生了什么。我最初做的事情类似于你正在做的事情,只清除特定的通知,但在故障排除期间,我一直在使用UNUserNotificationCenter.current().removeAllDeliveredNotifications(),它应该总是清除所有通知,但事实并非如此。当我想清除通知以尝试给它足够的时间运行时,我什至没有调用任何其他代码,但它仍然只在一种情况下有效(当从 UNUserNotificationCenterDelegate 中的通知操作调用时)。跨度>
  • @gohnjanotis 你能描述一下它在UNUserNotificationCenterDelegate 中的工作原理吗?我猜当您对通知采取行动时会调用此委托方法,其中当前的错误是,一旦将任何系统或自定义操作应用于其中一个通知,所有通知都将被清除。
  • @cornr 你运行的是哪个设备或模拟器?
  • @HarryNg iPhone X
  • 感谢您的回复。所以我在 iPhone X 上尝试了 11.2.2,逻辑不起作用。我正在使用 swift 在 Xcode 9.1 和 9.2 中构建
【解决方案2】:

这似乎是 iOS 11.3 中修复的一个错误。

【讨论】:

  • 您是否发现问题发生在 iOS 11.2 及更高版本?
  • @TomCalmon 在 iOS 11.3 中修复后我再也没有遇到过
  • 对!您的回答是关于 iOS 10.3。我看到你在 iOS 11.3 上做得对!
【解决方案3】:

您是否尝试过使用这种方法:

removeDeliveredNotifications(withIdentifiers:)

您需要传递一个包含所有需要删除的通知标识符的数组。

【讨论】:

  • 我遇到了同样的问题,但使用标识符并不能一直解决它。自 iOS 11.2 以来,removeAllDeliveredNotificationsremoveDeliveredNotifications(withIdentifiers:) 似乎在某些情况下有效,但并非始终如一。
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多