6

I am making the application that has needs to set the notification , thankfully i was able t set the local notification but i dont know how to delete the notification which is set by this application(my aplicaton ).The xcode does provide functionality of delete with removeAllNotifications but you cannot remove the selected notifications set by the application

mrugen munshi
  • 3,497
  • 9
  • 36
  • 50
  • You may find your answer here: http://stackoverflow.com/questions/3158264/cancel-uilocalnotification/3334028 – hiepnd Jul 31 '10 at 17:50

3 Answers3

18

You can call [[UIApplication sharedApplication] cancelLocalNotification:notification] to cancel a notification. Since local notifications conform to the NSCoding protocol, they can be stored and retrieved for later canceling.

Ed Marty
  • 39,590
  • 19
  • 103
  • 156
  • thansk for your inputs but what should i add pass in notification in the mehtod [UIApplicationsharedApplication]cancelLocalNotification:notification] thanks again – mrugen munshi Aug 13 '10 at 12:10
  • 1
    Well, you have to create the notification object at some point to schedule it, so use that object! Once you've created the notification object, you can save it to disk using the NSCoding protocol, and load it again later (i.e. next app launch) for later canceling. – Ed Marty Aug 14 '10 at 13:24
10

I know this post is old but hope this solution helps someone

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] ;
        }
    }

I am comparing the alert body and date time just to make sure that i am deleting the right notification since there are chances where two or more notifications can have the same alert body or time.

Bug Hunter Zoro
  • 1,743
  • 18
  • 21
1

Local Notification in iOS 10 and Below iOS 10 with Xcode 8 beta 2

pragma mark - Calculate Before Date

-(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];
    }
}

for setting multiple notifications: iOS 10, add different requestWithIdentifier

pragma mark- Locanotification more than 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");
        }
    }];
}

for setting multiple notifications below iOS 10, add different userinfo

pragma mark- Locanotification less than 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];
}

pragma mark- Delete Perticulater Local Notification

-(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;
            }
        }
    }
   
}
Community
  • 1
  • 1
Anil Gupta
  • 1,155
  • 1
  • 19
  • 26