Как установить локальный интервал повторения уведомлений в пользовательский интервал времени? - PullRequest
24 голосов
/ 06 декабря 2010

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

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

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

Поэтому каждые 4 часа приходит локальное уведомление.

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

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

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

Ответы [ 8 ]

43 голосов
/ 27 февраля 2011

Получил ответ, он так же прямолинеен, как и получил.

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

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

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

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

17 голосов
/ 11 февраля 2011

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

При этом нет никаких причин, по которым ваш пользователь должен устанавливать каждый из них. Если вы позволите им установить два значения в вашем пользовательском интерфейсе, например, «Frequency unit: Yearly/Monthly/Weekly/Hourly» и «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];
6 голосов
/ 11 августа 2014

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

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

-(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 Не звонил, когда ты на заднем плане.Итак, вы должны настроить длительное фоновое задание, где вы снова создадите уведомление.

5 голосов
/ 12 сентября 2012

Я использовал этот код, и он отлично работает для повторного 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 ";
        localNotifEndCycle.soundName=@"best_guitar_tone.mp3";
        localNotifEndCycle.fireDate = [NSDate dateWithTimeInterval:180*i sinceDate:now];
        [[UIApplication sharedApplication] scheduleLocalNotification: localNotifEndCycle];
     }
     }
1 голос
/ 24 июня 2013
-(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 голосов
/ 24 марта 2019
//This is how I set local notification based on time interval repeatedly and executed method customized snooze and delete
let content = UNMutableNotificationContent()
content.title = "Time Based Local Notification"
content.subtitle = "Its is a demo"
content.sound = .default
content.categoryIdentifier = "UYLReminderCategory"

//repition of time base local notification in foreground, background, killed
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true)
let request = UNNotificationRequest(identifier: "IOS Demo", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: [])
let deleteAction = UNNotificationAction(identifier: "UYLDeleteAction", title: "Delete", options: [.destructive])
let cat = UNNotificationCategory(identifier: "UYLReminderCategory", actions: [snoozeAction,deleteAction], intentIdentifiers: [], options: [])
UNUserNotificationCenter.current().setNotificationCategories([cat])
0 голосов
/ 19 июля 2013

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

0 голосов
/ 29 июля 2011

notif.repeatInterval = NSDayCalendarUnit;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...