Como definir o intervalo de repetição da Notificação Local para o intervalo de tempo personalizado?

Eu estou fazendo um aplicativo para iPhone, que tem um requisito de notifications locais.

Em notifications locais, há a propriedade repeatInterval , onde podemos colocar os intervalos de repetição da unidade para mintute, hora, dia, semana, ano, etc.

Eu quero que o intervalo de repetição seja de 4 horas.

Então a cada 4 horas a notificação local vem.

Eu não quero que o usuário defina notifications separadas para cada um.

Eu quero que o usuário seja capaz de definir repeatInterval como 4 horas.

Como faço isso?

    Tem a resposta

    É tão simples quanto parece.

    Você não pode criar intervalos de repetição personalizados.

    Você tem que usar em Intervalos de tempo da unidade internos do NSCalendarUnit .

    Eu tentei todas as soluções acima e até tentei outras coisas, mas nenhuma delas funcionou.

    Investi muito tempo em descobrir que não há como conseguir que funcione para intervalos de tempo personalizados.

    Espero que isso ajude a todos que estão procurando a solução.

    Obrigado a todos os caras que tentaram responder a minha pergunta. Obrigado rapazes!!

    O intervalo de repetição é apenas um enum que possui uma constante de repeatIntervals , portanto, não há como ter repeatIntervals personalizados, apenas a cada minuto, a cada segundo, a cada semana, etc.

    Dito isto, não há razão para que seu usuário tenha que definir cada um deles. Se você permitir que eles definam dois valores em sua interface de usuário, algo como ” Frequency unit: Yearly/Monthly/Weekly/Hourly ” e “A Every ____ years/months/weeks/hours “, será possível gerar automaticamente as notifications apropriadas data de fogo sem repetição.

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

    Eu tenho uma idéia de como fazer isso, eu implementei isso no meu projeto

    Primeiro, crie uma notificação local com data de disparo (por exemplo, a cada minuto). Próximo passo – preencha as informações do usuário com um ID exclusivo para essa notificação (se quiser removê-lo no futuro) e seu período personalizado como este:

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

    Depois disso, implementar -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification no seu AppDelegate:

    1. Busque seu período personalizado a partir das informações do usuário.
    2. Alterar data de fogo para o próximo período
    3. Basta adicioná-lo aos notificatiots protegidos novamente!

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

    se você quiser remover essa notificação, faça

     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; } } 

    Muito importante!

    -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification não chamado, quando você no fundo. Portanto, você deve configurar uma tarefa em segundo plano de longa execução, na qual criará uma notificação novamente.

    Eu usei este código e ele está funcionando bem para repetir LocalNotification eu usei o código LavaSlider para esta implementação de código

      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 "; localNotifEndCycle.soundName=@"best_guitar_tone.mp3"; localNotifEndCycle.fireDate = [NSDate dateWithTimeInterval:180*i sinceDate:now]; [[UIApplication sharedApplication] scheduleLocalNotification: localNotifEndCycle]; } } 
     -(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 } 

    Você pode definir qualquer intervalo de tempo desejado, se você configurar notifications separadas para cada vez que quiser que uma notificação seja triggersda. Você terá que gerenciá-los e, se você não for um aplicativo atualmente autorizado a ser executado em segundo plano, será necessário atualizá-los fazendo com que o usuário execute seu aplicativo para fazer isso. Tendo feito isso, posso dizer que é uma grande PITA.

    notif.repeatInterval = NSDayCalendarUnit;