23

Я делаю приложение для iPhone, которое требует локальных уведомлений.Как установить интервал повторения локального уведомления на пользовательский интервал времени?

В локальных уведомлениях есть repeatInterval собственность, где можно положить интервалы блока повторения для mintute, часа, дня, недели, года и т.д.

Я хочу, чтобы интервал повторения должен быть 4 часа.

Итак, каждый 4 часа приходит местное уведомление.

Я не хочу, чтобы пользователь настраивал отдельные уведомления для каждого.

Я хочу, чтобы пользователь мог установить repeatInterval как 4 часа.

Как это сделать?

ответ

42

Получил ответ

Это так прямо, как он получает.

Нельзя создавать пользовательские интервалы повторения.

Вы должны использовать встроенные временные интервалы времени NSCalendarUnit.

Я пробовал все вышеупомянутые решения и даже пробовал другие продукты, но ни один из них не работал.

Я потратил достаточно времени на то, чтобы выяснить, что мы не можем заставить его работать с пользовательскими интервалами времени.

Надеюсь, это поможет всем, кто ищет решение.

Спасибо всем, кто пытался ответить на мой вопрос. Спасибо, парни!!

17

интервал повтора просто перечисление, который имеет постоянную битовой карты, так что нет никакого способа, чтобы иметь собственный repeatIntervals, только каждую минуту, каждую секунду, каждую неделю, и т.д.

Это, как говорится , нет причин, по которым ваш пользователь должен будет установить каждый из них. Если вы позволите им установить два значения в вашем пользовательском интерфейсе, что-то вроде «» и «Every ____ years/months/weeks/hours», то вы можете автоматически генерировать соответствующие уведомления, установив соответствующую дату огня без повтора.

UILocalNotification *locNot = [[UILocalNotification alloc] init]; 
NSDate *now = [NSDate date]; 
NSInterval interval; 
switch(freqFlag) {  // Where freqFlag is NSHourCalendarUnit for example 
    case NSHourCalendarUnit: 
     interval = 60 * 60; // One hour in seconds 
     break; 
    case NSDayCalendarUnit: 
     interval = 24 * 60 * 60; // One day in seconds 
     break; 
} 
if(every == 1) { 
    locNot.fireDate = [NSDate dateWithTimeInterval: interval fromDate: now]; 
    locNot.repeatInterval = freqFlag; 
    [[UIApplication sharedApplication] scheduleLocalNotification: locNot]; 
} else { 
    for(int i = 1; i <= repeatCountDesired; ++i) { 
     locNot.fireDate = [NSDate dateWithTimeInterval: interval*i fromDate: now]; 
     [[UIApplication sharedApplication] scheduleLocalNotification: locNot]; 
    } 
} 
[locNot release]; 
+0

Вы можете рассказать мне о (каждом) – 2012-09-12 10:15:22

+0

Thanx сейчас работает – 2012-09-12 10:41:15

+0

любым способом мы можем использовать repeatInterval для 3, 5, 7-дневного интервала? – 2015-12-14 21:32:10

-5

notif.repeatInterval = NSDayCalendarUnit;

5

я использовал этот код и он работает нормально для повторного LocalNotification я использовал LavaSlider код для этого кода РЕАЛИЗАЦИИ

 UILocalNotification * localNotifEndCycle = [[UILocalNotification alloc] init]; 
     localNotifEndCycle.alertBody = @"Your Expected Date "; 
     NSDate *now = [NSDate date]; 

     for(int i = 1; i <= 10;i++) 
    { 
     localNotifEndCycle.alertBody = @"Your Expected Date "; 
     [email protected]"best_guitar_tone.mp3"; 
     localNotifEndCycle.fireDate = [NSDate dateWithTimeInterval:180*i sinceDate:now]; 
     [[UIApplication sharedApplication] scheduleLocalNotification: localNotifEndCycle]; 
    } 
    } 
