slaveCoder
slaveCoder

Reputation: 537

How to overwrite or update a UILocalNotification

I'm using a UILocalNotification object to give notification to my application. Currently each time an event is generated i popup a notification.

  notification.alertBody=@"Event Occurs 2";
  notification.alertAction=@"Open";
  [[UIApplication sharedApplication]presentLocalNotificationNow:notification];

But, since the events keep on happening, each time a new notification is generated.

Is there a way to update a notification, if it is already present and create a new notification if not present.

Upvotes: 3

Views: 3427

Answers (3)

3lvis
3lvis

Reputation: 4180

It's not possible to update the notification but if you attach a dictionary with a key to the alert:

UILocalNotification *notification = [[UILocalNotification alloc] init];

NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[userInfo setObject:alarmID forKey:@"AlarmKey"];
// Set some extra info to your alarm
notification.userInfo = userInfo;

Then you can retrieve the local notification, cancel it and make a new one with updated content.

+ (UILocalNotification *)existingNotificationWithAlarmID:(NSString *)alarmID
{
    for (UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
        if ([[notification.userInfo objectForKey:@"AlarmKey"] isEqualToString:alarmID]) {
            return notification;
        }
    }

    return nil;
}

You cancel the notification like this:

- (void)cleanUpLocalNotificationWithAlarmID:(NSString *)alarmID
{
    UILocalNotification *notification = [self existingNotificationWithAlarmID:alarmID];
    if (notification) {
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
    }
}

Upvotes: 1

joels
joels

Reputation: 1312

You can't update an already scheduled Local Notication. You can however, cancel it and reschedule a new one.

Cancel your local notification:

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 *uid=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:@"uid"]];
    if ([uid isEqualToString:uidtodelete])
    {
        //Cancelling the specific local notification
        [app cancelLocalNotification:oneEvent];
        //Schedule your new "updated" local notification here.
        break;
    }
}

This will loop through all scheduled local notifications and delete the local notification you want deleted. Note, you'll need to set a unique property to each notification to distinguish between others (in the example above, it is assumed userInfo contains a unique "uid").

Thanks to KingofBliss for code above on how to delete specific local notifications.

Upvotes: 4

Mat&#237;as R
Mat&#237;as R

Reputation: 2195

No, there is no way to modify a local notification that has been scheduled. You'll have to cancel the notification and schedule it again.

Upvotes: 0

Related Questions