Автоматически запускать локальные уведомления ежедневно в динамическое время, заданное в массивах. objective ios

У меня есть массив часов hoursArray и массив минут minutesArray и я получаю current date из системы, теперь у меня есть массивы, у которых есть элементы текущего месяца, это означает, что если в апреле будет 30 дней, будет 30 часов / минут в часахArray / minutesArray, который я вставил в массивы, и я получаю текущую дату как индекс массивов.

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

Теперь я хочу, чтобы уведомления запускались автоматически при изменении даты, даже если я не использую приложение на какое-то время, все это должно быть в didEnterBackground... метод appDelegate

Я следил за этим ответом , но он используется в одно и то же время каждый день. Но я хочу разного времени суток из массивов на основе индекса текущей даты массивов (это означает текущий день, например, сегодня 19 апреля индекс массива часов и минут должен быть 19 ).

Вот как выглядят мои массивы

Массив часов = [9, 10, 11, 13, 14, 11, 17, 2, 15, 5 …. и т. Д.]

Минутный массив = [23, 00, 04, 58, 59, 12, 01, 33, …. и т. Д.]

вызов метода в appdelegate.m

 - (void)applicationDidEnterBackground:(UIApplication *)application { [self.viewController triggerAutomaticallyDaily]; [self applicationSignificantTimeChange:application]; [self refreshAlarm]; } 

метод внутри viewcontroller.m

 -(void)triggerAutomaticallyDaily { NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar] ; NSDate *now = [NSDate date]; NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:now]; [components setHour:hoursArray[currentDay]]; //currentDay the todays date is 16 I am getting current date from system. [components setMinute:minutesArray[currentDay]]; UILocalNotification *notification = [[UILocalNotification alloc]init]; notification.fireDate = [calendar dateFromComponents:components]; notification.repeatInterval = NSDayCalendarUnit; [notification setAlertBody:@"This is your task time"]; // notification.soundName = UILocalNotificationDefaultSoundName; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } 

Значительные изменения времени после каждой полуночи, метод в Appdelegate

 -(void)applicationSignificantTimeChange:(UIApplication *)application { [self.viewController triggerAutomaticallyDaily]; } 

Обновить метод Alarm в Appdelegate

 - (void)refreshLabel { //refresh the alarm on the main thread dispatch_async(dispatch_get_main_queue(),^{ [self.viewController triggerAutomaticallyDaily]; }); // check every 10000s [self performSelector:@selector(refreshLabel) withObject:nil afterDelay:10000]; } 

Посмотрите на didEnterBackground... Когда я didEnterBackground... из своего приложения, метод уведомления будет вызываться только один раз. нет есть ?? и как ежедневное уведомление можно получить, когда я даже не открываю приложение в течение недели, но я хочу получать уведомления, как будет вызван метод? метод называется каждый раз в фоновом режиме?

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

ОБНОВЛЕНИЕ Я даже разместил функцию обновления, которая обновляет триггер после каждого 10000 секунд, но он не работает.

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

Важное примечание. Разработчик ничего не может сделать, если приложение находится в состоянии «убить» или в фоновом режиме в течение длительного времени. Так что этого не может быть сделано.

Есть много вопросов для вашего требования:

1.1: Сколько days data вас есть days data за одну услугу for a month , for a year или?

1.2: Почему бы не push ?

1.3. Почему вы хотите ежедневно планировать local notification в то время как вы можете назначить множество одновременно?

1.4. Невозможно внести изменения в app если оно не открыто (убито пользователем), поэтому вы не можете ничего сделать в этом случае.

Теперь придите к тому, что мы можем сделать:

2.1: Учитывая, что вы получаете ежемесячные данные. Таким образом, вы должны планировать все local notifications сразу for loop , увеличивая day component и устанавливая соответствующее время (from your arrays by day index) . И его удача, если пользователь открывает приложение один раз в месяц (возможно, 90%), вы можете запросить сервер для данных за следующий месяц и сделать то же самое.

2.2: Почему это не обрабатывается на сервере и не использует local push notifications . Ребята из сервера могут настроить задание cron за каждую минуту, которое будет получать все часы и минуты для пользователей и отправит push .

Мое предложение не идти с local но все максимум вы можете пойти с 2.1 (расписывать все месячные уведомления сразу).

Просто используйте инструкцию ниже NSCalendar

 UILocalNotification *notification = [[UILocalNotification alloc]init]; notification.fireDate = [[NSDate date] dateByAddingTimeInterval:(hours*3600)+(Mins*60)]; 

// Единица временного интервала должна быть в секундах

 notification.repeatInterval = NSDayCalendarUnit; [notification setAlertBody:@"This is your task time"]; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 

Как говорили другие, лучшим методом является планирование всех уведомлений сразу. Вот что я делаю. Однако существует системный предел 64 ожидающих локальных уведомлений. В вашем случае запланированное уведомление должно запускаться каждый день в течение 64 дней. У меня есть более сложная проблема, потому что мне нужно планировать уведомления каждые 15 минут. Итак, если мои пользователи не ответят в течение 16 часов, они не получат дальнейших уведомлений (64/4 = 16). Также обратите внимание, что UILocalNotification устарела, поэтому вы должны использовать UNNotificationRequest. Обратите внимание, что идентификатор в UNCalendarNotificationTrigger должен быть уникальным для каждого запроса.

  content.categoryIdentifier = @"com.nelsoncapes.localNotification"; NSDate *today = [NSDate date]; NSDate *fireDate = [today dateByAddingTimeInterval:interval]; // first extract the various components of the date NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger year = [calendar component:NSCalendarUnitYear fromDate:fireDate]; NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:fireDate]; NSInteger day = [calendar component:NSCalendarUnitDay fromDate:fireDate]; NSInteger hour = [calendar component:NSCalendarUnitHour fromDate:fireDate]; NSInteger minute = [calendar component:NSCalendarUnitMinute fromDate:fireDate]; NSDateComponents *components = [[NSDateComponents alloc]init]; components.year = year; components.month = month; components.day = day; components.hour = hour; components.minute = minute; … // construct a calendarnotification trigger and add it to the system UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:NO]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier: identifier content:content trigger:trigger]; [center addNotificationRequest:request withCompletionHandler:^(NSError *error){ if(error){ NSLog(@"error on trigger notification %@", error); } }]; 
  • Прокрутка двумя пальцами с помощью UIScrollView
  • Ссылка с UITableViewCell на родительский UITableView?
  • В чем разница между «отображаемым именем пакета» и «именем пакета» в информационном plist приложения cocoa
  • Приложение iOS: как очистить уведомления?
  • Как сделать кнопку перехвата надписью для перехвата событий?
  • Могу ли я делать запросы POST или GET из приложения iphone?
  • NSDateFormatter dateFromString возвращает nil
  • Рисование поэтапно в UIView (iPhone)
  • Сохранение UIColor и загрузка из NSUserDefaults
  • Как получить текущее название города?
  • NSDateFormatter с 24 часами
  • Давайте будем гением компьютера.