1
-(void)schedulenotificationfortimeinterval:(NSString *)id1 
{ 
    NSLog(@"selected value %d",selectedvalue); 

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 
    [formatter setDateFormat:@"MMM dd,yyyy hh:mm a"]; 

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


    // localNotification2. fireDate = [[formatter dateFromString:[NSString stringWithFormat:@"%@ %@",[MedicationDict valueForKey:@"Starting"],[MedicationDict valueForKey:@"Ending"]]] dateByAddingTimeInterval:0]; 

    if(selectedvalue==0) 
    { 
     NSLog(@"dk 0000"); 

     localNotification2.fireDate = [formatter dateFromString:[NSString stringWithFormat:@"%@ %@",[MedicationDict valueForKey:@"Starting"],[MedicationDict valueForKey:@"Ending"]]] ;//now 

     localNotification2.applicationIconBadgeNumber = 1; 

     localNotification2.repeatInterval=NSDayCalendarUnit; 

    } 
    if(selectedvalue==1) 
    { 
     NSLog(@"dk 1111"); 

     for(int u = 0; u <= 2 ;u++) 
     { 
     localNotification2.fireDate = [[formatter dateFromString:[NSString stringWithFormat:@"%@ %@",[MedicationDict valueForKey:@"Starting"],[MedicationDict valueForKey:@"Ending"]]] dateByAddingTimeInterval:43200.0*u] ;// 12 hr 
      localNotification2.repeatInterval=NSDayCalendarUnit; 

      localNotification2.alertBody = [NSString stringWithFormat:@"Friendly reminder to take %@ %@ at %@.",[MedicationDict objectForKey:@"DrugName"],[MedicationDict objectForKey:@"Frequency"],[MedicationDict objectForKey:@"Ending"]]; 

      localNotification2.alertAction = @"Notification"; 
      localNotification2.soundName=UILocalNotificationDefaultSoundName; 
      localNotification2.applicationIconBadgeNumber = 2; 


      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification2]; 

      NSLog(@"all notifications %@",[[UIApplication sharedApplication]scheduledLocalNotifications]); 

     } 

    // localNotification2.repeatInterval=NSDayCalendarUnit; 

    } 

    if(selectedvalue==2) 
    { 
     NSLog(@"dk 22222"); 
     for(int u = 0; u <= 3 ;u++) 
     { 
      localNotification2.fireDate = [[formatter dateFromString:[NSString stringWithFormat:@"%@ %@",[MedicationDict valueForKey:@"Starting"],[MedicationDict valueForKey:@"Ending"]]] dateByAddingTimeInterval:28800.0*u] ;//8 hr 
      localNotification2.repeatInterval=NSDayCalendarUnit; 

      localNotification2.alertBody = [NSString stringWithFormat:@"Friendly reminder to take %@ %@ at %@.",[MedicationDict objectForKey:@"DrugName"],[MedicationDict objectForKey:@"Frequency"],[MedicationDict objectForKey:@"Ending"]]; 

      localNotification2.alertAction = @"Notification"; 
      localNotification2.soundName=UILocalNotificationDefaultSoundName; 
      localNotification2.applicationIconBadgeNumber = 3; 


      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification2]; 

      NSLog(@"all notifications %@",[[UIApplication sharedApplication]scheduledLocalNotifications]); 

     } 


     // localNotification2.repeatInterval=NSDayCalendarUnit; 
    } 

    if(selectedvalue==3) 
    { 
     NSLog(@"dk 3333"); 
     for(int u = 0; u <= 4 ;u++) 
     { 
      localNotification2.fireDate = [[formatter dateFromString:[NSString stringWithFormat:@"%@ %@",[MedicationDict valueForKey:@"Starting"],[MedicationDict valueForKey:@"Ending"]]] dateByAddingTimeInterval:21600.0*u] ;//6 hr 
      localNotification2.repeatInterval=NSDayCalendarUnit; 

      localNotification2.alertBody = [NSString stringWithFormat:@"Friendly reminder to take %@ %@ at %@.",[MedicationDict objectForKey:@"DrugName"],[MedicationDict objectForKey:@"Frequency"],[MedicationDict objectForKey:@"Ending"]]; 

      localNotification2.alertAction = @"Notification"; 
      localNotification2.soundName=UILocalNotificationDefaultSoundName; 
      localNotification2.applicationIconBadgeNumber = 4; 


      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification2]; 

      NSLog(@"all notifications %@",[[UIApplication sharedApplication]scheduledLocalNotifications]); 

     } 


     // localNotification2.repeatInterval=NSDayCalendarUnit; 
    } 
