naddypaddy
naddypaddy

Reputation: 81

Cancelling a specific UILocalNotification

I have this code for local notification, and I have a scheduleNotification and clearNotification using my own method. These are the codes:

- (void)clearNotification {
   [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

- (void)scheduleNotification {
   [reminderText resignFirstResponder];
   [[UIApplication sharedApplication] cancelAllLocalNotifications];

   Class cls = NSClassFromString(@"UILocalNotification");
   if (cls != nil) {
      UILocalNotification *notif = [[cls alloc] init];
      notif.fireDate = [[datePicker date] dateByAddingTimeInterval:-30];
      notif.timeZone = [NSTimeZone defaultTimeZone];

      notif.alertBody = @"Evaluation Planner";
      notif.alertAction = @"Details";
      notif.soundName = UILocalNotificationDefaultSoundName;
      notif.applicationIconBadgeNumber = 1;

     NSDictionary *userDict = [NSDictionary dictionaryWithObject:reminderText.text forKey:kRemindMeNotificationDataKey];
     notif.userInfo = userDict;
     [[UIApplication sharedApplication] scheduleLocalNotification:notif];
     [notif release];
    }
}

These codes works well, but now I want to know how do I know which notification object will it delete. I would like to create an ID for a notification, meaning, one ID is equivalent to one notification. But I don't know at which part I should do that. Plus I need to find a way to include all this to be in a plist.

Hope somebody can help me. Thanks.

Upvotes: 3

Views: 4746

Answers (3)

Srinivas
Srinivas

Reputation: 983

NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
for (UILocalNotification *not in notifications) {
    NSString *dateString=[not.userInfo valueForKey:@"EndDate"];
    if([dateString isEqualToString:@"CompareString"])
    { 
        [[UIApplication sharedApplication] cancelLocalNotification:not];
    }
}
  1. Give user info whenever you create local notification (this is a key-value pair).
  2. Iterate through notifications (it contains All Local Notifications) and compare value for the known key. In the above example I am using EndDate as the key and CompareString as the value.

Its Working Fine With Me.

Cheers..

Upvotes: 12

emma ray
emma ray

Reputation: 13620

I would suggest using the userInfo property on UILocalNotification, as others have mentioned. A simpler implementation that the accepted answer would be:

for(UILocalNotification* notification in [[UIApplication sharedApplication]scheduledLocalNotifications])
{
       if([[notification.userInfo objectForKey:@"notification_identifier"] isEqualToString:@"notification_001"])
       {
            [[UIApplication sharedApplication] cancelLocalNotification:notification];
       }
}

A for loop like this is much simpler. I'm not sure if it's more or less optimal, but it's certainly easier to read, and I assume you only have a few notifications to loop through anyway.

Upvotes: 0

Deepak Kumar
Deepak Kumar

Reputation: 45

(void)cancelLocalNotification:(NSString*)notificationID
{

   // UILocalNotification *cancelThisNotification = nil;
  //  BOOL hasNotification = NO;

    for (int j =0;j<[[[UIApplication sharedApplication]scheduledLocalNotifications]count]; j++)
    {
        UILocalNotification *someNotification = [[[UIApplication sharedApplication]scheduledLocalNotifications]objectAtIndex:j];
        if([[someNotification.userInfo objectForKey:@"drdid"] isEqualToString:notificationID])
        {
            NSLog(@"id,notificationID(App) %@ %@ ",[someNotification.userInfo objectForKey:@"drdid"],notificationID);
            NSLog(@"canceled notifications %@",someNotification);
           [[UIApplication sharedApplication] cancelLocalNotification:someNotification];
        }

    }
}

Upvotes: 2

Related Questions