2014-12-11 4 views
1

Я хотел бы создать локальное уведомление с пользовательский интервал повторения (каждые 20 дней, например). Я знаю, что у нас есть NSDayCalendarUnit, kCFCalendarUnitMonth ... но я надеюсь установить интервал повторения через 20 дней. Я не хочу создавать уведомление для каждого дня.UILocalNotification repeatInterval на 20 дней

Моя настоящая необходимость - повторять уведомление в течение 21 дня подряд, затем не запускать его в течение 7 дней, затем 21 день с уведомлением и 7 дней без ... и т.д. Я должен запланировать все эти дней, даже если приложение неактивно.

Для этого я решил создать 21 уведомлений с момента даты пожара с repeatInterval = 28 дней (здесь проблема)

ответ

0

Если вы хотите запланировать UILocalNotification в течение 20 дней в будущем от текущего времени вы хотел бы сделать это:

NSCalendar *currentCalendar = [NSCalendar currentCalendar]; 
NSDateComponents *dateComp = [[NSDateComponents alloc] init]; 
int desiredAmountOfMonths = 4; 
for (int month = 0; month < desiredAmountOfMonths; month++) 
{ 
    dateComp.month = month; 
    dateComp.day = 20; 
    NSDate *fireDate = [currentCalendar dateByAddingComponents:dateComp toDate:[NSDate date] options:NSCalendarMatchNextTimePreservingSmallerUnits]; 

    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    notification.fireDate = fireDate; 
    notification.timeZone = [NSTimeZone defaultTimeZone]; 
} 

Вам нужно будет изменить UILocalNotification для чего сообщения, звук и т.д., а затем огонь уведомление, как только сделать настройки.

+0

Вы не можете использовать 86400 в течение одного дня. – Fogmeister

+0

Разве это не количество секунд в солнечный день? Или вы могли бы объяснить, почему вы не можете использовать это? –

+0

Дни не всегда 86 400 секунд. Вы должны использовать функции NSCalendar для вычисления временных периодов. – Fogmeister

2

Попробуйте это, вы можете изменить Intervall, выбрав setDay, setMonth, ....:

NSCalendar *calendar = [NSCalendar currentCalendar]; 

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:3]; 

NSDate *date3Days = [calendar dateByAddingComponents:components 
               toDate:[NSDate date] 
               options:0]; 

UIApplication* app = [UIApplication sharedApplication]; 
NSArray* oldNotifications = [app scheduledLocalNotifications]; 
if (oldNotifications) { 
    [app cancelAllLocalNotifications]; 
    app.applicationIconBadgeNumber = 0; 
} 

UILocalNotification* notifyAlarm = [[UILocalNotification alloc] init]; 
if (notifyAlarm) { 
    notifyAlarm.fireDate = date3Days; 
    notifyAlarm.timeZone = [NSTimeZone defaultTimeZone]; 
    notifyAlarm.alertBody = NSLocalizedString(@"Push message", @""); 
    notifyAlarm.soundName = @"sound.wav"; 
    [app scheduleLocalNotification:notifyAlarm]; 
} 

Если вы хотите установить определенное время, по истечении которого UILocalNotifications должно появиться вы можете создать способ вышеуказанного раствора и петля над массив, который указывает на то, что дни вы хотели бы показать уведомление:

NSArray *arrayNumbers = @[@5, @7, @14, @21, @30, @60, @90, @120]; 
NSDictionary *dictNotifications = 
[[NSUserDefaults standardUserDefaults] objectForKey:kUserDefAppStarts]; 

for (NSNumber *bla in arrayNumbers){ 

    NSString *strKey = [NSString stringWithFormat:@"%@%@", kUserDefAppStarts, bla]; 
    NSDictionary *dict = dictNotifications[strKey]; 
    NSString *strMessageQuestion = dict[kKeyMessage]; 

    [self createNotificationWithNumberOfDays:[bla integerValue] 
            andMessage:strMessageQuestion 
            userInfo:dict]; 
} 

а вот й Метод е вы должны вызвать

+ (void)createNotificationWithNumberOfDays:(int)days 
           andMessage:(NSString *)message 
            userInfo:(NSDictionary *)dict{ 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:days]; 

NSDate *dateAlert = [gregorian dateByAddingComponents:components toDate:[NSDate date] options:0]; 

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

if(notifyAlarm){ 
    [notifyAlarm setFireDate:dateAlert]; 
    [notifyAlarm setTimeZone:[NSTimeZone defaultTimeZone]]; 
    [notifyAlarm setSoundName:@"soundname"]; 
    [notifyAlarm setAlertBody:message]; 
    [notifyAlarm setUserInfo:dict]; 
    [app scheduleLocalNotification:notifyAlarm]; 
} 

}

+1

Yup, собирался это сказать. – Fogmeister

+0

Это ответ на ваш вопрос? Не забудьте отметить это как правильно, чтобы люди знали, какой из них является правильным ответом. –

+0

Это просто для этого. Но я хотел бы создать только одно уведомление, которое запускает уведомление каждые 20 дней. –

Смежные вопросы