// localNotification2.repeatInterval=NSDayCalendarUnit; 

    NSLog(@"date is %@ %@",[MedicationDict valueForKey:@"Starting"],[MedicationDict valueForKey:@"Ending"]); 

    localNotification2.timeZone = [NSTimeZone localTimeZone]; 


    localNotification2.alertBody = [NSString stringWithFormat:@"Friendly reminder to take %@ %@ at %@.",[MedicationDict objectForKey:@"DrugName"],[MedicationDict objectForKey:@"Frequency"],[MedicationDict objectForKey:@"Ending"]]; 

    localNotification2.alertAction = @"Notification"; 
    localNotification2.soundName=UILocalNotificationDefaultSoundName; 
    //localNotification2.applicationIconBadgeNumber = 1; 

    // infoDict = [NSDictionary dictionaryWithObject:id1 forKey:@"did"]; 

    // localNotification2.userInfo = infoDict; 

    // [[UIApplication sharedApplication] scheduleLocalNotification:localNotification2]; 

// NSLog(@"all notifications %@",[[UIApplication sharedApplication]scheduledLocalNotifications]); 

    // [[UIApplication sharedApplication] cancelAllLocalNotifications];//dk 
} 
0

Вы можете установить любой временной интервал вы хотите, если вы создали отдельный уведомлений для каждого раза, когда вы хотите, чтобы уведомление срабатывало.Затем вам нужно управлять ими, и если вы не являетесь приложением, которое в настоящее время разрешено запускать в фоновом режиме, вам придется обновить их, выполнив это приложение. Достигнув этого, я могу сказать вам, что это крупная ПИТА.

6

У меня есть одна идея, как это сделать, я реализовал это в моем проекте

Во-первых, создать локальное уведомление с указанием даты пожара (например, каждую минуту). Следующий шаг - заполнить данные пользователя с уникальным идентификатором для этого уведомления (если вы хотите, чтобы удалить его в будущем), и ваш период, как это:

-(void) createLocalRepeatedNotificationWithId: (NSString*) Id 
{ 

    UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
    NSTimeInterval your_custom_fire_interval = 60; // interval in seconds 
    NSDate *remindDate = [[NSDate date] dateByAddingTimeInterval:your_custom_fire_interval]; 
    localNotification.fireDate = remindDate; 
    localNotification.userInfo = @{@"uid":Id, @"period": [NSNumber numberWithInteger:your_custom_fire_interval]}; 
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
} 

После этого осуществить -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification в вашем AppDelegate:

  1. Извлеките свой пользовательский период из информации о пользователе.
  2. Изменить дату пожара на следующий период
  3. Просто добавьте его снова в отобранные примечания!

    NSInteger period = [[notification.userInfo objectForKey:@"period"] integerValue]; //1 
    NSTimeInterval t= 10 * period; 
    notification.fireDate =[[NSDate date] dateByAddingTimeInterval:t]; //2 
    [[UIApplication sharedApplication] scheduleLocalNotification:notification]; //3 
    

, если вы хотите, чтобы удалить это уведомление, сделать

UIApplication *app = [UIApplication sharedApplication]; 
NSArray *eventArray = [app scheduledLocalNotifications]; 
for (int i=0; i<[eventArray count]; i++) 
{ 
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i]; 
    NSDictionary *userInfoCurrent = oneEvent.userInfo; 
    NSString *uid=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:@"id"]]; 
    if ([uid isEqualToString:notification_id_to_remove]) 
    { 
     //Cancelling local notification 
     [app cancelLocalNotification:oneEvent]; 
     break; 
    } 
} 

Очень важно!

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification не звоните, когда вы на фоне. Таким образом, вы должны настроить долговременную фоновое задание, в котором вы снова создадите уведомление.