Как установить местный уведомление повторного уведомления на пользовательский интервал времени?

StackOverflow https://stackoverflow.com/questions/4363847

Вопрос

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

В местных уведомлениях есть повторительервал Недвижимость, где мы можем поставить блок повторить интервалы для Mintute, час, день, неделя, год и т. Д.

Я хочу, чтобы этот повторный интервал должен быть 4 часа.

Так все 4 часа Местное уведомление приходит.

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

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

Как я могу это сделать?

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Повторный интервал - это просто порицать у этого есть постоянная битовая карта, поэтому нет способа иметь обычай 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];

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

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

-(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. Просто добавьте его в Shelded Notifitiotiots снова!

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

Я использовал этот код, и он работает нормально для повторной локальной местности Я использовал код 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];
     }
     }
-(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
 }

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

//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])

Notif.repeatInterval = NsdayCalendarunit;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top