23

Je fais une application iPhone, qui a une exigence de notifications locales.Comment définir l'intervalle de répétition de la notification locale sur un intervalle de temps personnalisé?

Dans les notifications locales il y a repeatInterval propriété où l'on peut mettre les intervalles de répétition de l'unité pour mintute, heure, jour, semaine, année, etc.

Je veux cet intervalle de répétition doit être de 4 heures.

Donc chaque 4 heures la notification locale vient.

Je ne veux pas que l'utilisateur mette des notifications séparées pour chacun.

Je souhaite que l'utilisateur puisse définir repeatInterval sur 4 heures.

Comment faire cela?

Répondre

42

obtenu la réponse

Il est aussi droit qu'il obtient.

Vous ne pouvez pas créer d'intervalles de répétition personnalisés.

Vous devez utiliser les intervalles de temps d'unité intégrés de NSCalendarUnit.

J'ai essayé toutes les solutions ci-dessus et j'ai même essayé d'autres choses, mais aucune d'entre elles n'a fonctionné.

J'ai investi beaucoup de temps pour découvrir qu'il est impossible de le faire fonctionner pour des intervalles de temps personnalisés.

Espérons que cela aidera tous ceux qui recherchent la solution.

Merci à tous les gars qui ont essayé de répondre à ma question. Merci les gars!!

+9

Cependant, voir cette [réponse] (http://stackoverflow.com/questions/5762517/custom-repeat-interval-for-uilocalnotification). Il donne un moyen d'y parvenir si vous pouvez vivre avec la limite de notification 64. –

+0

Vous pouvez essayer de définir un intervalle de répétition pour chaque jour, puis supprimer les notifications pour les jours requis. – Mehul

+1

je ne suis pas statisfy avec cette réponse comme WhatsApp afficher la notification toutes les 3-4 secondes lorsque l'application est en arrière-plan et et l'appel VOIP vient –

17

L'intervalle de répétition est juste un ENUM qui a une constante bit-map, donc il n'y a pas moyen d'avoir la coutume repeatIntervals, juste chaque minute, chaque seconde, chaque semaine, etc.

Cela dit , il n'y a aucune raison que votre utilisateur doive définir chacun d'eux. Si vous les laissez définir deux valeurs dans votre interface utilisateur, par exemple "Frequency unit: Yearly/Monthly/Weekly/Hourly" et "Every ____ years/months/weeks/hours", vous pouvez générer automatiquement les notifications appropriées en définissant la date de déclenchement appropriée sans répétition.

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

pouvez-vous me parler de la (tous) –

+0

Thanx il fonctionne maintenant –

+0

de toute façon nous pouvons utiliser repeatInterval pour aussi intervalle de 3, 5, 7 jours? –

-5

notif.repeatInterval = NSDayCalendarUnit;

5

j'ai utilisé ce code et il fonctionne très bien pour la répétition LocalNotification j'ai utilisé le code LavaSlider pour ce code Implémentation

 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

Vous pouvez définir un intervalle de temps que vous voulez, si vous configurez séparée notifications à chaque fois que vous souhaitez déclencher une notification.Vous devez ensuite les gérer, et si vous n'êtes pas une application qui est actuellement autorisée à s'exécuter en arrière-plan, vous devrez les actualiser en demandant à l'utilisateur de lancer votre application pour ce faire. Après avoir accompli cela, je peux vous dire que c'est un PITA majeur.

6

J'ai une idée comment faire, je l'ai mis en œuvre dans mon projet

d'abord, créez une notification locale avec la date d'incendie (par exemple, toutes les minutes). Étape suivante - remplir les informations utilisateur avec identifiant unique pour cette notification (si vous souhaitez supprimer à l'avenir) et votre période personnalisée comme ceci:

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

Après cela, mettre en œuvre -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification dans votre AppDelegate:

  1. Récupérez votre période personnalisée à partir des informations utilisateur.
  2. Changer la date d'incendie pour la période suivante
  3. Il suffit de l'ajouter à nouveau dans les notificatiots sheluded!

    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 vous souhaitez supprimer cette notification, faire

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

Très important!

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification ne pas appelé, lorsque vous êtes à l'arrière-plan. Vous devez donc configurer une tâche d'arrière-plan longue durée, dans laquelle vous allez à nouveau créer une notification.

+0

:: très bien ... pouvez-vous s'il vous plaît m'aider quelle méthode est appelée lorsque mon application est en arrière-plan ou en mode tué? parce que je veux afficher du texte dynamique sur la bannière de notification basée sur "uid". Rejouer moi ASAP –

+0

@BandishDave, - (void) ApplicationWillResignActive: (UIApplication *) application - Cette méthode est appelée pour indiquer à votre application qu'elle est sur le point de passer de l'état actif à l'état inactif. Cela peut se produire pour certains types d'interruptions temporaires. Consultez également - (void) applicationWillTerminate: (UIApplication *) application - Cette méthode permet à votre application de savoir qu'elle est sur le point d'être terminée et purgée de la mémoire entièrement. – Doro