Question

I'm trying to create multiple local notifications, in my app, but for some reason only the First Notification Pop's up, the rest just does not work, this is my code.

I have a class named criaAlertas, which is responsible for creating the notifications, in that class i have the following method:

-(void)setarNotificacao:(NSInteger)quando nome:(UILocalNotification *)notification 
{
    UIApplication *myapp = [UIApplication sharedApplication];

    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:quando];
    notification.alertBody = @"Nice";
    notification.timeZone = [NSTimeZone defaultTimeZone];
    notification.soundName = UILocalNotificationDefaultSoundName;

    NSMutableArray *arrayOfNOtifications = [[NSMutableArray alloc]init];

    [arrayOfNOtifications addObject:notification];
    myapp.scheduledLocalNotifications = arrayOfNOtifications;
}

So i instantiated a object of that class, and tried to do this:

    criaAlertas *novoAlerta = [[criaAlertas alloc]init];
    UILocalNotification *notaUm = [[UILocalNotification alloc]init];
    UILocalNotification *notaDois = [[UILocalNotification alloc]init];
    [novoAlerta setarNotificacao:15 nome:notaUm];
    [novoAlerta setarNotificacao:30 nome:notaDois];

What i'm doing wrong?

Was it helpful?

Solution

The problem is that you're overwriting all of the local notifications currently scheduled with the call to your -setarNotificacao:nome: function. This line

    myapp.scheduledLocalNotifications = arrayOfNOtifications;

sets all of the currently scheduled notifications to arrayOfNotifications; if a notification currently scheduled is not in that array, then it is canceled.

The fix is to use the -[UIApplication scheduleLocalNotification:] method to schedule the notification, which adds the given notification without canceling any notifications already scheduled:

[myapp scheduleLocalNotification:notification];

OTHER TIPS

Try This one:

  -(IBAction)setRemind:(id)sender
   {
      NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

       NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init];
       dateFormatter2 setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
       //Gets our picker
       NSDate *selectedTime = [datePicker date];
       strDate2 = [dateFormatter2 stringFromDate:selectedTime];


      NSDate *Date=[dateFormatter2 dateFromString:strDate2];
      NSLog(@"selected Date fro str Over Here =======>>>>>>>>>>>>%@",Date);

     NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit ) fromDate:Date];

     // Set up the fire time
     NSDateComponents *dateComp = [[NSDateComponents alloc] init];
    [dateComp setDay:[dateComponents day]];
    [dateComp setMonth:[dateComponents month]];
    [dateComp setYear:[dateComponents year]];
    [dateComp release];

     NSDate *date = [calendar dateFromComponents:dateComp];
    [self scheduleAlarmForDate:date message:@"My First Local Notification."];
  }


   - (IBAction)scheduleAlarmForDate:(NSDate*)date message:(NSString*)msg
     {

         //====== TO SEE OLD NOTIFI=======
         UIApplication *Ap = [UIApplication sharedApplication];
         NSArray *arr = [Ap scheduledLocalNotifications];
         NSLog(@"Old Notifications :>> %@",arr);

       UIApplication* app = [UIApplication sharedApplication];
       UILocalNotification *alarm = [[UILocalNotification alloc] init];

     // Create a new notification
     alarm.fireDate = date;
     NSLog(@"fireDate IS >> %@", alarm.fireDate);
     alarm.timeZone = [NSTimeZone localTimeZone];
     alarm.alertBody = msg;
     NSLog(@"msg IS >> %@",msg);
     alarm.alertAction = @"Show";
     alarm.repeatInterval = NSDayCalendarUnit * 24 * 60 // it repeat every day ,set it as per you want 

     alarm.soundName = UILocalNotificationDefaultSoundName;
     alarm.applicationIconBadgeNumber = 1;
     [app scheduleLocalNotification:alarm];
     [alarm release];
  } 

Hope it will help.

Happy Coding...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top