2012-04-16 14 views
1

私はアラームアプリを作成しています。ここでは、日付と時刻のイベントを作成し、火事の日付を選択することで通知する必要があります今、5,15,30分前など)と繰り返し間隔(決して、毎日、毎週、毎月、毎年)を繰り返します。問題は、ユーザーがイベントを作成したときに、すでにイベントが発生している(たとえば、イベントが4月10日に発生し、今日が4月16日である場合など)、このイベントについて正しい時間内に通知する必要がありますが、それ。だから、起こってはならない。どうすればこれを避けることができますか?ここ は、ユーザーが任意の繰り返し間隔を選択していない場合にのみ、このバグが発生した通知過去に既に発生したイベントのローカル通知

- (void)notificationWithNote:(Note *)scheduledNote deleteThisNotification:(BOOL)deleteNotification { 

    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar]; 
    unsigned int unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit; 
    NSDateComponents *comp = [calendar components:unitFlags fromDate:scheduledNote.date]; 

     ToDoItem *todoitem = [[ToDoItem alloc] init]; 
     todoitem.day = [comp day]; 
     todoitem.month = [comp month]; 
     todoitem.year = [comp year]; 
     todoitem.hour = [comp hour]; 
     todoitem.minute = [comp minute]; 
     todoitem.eventName = scheduledNote.event; 

    NSDateComponents *dateComps = [[NSDateComponents alloc] init]; 
    [dateComps setDay:todoitem.day]; 
    [dateComps setMonth:todoitem.month]; 
    [dateComps setYear:todoitem.year]; 
    [dateComps setHour:todoitem.hour]; 
    [dateComps setMinute:todoitem.minute]; 
    NSDate *itemDate = [calendar dateFromComponents:dateComps]; 
    [dateComps release]; 


    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    if (localNotif == nil) 
     return; 
    if ([scheduledNote.remindTime intValue] == 1) 
     localNotif.fireDate = itemDate; 
    else 
     localNotif.fireDate = [itemDate dateByAddingTimeInterval:-([scheduledNote.remindTime intValue]*60)]; 


    switch ([scheduledNote.repeatOption intValue]) { 
     case 0: 
      localNotif.repeatInterval = 0; 
      break; 
     case 1: 
      localNotif.repeatInterval = NSDayCalendarUnit; 
      break; 
     case 2: 
      localNotif.repeatInterval = NSWeekCalendarUnit; 
      break; 
     case 3: 
      localNotif.repeatInterval = NSMonthCalendarUnit; 
      break; 
     case 4: 
      localNotif.repeatInterval = NSYearCalendarUnit; 
      break; 
     default: 
      break; 
    } 

    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 
    localNotif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"%@ begins", nil), scheduledNote.event]; 
    localNotif.alertAction = NSLocalizedString(@"View Details", nil); 
    localNotif.soundName = UILocalNotificationDefaultSoundName; 
    localNotif.applicationIconBadgeNumber = 1; 
    NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:todoitem.eventName,ToDoItemKey, @"Timenote is coming", MessageTitleKey, nil]; 
    localNotif.userInfo = infoDict; 

    if (deleteNotification) 
     [[UIApplication sharedApplication] cancelLocalNotification:localNotif]; 
    else 
     [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 

    NSLog(@"fire date: %@",[localNotif.fireDate description]); 
    [todoitem release]; 
    [localNotif release]; 
} 

を作成する方法、です。イベントが毎日、毎週、毎月、または毎年繰り返される場合は、時間通りに表示されます。だから問題は実際の場合ですlocalNotif.repeatInterval == 0

答えて

1

私は答えを見つけました。問題が発生した場合のみ、繰り返し間隔がない場合は、この条件を確認する必要があります。fireDateが現在の日付よりも小さく、繰り返し間隔がない場合は、この通知をスケジュールしないでください。

NSComparisonResult result = [localNotif.fireDate compare:[NSDate date]]; 

if (((localNotif.repeatInterval == 0) && (result == NSOrderedAscending)) || deleteNotification) 
{ 
    [[UIApplication sharedApplication] cancelLocalNotification:localNotif]; 
} 
else 
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
関連する問題