¿Cómo establecer el intervalo de repetición de notificación local en el intervalo de tiempo personalizado?

Estoy creando una aplicación para iPhone, que requiere Notificaciones locales.

En las notificaciones locales hay una propiedad repeatInterval en la que podemos poner los intervalos de repetición de unidad para mintute, hora, día, semana, año, etc.

Quiero que el intervalo de repetición sea de 4 horas.

Entonces, cada 4 horas llega la notificación local.

No quiero que el usuario configure notificaciones separadas para cada uno.

Quiero que el usuario pueda establecer repeatInterval en 4 horas.

¿Cómo puedo hacer eso?

Tengo la respuesta

Es lo más directo posible.

No puede crear intervalos de repetición personalizados.

Debe usar los Intervalos de tiempo de unidad incorporados de NSCalendarUnit .

Probé todas las soluciones anteriores e incluso probé otras cosas, pero ninguna de ellas funcionó.

He invertido tiempo suficiente para descubrir que no hay forma de que podamos hacerlo funcionar para intervalos de tiempo personalizados.

Espero que esto ayude a todos los que están buscando la solución.

Gracias a todos los chicos que intentaron responder mi pregunta. ¡¡Gracias chicos!!

El intervalo de repetición es solo una enumeración que tiene una constante de mapa de bit, por lo que no hay forma de tener repeatIntervals personalizados, solo cada minuto, cada segundo, cada semana, etc.

Dicho esto, no hay ninguna razón por la cual su usuario deba establecer cada una. Si les permite establecer dos valores en su interfaz de usuario, como ” Frequency unit: Yearly/Monthly/Weekly/Hourly ” y ” Every ____ years/months/weeks/hours “, puede generar automáticamente las notificaciones apropiadas configurando el fecha de fuego sin repetir.

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

Tengo una idea de cómo hacer esto, lo he implementado en mi proyecto

Primero, cree una notificación local con fecha de inicio (por ejemplo, cada minuto). Siguiente paso: complete la información del usuario con una identificación única para esta notificación (si desea eliminarla en el futuro) y su 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]; } 

Después de eso, implemente la aplicación -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification en su AppDelegate:

  1. Obtenga su período personalizado de la información del usuario.
  2. Cambiar la fecha de inicio del próximo período
  3. ¡Solo agréguela a los notificatiots alentados nuevamente!

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

si desea eliminar esta notificación, haga

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

¡Muy importante!

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification no se llama, cuando en segundo plano. Por lo tanto, debe configurar la tarea en segundo plano de fondo, donde creará una notificación nuevamente.

He usado este código y está funcionando bien para repetir LocalNotification He usado el código de LavaSlider para esta implementación del 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 } 

Puede configurar cualquier intervalo de tiempo que desee, si configura notificaciones por separado para cada vez que desea que se active una notificación. Luego debe administrarlos, y si no es una aplicación que actualmente se puede ejecutar en segundo plano, tendrá que actualizarlos haciendo que el usuario ejecute su aplicación para hacerlo. Habiendo logrado esto, puedo decirles que es un PITA importante.

notif.repeatInterval = NSDayCalendarUnit;