2016-04-01 4 views
0

I Alarm Anwendung tue, in meiner Anwendung i UILocalNotification gefeuert haben damit Wiederholungsintervall wird mit (Ebenso: Jeder Tag, Wochentag, .. etc.), Nach dem Abfeuern annulliere ich alle Benachrichtigung und Neuterminierung der alle Benachrichtigung erneut, aber die gleiche Benachrichtigung, die bereits gefeuert wird wieder statt es sollte kommen für seine zukünftige Zeit, die es nächste Feuerdatum hat, aber es kommt wieder .abbrechen und Neuterminierung UILocalNotification mit Wiederholungsintervall feuert wieder

Mein Code:

-(void) setAlarmNotification:(NSDictionary *)dictionaryForAlarm { 

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

    [localNotification setUserInfo:dictionaryForAlarm]; 
    [localNotification setAlertBody:[NSString stringWithFormat:kDefaultNotificationMessage]]; 
    [localNotification setSoundName:[NSString stringWithFormat:@"%@.%@",[dictionaryForAlarm objectForKey:kAlarmSoundName],[[GlobalClass getSoundDetails:[dictionaryForAlarm objectForKey:kAlarmSoundName]] objectForKey:kSoundExtention]]]; 
    [localNotification setTimeZone:[NSTimeZone localTimeZone]]; 

    // setting weather to provide snooze option or not 
    if([[dictionaryForAlarm objectForKey:kAlarmSnooze] integerValue]){ 

     [localNotification setCategory:kNotificationCategoryIdentity]; 
    } 

    // Set Notification with repeat/ also check its not firing the snooze notification 
    if(([[dictionaryForAlarm objectForKey:kAlarmRepeatState] intValue] == ALARMREPEATSTATEE_ON) && ([[dictionaryForAlarm objectForKey:kAlarmSnoozeState] intValue] == ALARMSNOOZESTATE_OFF)){ 

     NSString *stringForRepetAlarmDays = [dictionaryForAlarm objectForKey:kAlarmRepeat]; 

     NSCalendar *calendar = [NSCalendar currentCalendar]; 
     NSDateComponents *componentsForFireDate = [calendar components:(NSCalendarUnitYear | NSCalendarUnitWeekOfYear | NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond | NSCalendarUnitWeekday) fromDate: [dictionaryForAlarm objectForKey:kAlarmSnoozeDate]]; 

     if([stringForRepetAlarmDays intValue] == REPEATALARM_ALL){ 

      // every day 
      localNotification.repeatInterval = NSCalendarUnitDay; 
      localNotification.fireDate=[calendar dateFromComponents:componentsForFireDate]; 
      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

      [self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[calendar dateFromComponents:componentsForFireDate] withRepeatInterval:NSCalendarUnitDay isForSnooze:NO]; 

     }else{ 

      NSArray *arrayForRepeatDays = [stringForRepetAlarmDays componentsSeparatedByString:@","]; // geting the days array @"1,2,3.." => [@"1",@"2",.] 

      if(arrayForRepeatDays.count > 1){ 

       // custom days 
       for (NSString *dayOfWeek in arrayForRepeatDays) { 

        // Creating multiple objects for each day to fire //$$$$$ 
        UILocalNotification *localNotificationRepeat = [[UILocalNotification alloc]init]; 

        [localNotificationRepeat setUserInfo:dictionaryForAlarm]; 
        [localNotificationRepeat setAlertBody:[NSString stringWithFormat:kDefaultNotificationMessage]]; 
        [localNotificationRepeat setSoundName:[NSString stringWithFormat:@"%@.%@",[dictionaryForAlarm objectForKey:kAlarmSoundName],[[GlobalClass getSoundDetails:[dictionaryForAlarm objectForKey:kAlarmSoundName]] objectForKey:kSoundExtention]]]; 
        [localNotificationRepeat setTimeZone:[NSTimeZone localTimeZone]]; 

        // setting weather to provide snooze option or not 
        if([[dictionaryForAlarm objectForKey:kAlarmSnooze] integerValue]){ 

         [localNotificationRepeat setCategory:kNotificationCategoryIdentity]; 
        } 

        [componentsForFireDate setWeekday:[dayOfWeek integerValue]]; 
        localNotificationRepeat.repeatInterval = NSCalendarUnitWeekOfYear;; 
        localNotificationRepeat.fireDate=[calendar dateFromComponents:componentsForFireDate]; 
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotificationRepeat]; 

        [self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[calendar dateFromComponents:componentsForFireDate] withRepeatInterval:NSCalendarUnitWeekOfYear isForSnooze:NO]; 
       } 

      }else{ 

       // single repeat 
       [componentsForFireDate setWeekday: [arrayForRepeatDays[0] intValue]] ; 
       localNotification.repeatInterval = NSCalendarUnitWeekOfYear; 
       localNotification.fireDate=[calendar dateFromComponents:componentsForFireDate]; 
       [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

       [self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[calendar dateFromComponents:componentsForFireDate] withRepeatInterval:NSCalendarUnitWeekOfYear isForSnooze:NO]; 
      } 

     } 

    }else{ 

     [localNotification setFireDate:[dictionaryForAlarm objectForKey:kAlarmSnoozeDate]]; 
     [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

     [self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[dictionaryForAlarm objectForKey:kAlarmSnoozeDate] withRepeatInterval:NSCalendarUnitDay isForSnooze:NO]; 
    } 

} 


- (void)cancelAlarmNotification:(NSString *)stringForNotificationID { 

    UIApplication *app = [UIApplication sharedApplication]; 
    NSArray *arrayForNotifications = [app scheduledLocalNotifications]; 

    for (int i=0; i<[arrayForNotifications count]; i++) 
    { 
     UILocalNotification* localNotification = [arrayForNotifications objectAtIndex:i]; 

     if ([[localNotification.userInfo valueForKey:kAlarmID] isEqualToString:stringForNotificationID]) 
     { 
      //Cancelling local notification 
      [app cancelLocalNotification:localNotification]; 
     } 
    } 
} 

-(void)repetativeLocalnotificationDictionary:(NSDictionary *) notificationInfo andFireDate:(NSDate *)fireDate withRepeatInterval:(NSCalendarUnit) repeatInterval isForSnooze:(BOOL) fromSnooze { 

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

    [repeatNotification setFireDate:[NSDate dateWithTimeInterval:kDefaultImmediateNotificationTime sinceDate:fireDate]]; 
    [repeatNotification setUserInfo:notificationInfo]; 
    [repeatNotification setAlertBody:[NSString stringWithFormat:kDefaultNotificationMessage]]; 
    [repeatNotification setSoundName:[NSString stringWithFormat:@"%@.%@",[notificationInfo objectForKey:kAlarmSoundName],[[GlobalClass getSoundDetails:[notificationInfo objectForKey:kAlarmSoundName]] objectForKey:kSoundExtention]]]; 
    [repeatNotification setTimeZone:[NSTimeZone localTimeZone]]; 
    [repeatNotification setRepeatInterval:repeatInterval]; 


    // setting weather to provide snooze option or not 
    if([[notificationInfo objectForKey:kAlarmSnooze] integerValue]){ 

     [repeatNotification setCategory:kNotificationCategoryIdentity]; 
    } 


    [[UIApplication sharedApplication] scheduleLocalNotification:repeatNotification]; 
} 
  • Sag mir, wenn ich etwas fehlt

Vielen Dank im Voraus!

+0

Sie sollten eine eindeutige ID übergeben, um die Benachrichtigung abzubrechen. – salmancs43

+0

Ja, ich habe das getan, aber das ist auch Abbrechen der Zukunft Wiederholungsbenachrichtigungen –

+0

Als Ihre ID ist nicht eindeutig. Generieren Sie eine eindeutige ID und weisen Sie sie beim Speichern des Alarms im Info-Wörterbuch zu. – salmancs43

Antwort

0

Dies ist der Code, in dem die Benachrichtigung täglich ausgelöst wird.

-(void) scheduleLocalNotificationDaily:(NSDate *)fireDate 
{ 

     NSDictionary * infoDict = @{ 
        @"alarmUiqueId" : uID, 

        }; 

    NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSCalendarUnitSecond 
                  fromDate:fireDate]; 
    fireDate = [fireDate dateByAddingTimeInterval:-comp.second]; 
    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    localNotif.fireDate = fireDate; 
    localNotif.timeZone = [NSTimeZone localTimeZone];  
    localNotif.alertBody = @"Time to wake Up"; 
    localNotif.alertAction = @"Show me"; 

    localNotif.soundName = @"3D bird tone.mp3"; 


     localNotif.userInfo = infoDict; 

    localNotif.repeatInterval = NSCalendarUnitDay; 
    NSLog(@" date %lu",kCFCalendarUnitDay); 
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 


} 

und für das Abbrechen dieser bestimmten Benachrichtigung auf Schalter oder etwas anderes.

for(UILocalNotification *notification in notificationArray) 
      { 

       NSLog(@"%@",[notification.userInfo valueForKey:@"alarmUiqueId"]); 
       NSLog(@"%@",alrm.uniqueId); 
       if ([[notification.userInfo valueForKey:@"alarmUiqueId" ] isEqualToNumber: alrm.uniqueId]) 
       { 
        [[UIApplication sharedApplication] cancelLocalNotification:notification ] ; 
       } 
      } 
Verwandte Themen