如何在iPhone上取消本地通知

6

我正在制作一个需要设置通知的应用程序,幸运的是我能够设置本地通知,但我不知道如何删除由该应用程序(我的应用程序)设置的通知。 Xcode提供了使用removeAllNotifications功能来删除通知,但您无法删除应用程序设置的选定通知。


你可以在这里找到答案: https://dev59.com/CHA75IYBdhLWcg3wrrRS#3334028 - hiepnd
3个回答

18
你可以调用[[UIApplication sharedApplication] cancelLocalNotification:notification] 来取消通知。由于本地通知符合NSCoding协议,因此它们可以存储和检索以供以后取消。

感谢您的意见,但在该方法中应添加哪个参数才能取消通知?[UIApplicationsharedApplication]cancelLocalNotification:notification]再次感谢。 - mrugen munshi
1
好的,你必须在某个时候创建通知对象以安排它,所以使用那个对象!一旦你创建了通知对象,你可以使用NSCoding协议将其保存到磁盘上,并在以后(即下一个应用程序启动)加载它以供稍后取消。 - Ed Marty

10

我知道这篇帖子很旧,但希望这个解决方案能帮助到某些人

NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
    for(UILocalNotification *notification in notificationArray){
        if ([notification.alertBody isEqualToString:@"your alert body"]  && (notification.fireDate == your alert date time)) {
            // delete this notification
            [[UIApplication sharedApplication] cancelLocalNotification:notification] ;
        }
    }

我正在比较警报正文和日期时间,只是为了确保我删除的是正确的通知,因为有时会出现两个或多个通知具有相同的警报正文或时间的情况。


你应该使用 isEqualToDate: 而不是 == - Boris Y.

1

使用Xcode 8 beta 2在iOS 10及以下版本中的本地通知

#pragma mark - 在日期之前进行计算

-(void) calculateBeforedays:(int)_day hours:(int)_hours minutes:(int) _minutes { //_fir:(int)_firecount
    
    //Get Predefined Future date
    NSString *dateString =  [NSString stringWithFormat:@"%@T%@:00.000Z",_eventdate,_eventtime];
    NSLog(@"dateString %@",dateString);
    
    //    NSLog(@"_firecount %d",_firecount);
    //    //Get Predefined Future date
    //    NSString *dateString =  [NSString stringWithFormat:@"2016-12-31T12:%d:00.000Z",_firecount];
    //    NSLog(@"dateString %@",dateString);
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
    NSDate *marrigeDate = [dateFormatter dateFromString:dateString];
    
    
    // Set reminder date before marrige date
    int setDay = _day;
    int setHours = _hours;
    int setMins = _minutes;
    float milliseconds =   (setDay * 24 * 60 * 60 ) + (setHours * 60 * 60 ) + (setMins * 60 );
    
    
    NSDate *someDateInUTC = [NSDate date];
    NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];
    NSDate *dateInLocalTimezone = [someDateInUTC dateByAddingTimeInterval:timeZoneSeconds];
    
    //Get Current date
    NSDate *currentDate = dateInLocalTimezone;
    NSTimeInterval marigeTimeInterval = [marrigeDate timeIntervalSinceDate:currentDate];
    
    //Get difference between time
    NSTimeInterval timeIntervalCountDown = marigeTimeInterval - milliseconds;
    
    //Set perticulater timer
    NSDate *timerDate = [NSDate dateWithTimeIntervalSinceNow:timeIntervalCountDown];
    [self triggerNotification:timerDate];
    
}

#pragma mark- Trigger Reminders
- (void)triggerNotification:(NSDate *) reminderDate {
    
    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){
        // create actions
#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        // create actions
        UNNotificationAction *acceptAction = [UNNotificationAction actionWithIdentifier:@"com.inviteapp.yes"
                                                                                  title:@"Accept"
                                                                                options:UNNotificationActionOptionForeground];
        UNNotificationAction *declineAction = [UNNotificationAction actionWithIdentifier:@"com.inviteapp.no"
                                                                                   title:@"Decline"
                                                                                 options:UNNotificationActionOptionDestructive];
        UNNotificationAction *snoozeAction = [UNNotificationAction actionWithIdentifier:@"com.inviteapp.snooze"
                                                                                  title:@"Snooze"
                                                                                options:UNNotificationActionOptionDestructive];
        NSArray *notificationActions = @[ acceptAction, declineAction, snoozeAction ];
        
        // create a category
        UNNotificationCategory *inviteCategory = [UNNotificationCategory categoryWithIdentifier:CYLInviteCategoryIdentifier actions:notificationActions intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
        
        NSSet *categories = [NSSet setWithObject:inviteCategory];
        
        // registration
        [center setNotificationCategories:categories];
#endif
    }
    else if([[[UIDevice currentDevice] systemVersion] floatValue] > 8.0f){
        // create actions
        UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];
        acceptAction.identifier = @"com.inviteapp.yes";
        acceptAction.title = @"Accept";
        acceptAction.activationMode = UIUserNotificationActivationModeBackground;
        acceptAction.destructive = NO;
        acceptAction.authenticationRequired = NO; //If YES requies passcode, but does not unlock the device
        
        UIMutableUserNotificationAction *declineAction = [[UIMutableUserNotificationAction alloc] init];
        declineAction.identifier = @"com.inviteapp.no";
        acceptAction.title = @"Decline";
        acceptAction.activationMode = UIUserNotificationActivationModeBackground;
        declineAction.destructive = YES;
        acceptAction.authenticationRequired = NO;
        
        UIMutableUserNotificationAction *snoozeAction = [[UIMutableUserNotificationAction alloc] init];
        snoozeAction.identifier = @"com.inviteapp.snooze";
        acceptAction.title = @"Snooze";
        snoozeAction.activationMode = UIUserNotificationActivationModeBackground;
        snoozeAction.destructive = YES;
        snoozeAction.authenticationRequired = NO;
        
        // create a category
        UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];
        inviteCategory.identifier = CYLInviteCategoryIdentifier;
        NSArray *notificationActions = @[ acceptAction, declineAction, snoozeAction ];
        
        [inviteCategory setActions:notificationActions forContext:UIUserNotificationActionContextDefault];
        [inviteCategory setActions:notificationActions forContext:UIUserNotificationActionContextMinimal];
        
        // registration
        NSSet *categories = [NSSet setWithObject:inviteCategory];
        UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:categories];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    }
    
    /// 2. request authorization for localNotification
    [self registerNotificationSettingsCompletionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (!error) {
            NSLog(@"request authorization succeeded!");
        }
    }];
    
    
    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){
#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        [self localNotificationForiOS10:reminderDate];
#endif
    } else {
        [self localNotificationBelowiOS10: reminderDate];
    }
    
}

