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

4

1 に答える 1

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];
于 2012-04-17T06:05:24.707 に答える