【问题标题】:iOS application: how to clear notifications?iOS应用程序:如何清除通知?
【发布时间】:2012-01-30 17:01:08
【问题描述】:

我有一个 iOS 应用程序,其中一些推送通知被发送到。我的问题是,消息/通知保留在 iOS 的通知中心之后被点击。下次打开应用程序时,如何在通知中心中删除我的应用程序的通知?

我遇到了人们将setApplicationIconBadgeNumber 调用为零值以清除通知的帖子。这对我来说似乎很奇怪,所以我相信也许存在另一种解决方案?

EDIT1:

我在清除通知时遇到了一些问题。请在此处查看我的代码:

- (void) clearNotifications {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions != nil)
    {
        NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (dictionary != nil)
        {
            NSLog(@"Launched from push notification: %@", dictionary);

            [self clearNotifications];
        }
    }

    return YES;
}

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{    
    NSLog(@"Received notification: %@", userInfo);
    [self clearNotifications];
}

我正在通过 Xcode 运行应用程序。当应用程序最小化并且我使用通知中心中的通知启动应用程序时,我可以在日志中看到 didReceiveRemoteNotification 被调用并使用断点我可以看到 clearNotifications 已经运行。但是通知仍然挂在通知中心。为什么?

【问题讨论】:

    标签: objective-c cocoa-touch apple-push-notifications


    【解决方案1】:

    iOS 10 (Swift 3) 更新

    为了清除 iOS 10 应用中的所有本地通知,您应该使用以下代码:

    import UserNotifications
    
    ...
    
    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.current()
        center.removeAllPendingNotificationRequests() // To remove all pending notifications which are not delivered yet but scheduled.
        center.removeAllDeliveredNotifications() // To remove all delivered notifications
    } else {
        UIApplication.shared.cancelAllLocalNotifications()
    }
    

    此代码处理 iOS 10.x 和所有之前版本的 iOS 的本地通知的清除。您需要 import UserNotifications 获取 iOS 10.x 代码。

    【讨论】:

      【解决方案2】:

      您需要在 AppDelegate applicationDidBecomeActive 方法中添加以下代码。

      [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
      

      【讨论】:

        【解决方案3】:

        here 获得。它适用于 iOS 9

        UIApplication *app = [UIApplication sharedApplication];
        NSArray *eventArray = [app scheduledLocalNotifications];
        for (int i=0; i<[eventArray count]; i++)
        {
            UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
            //Cancelling local notification
            [app cancelLocalNotification:oneEvent];
        }
        

        【讨论】:

          【解决方案4】:

          如果你来这里想知道相反的情况(就像我一样),this 帖子可能适合你。

          我无法弄清楚为什么我清除徽章时通知会被清除...我手动增加了徽章,然后想在用户进入应用程序时清除它。不过,这不是清除通知中心的理由。他们可能仍希望看到这些通知或对其采取行动。

          幸运的是,负 1 可以解决问题:

          [UIApplication sharedApplication].applicationIconBadgeNumber = -1;
          

          【讨论】:

          • 它在 iOS9 中对你有用吗?我没有注意到将徽章设置为 0 或 -1 有任何区别。在我的情况下,它仍然会清除所有远程通知。
          • 是的,我实际上又开始注意到我的应用程序了;我不知道发生了什么变化。
          • 我放弃了,因为 Apple 以某种方式决定没有徽章编号的应用程序不应该有任何通知
          【解决方案5】:

          当您从您的应用程序中注销时,您必须在注销按钮单击方法上使用以下代码行。

          [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
          
          [[UIApplication sharedApplication] cancelAllLocalNotifications];
          

          这在我的应用程序中完美运行。

          【讨论】:

            【解决方案6】:

            当您以后有重复通知时,不想取消这些通知,您可以通过以下方式清除通知中心的项目:

            func clearNotificationCenter() {
                UIApplication.sharedApplication().applicationIconBadgeNumber = 1
                UIApplication.sharedApplication().applicationIconBadgeNumber = 0
            }
            

            当你的应用在前台打开时,你不能在收到本地通知后立即调用下面的方法来清除通知,否则你会收到上百条通知。也许是因为同样的通知再次应用,现在是开火的时候了,所以你保持开火,再次申请,开火,申请......:

            [UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
            

            【讨论】:

              【解决方案7】:

              在 Swift 中,我在 AppDelegate 中使用以下代码:

              func applicationDidBecomeActive(application: UIApplication) {
                  application.applicationIconBadgeNumber = 0
                  application.cancelAllLocalNotifications()
              }
              

              【讨论】:

                【解决方案8】:

                如果有预定的警报和未清除的应用程序图标徽章。

                NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications];
                NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber];
                
                [application cancelAllLocalNotifications];
                [application setApplicationIconBadgeNumber:0];
                
                for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
                    [application scheduleLocalNotification:scheduledLocalNotification];
                }
                [application setApplicationIconBadgeNumber:applicationIconBadgeNumber];
                

                【讨论】:

                  【解决方案9】:

                  如果您有待处理的预定本地通知,并且不想在通知中心使用cancelAllLocalNotifications 清除旧通知,您还可以执行以下操作:

                  [UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
                  

                  看来,如果您设置scheduledLocalNotifications,它会清除通知中心中的旧通知,并通过将其设置为自身,保留待处理的本地通知。

                  【讨论】:

                  • 这在 iOS 9 上对我来说就像一个魅力。我不想取消我的所有通知,因为它们会及时重复(每天或每周)。这样我就可以清除所有内容而不删除它们。
                  • 迄今为止我见过的最佳解决方案。有人知道它是否适用于 iOS 8?
                  • @duncanc4 上次我在 iOS 8 上测试它时它工作正常。
                  • 您会在应用内的哪个位置调用它?
                  • Alex,您应该在需要清除通知中心的通知时调用它。我在 AppDelegate 的 applicationDidBecomeActive:application:didReceiveLocalNotification: 方法中都调用它。
                  【解决方案10】:

                  在 applicationDidBecomeActive 中添加对 clearNotifications 的调用也可能有意义,这样如果应用程序在后台并返回,它也会清除通知。

                  - (void)applicationDidBecomeActive:(UIApplication *)application
                  {
                      [self clearNotifications];
                  }
                  

                  【讨论】:

                    【解决方案11】:

                    只是为了扩展 pcperini 的答案。正如他所提到的,您需要将以下代码添加到您的 application:didFinishLaunchingWithOptions: 方法中;

                    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
                    [[UIApplication sharedApplication] cancelAllLocalNotifications];
                    

                    另外如果您尝试从消息中心清除消息,则需要在 application:didReceiveRemoteNotification: 方法中增加然后减少徽章,以便当用户通过按下通知进入您的应用程序时消息中心也将清除,即;

                    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
                    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
                    [[UIApplication sharedApplication] cancelAllLocalNotifications];
                    

                    【讨论】:

                    • 我认为 cancelAllLocalNotifications 不是必需的。没有那条线为我工作
                    • @Murali 这取决于你是否使用本地通知...?
                    • UPDATE:: “cancelAllLocalNotifications' is deprecated: first deprecated in iOS 10.0” 所以如果你的应用程序版本高于 iOS10.0 那么你应该使用这个 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [中心 removeAllDeliveredNotifications]; [中心 removeAllPendingNotificationRequests];
                    【解决方案12】:

                    很可能因为通知中心是一项相对较新的功能,Apple 不一定要推出一种全新的通知清除模式。因此,他们转而使用多用途 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 来清除上述通知。这可能看起来有点奇怪,Apple 未来可能会提供更直观的方式来做到这一点,但目前它是官方的方式。

                    我自己,我用这个sn-p:

                    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
                    [[UIApplication sharedApplication] cancelAllLocalNotifications];
                    

                    它永远不会从通知中心清除应用程序的所有通知。

                    【讨论】:

                    猜你喜欢
                    • 2021-09-26
                    • 2012-04-15
                    • 1970-01-01
                    • 2021-09-14
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-08-02
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多