2016-04-01 3 views
0

を発射されて、私のアプリケーションでは、私はそれが繰り返し間隔持っていると UILocalNotificationを発射している(同様に:すべての 日、平日、...など)を、すべての通知をキャンセルしてすべての通知を再スケジューリングしていますが、すでに同じ番号の 通知が再度送信されています。 は、次回の予定日時に来る予定ですが、今後は になります。はキャンセルと繰り返し間隔で再スケジューリングUILocalNotificationは、私は、アラームアプリをやって再び

マイコード:

-(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]; 
} 
  • を私は

何かを欠落している場合を教えてください、事前にあなたに感謝!

+0

通知をキャンセルするには、一意のIDを渡す必要があります。 – salmancs43

+0

はい、私はそれをしましたが、将来のリピート通知をキャンセルすることもあります。 –

+0

あなたのIDは一意ではありません。あなたのアラームを保存するときに一意のIDを生成し、それを情報辞書に割り当てます。 – salmancs43

答えて

0

これは、通知が毎日発生するコードです。

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


} 

この特定の通知を取り消すために、スイッチまたは他の何か。

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 ] ; 
       } 
      } 
関連する問題