- (void)registerNotificationSettingsCompletionHandler:(void (^)(BOOL granted, NSError *__nullable error))completionHandler; {
   
    /// 2. request authorization for localNotification
    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){
#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                              completionHandler:completionHandler];
#endif
    } else if([[[UIDevice currentDevice] systemVersion] floatValue] > 8.0f){
        UIUserNotificationSettings *userNotificationSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge)
                                                                                                 categories:nil];
        UIApplication *application = [UIApplication sharedApplication];
        [application registerUserNotificationSettings:userNotificationSettings];
    }
}

设置多个通知:

iOS 10,添加不同的requestWithIdentifier

pragma mark- iOS 10以上本地通知

-(void) localNotificationForiOS10:(NSDate *) _reminderDate{
    
    _eventReminderDate = _reminderDate;
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    [calendar setTimeZone:[NSTimeZone localTimeZone]];
    
    NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitTimeZone fromDate:_reminderDate];
    NSLog(@"NSDateComponents %@",components);
    
    
    UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
    objNotificationContent.title = [NSString localizedUserNotificationStringForKey:_eventname arguments:nil];
    objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@"You have event reminder"
                                                                        arguments:nil];
    objNotificationContent.sound = [UNNotificationSound defaultSound];
    
    /// 4. update application icon badge number
    objNotificationContent.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);
    
    
    UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:NO];
    
    
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"eventdate"
                                                                          content:objNotificationContent trigger:trigger];
    
    
    /// 3. schedule localNotification
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"Local Notification succeeded");
        }
        else {
            NSLog(@"Local Notification failed");
        }
    }];
}

如果要在iOS 10以下设置多个通知,请添加不同的用户信息

pragma mark- 小于iOS 10的本地通知

-(void) localNotificationBelowiOS10:(NSDate *) _reminderDate{
    
    _eventReminderDate = _reminderDate;
    NSLog(@"dateInLocalTimezone %@",_eventReminderDate);
    
    /// 3. schedule localNotification
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.fireDate = _eventReminderDate ;
    localNotification.alertTitle = _eventname;
    localNotification.alertBody = @"You have Event Name";
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    localNotification.repeatInterval = 0;
    localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
    
    
    NSDictionary *info  =   [NSDictionary dictionaryWithObject:_eventname forKey:_eventname];
    localNotification.userInfo =   info;
    NSLog(@"info ---- %@",info);
    NSLog(@"notification userInfo gets name : %@",[info objectForKey:_eventname]);
  
    
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

删除特定本地通知

-(IBAction)deleteReminder:(id)sender{
    
    UIButton *senderButton = (UIButton *)sender;
    _selectedRow = senderButton.tag;
    NSIndexPath *indexPath=[NSIndexPath indexPathForRow:senderButton.tag inSection:0]; // if section is 0
    ReminderCell * cell = (ReminderCell*)[_tableView cellForRowAtIndexPath:indexPath];
    

    _eventname = [[_eventArray objectAtIndex:indexPath.row] objectForKey:@"event_name"];
    _eventdate = [[_eventArray objectAtIndex:indexPath.row] objectForKey:@"event_date"];
    _eventtime = [[_eventArray objectAtIndex:indexPath.row] objectForKey:@"event_st"];
    
    
    
    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){
        
#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        

        // remove all local notification:
        [center removePendingNotificationRequestsWithIdentifiers:@[_eventname]];

#endif
    } else {
        
        NSLog(@"Delete notification below ios 10");
        UIApplication *app = [UIApplication sharedApplication];
        NSArray *eventArray = [app scheduledLocalNotifications];
        for (int i=0; i<[eventArray count]; i++)
        {
            UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
            NSDictionary *userInfoCurrent = oneEvent.userInfo;
            NSString *ename=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:_eventname]];
            
            if ([ename isEqualToString:_eventname])
            {
                //Cancelling local notification
                [app cancelLocalNotification:oneEvent];
      
                break;
            }
        }
    }
   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接