Come impostare l’intervallo di ripetizione della notifica locale sull’intervallo di tempo personalizzato?

Sto creando un’app per iPhone, che ha l’obbligo di Notifiche locali.

Nelle notifiche locali c’è la proprietà repeatInterval dove possiamo inserire gli intervalli di ripetizione dell’unità per minuto, ora, giorno, settimana, anno, ecc.

Voglio che l’intervallo di ripetizione dovrebbe essere di 4 ore.

Quindi ogni 4 ore arriva la notifica locale.

Non desidero che l’utente imposti notifiche separate per ciascuno.

Voglio che l’utente sia in grado di impostare repeatInterval come 4 ore.

Come lo faccio?

Ho la risposta

È così dritta come si arriva.

Non è ansible creare intervalli di ripetizione personalizzati.

È necessario utilizzare gli intervalli di tempo dell’unità in-built di NSCalendarUnit .

Ho provato tutte le soluzioni di cui sopra e anche provato altre cose, ma nessuno di loro ha funzionato.

Ho investito molto tempo nello scoprire che non c’è modo di farlo funzionare per intervalli di tempo personalizzati.

Spero che questo aiuti tutti coloro che stanno cercando la soluzione.

Grazie a tutti i ragazzi che hanno cercato di rispondere alla mia domanda. Grazie ragazzi!!

L’intervallo di ripetizione è solo un enum che ha una costante repeatIntervals , quindi non c’è modo di avere repeatIntervals personalizzate, solo ogni minuto, ogni secondo, ogni settimana, ecc.

Detto questo, non vi è alcun motivo per cui l’utente debba impostare ciascuno di essi. Se si lascia che impostino due valori nell’interfaccia utente, ad esempio ” Frequency unit: Yearly/Monthly/Weekly/Hourly ” e ” Every ____ years/months/weeks/hours “, è ansible generare automaticamente le notifiche appropriate impostando l’appropriato data dell’incendio senza una ripetizione.

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

Ho un’idea su come farlo, l’ho implementato nel mio progetto

Innanzitutto, crea una notifica locale con data dell’incendio (ad esempio ogni minuto). Passaggio successivo: riempi le informazioni utente con un ID univoco per questa notifica (se desideri rimuoverlo in futuro) e il tuo periodo personalizzato come questo:

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

Successivamente, implementare l’applicazione -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification in AppDelegate:

  1. Scarica il tuo periodo personalizzato dalle informazioni dell’utente.
  2. Modifica la data dell’incendio per il prossimo periodo
  3. Basta aggiungerlo nuovamente ai notificatiots protetti!

     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 vuoi rimuovere questa notifica, fallo

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

Molto importante!

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification non chiamata, quando si è in background. Pertanto, è necessario impostare un'attività in background con esecuzione prolungata, in cui verrà nuovamente creata la notifica.

ho usato questo codice e funziona bene per ripetere LocalNotification ho usato il codice LavaSlider per questa implementazione del codice

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

È ansible impostare qualsiasi intervallo di tempo desiderato, se si impostano notifiche separate per ogni volta che si desidera triggersre una notifica. Devi quindi gestirli, e se non sei un’app che al momento è autorizzata a funzionare in background, dovrai aggiornarli facendo in modo che l’utente esegua la tua app. Avendo compiuto questo, posso dirti che è un importante PITA.

notif.repeatInterval = NSDayCalendarUnit;