Активировать локальное уведомление, основанное на времени в фоновом режиме

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

До сих пор я создал двух датпикеров для того, чтобы пользователь мог указать, в какое время они хотели бы остановить интервал повтора, и какое время снова перезапустить. И я добавил uiswitch для активации режима ожидания или игнорирования функции.

Теперь, как бы я сделал свой основной uipickerview – (который они выбирают там уведомление отсюда) – для прослушивания uiswitch, если он включен, тогда он приостанавливает уведомления в то время, которое приходит от моего первого datepicker, и повторно уведомляет уведомления на время, которое исходит от второго datepicker?

Я уже настроил своих датпикеров и мой uiswitch, но понятия не имею, как реализовать его с моим uipickerview. Должно ли это быть под методом DidSelectRow? Или метод в appdelegate (например, DidEnterBackground)?

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

ДОБАВИТЬ:

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

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; dateFormatter.timeZone=[NSTimeZone defaultTimeZone]; dateFormatter.timeStyle=NSDateFormatterShortStyle; dateFormatter.dateStyle=NSDateFormatterShortStyle; NSString *dateTimeString=[dateFormatter stringFromDate:startTime.date]; NSLog(@"Start time is %@",dateTimeString); NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc]init]; dateFormatter2.timeZone=[NSTimeZone defaultTimeZone]; dateFormatter2.timeStyle=NSDateFormatterShortStyle; dateFormatter2.dateStyle=NSDateFormatterShortStyle; NSString *dateTimeString2=[dateFormatter2 stringFromDate:endTime.date]; NSLog(@"End time is %@",dateTimeString2); 

У меня также есть этот код для сравнения между временами:

 if ([[NSDate date] isEqualToDate:startTime.date]) { NSLog(@"currentDate is equal to startTime"); } if ([[NSDate date] isEqualToDate:endTime.date]) { NSLog(@"currentDate is equal to endTime"); } 

2 Solutions collect form web for “Активировать локальное уведомление, основанное на времени в фоновом режиме”

Отправка локального повторяющегося уведомления между двумя конкретными датами / временем не поддерживается iOS. Кроме того, в отличие от уведомлений, основанных на геоопределении, приложение не уведомляется об уволенных уведомлениях, если не на переднем плане. Поэтому нам нужно обойти это, создав много отдельных уведомлений на время, когда пользователь не спит.

Выполните следующие шаги, чтобы создать базовое решение:

  1. Подключите свои элементы управления к IBOutlets в заголовке контроллера вашего вида:

    SomeViewController.h:

     @interface SomeViewController : UIViewController @property (weak, nonatomic) IBOutlet UISwitch *sleepToggleSwitch; @property (weak, nonatomic) IBOutlet UIDatePicker *notificationIgnoreStartTime; @property (weak, nonatomic) IBOutlet UIDatePicker *notificationIgnoreEndTime; @property (weak, nonatomic) IBOutlet UIPickerView *notificationTypePickerView; @end 
  2. Создайте методы IBAction и подключитесь к каждому из ваших элементов управления (два UIDatePickers, один UISwitch и один UIPickerView) в файле реализации вашего контроллера. Каждый метод должен вызывать частный метод startUserOptionInteractionTimer .

    SomeViewController.m:

     - (IBAction)noNotificationPeriodStartDateChanged:(id)sender { [self startUserOptionInteractionTimer]; } - (IBAction)noNotificationPeriodEndDateChanged:(id)sender { [self startUserOptionInteractionTimer]; } - (IBAction)sleepToggleSwitchToggled:(id)sender { [self startUserOptionInteractionTimer]; } - (IBAction)notificationTypeChanged:(id)sender { [self startUserOptionInteractionTimer]; } 
  3. В частном методе startUserOptionInteractionTimer мы (повторно) запускаем NSTimer. Мы используем таймер здесь, чтобы, если пользователь меняет даты или быстро переключает коммутатор – что они, вероятно, будут делать – вы не сбрасываете и не устанавливаете уведомления быстро подряд. (Свойство NSTimer userOptionInteractionTimer должно быть объявлено в продолжении интерфейса файла реализации).

    SomeViewController.m:

     - (void)startUserOptionInteractionTimer { // Remove any existing timer [self.userOptionInteractionTimer invalidate]; self.userOptionInteractionTimer = [NSTimer scheduledTimerWithTimeInterval:4.f target:self selector:@selector(setupNotifications) userInfo:nil repeats:NO]; } 
  4. Создайте еще один частный метод, чтобы снести уже существующие уведомления и настроить новые.

    Настройка уведомлений здесь зависит от того, как долго и как часто вы хотите уведомить своего пользователя. Предположим, что вы хотите каждый час уведомлять своего пользователя, а у пользователя включена функция сна, тогда вы должны настроить 14-18 уведомлений (в зависимости от того, как долго пользователь спит) для каждого часа, который повторяется ежедневно.

    SomeViewController.m:

     - (void)setupNotifications { [[UIApplication sharedApplication] cancelAllLocalNotifications]; // Read the notification type from the notification type picker view NSInteger row = [self.notificationTypePickerView selectedRowInComponent:0]; // Assumes there is only one component in the picker view. NSString *notificationType = [self.notificationList objectAtIndex:row]; // Where notificationList is the array storing the list of notification strings that appear in the picker view. // If the user has turned the sleep feature on (via the UISwitch): if (self.sleepToggleSwitch.on) { // Set the first notification to start after the user selected 'noNotificationPeriodEndDate' and repeat daily. // Add 1 hour to the notification date // Do while the notification date < the user selected 'noNotificationPeriodStartDate' ... // Create the notification and set to repeat daily // Add 1 hour to the notification date // Loop } else { // Set up 24 repeating daily notifications each one hour apart. } } 

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

  5. Загрузите и сохраните выбранные пользователем настройки в NSUserDefaults:

    SomeViewController.m:

     - (void)viewDidLoad { [super viewDidLoad]; // Load the user defaults NSDate *sleepStartDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"SleepStartDate"]; self.notificationIgnoreStartTime.date = sleepStartDate ? sleepStartDate : [NSDate date]; NSDate *sleepEndDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"SleepEndDate"]; self.notificationIgnoreEndTime.date = sleepEndDate ? sleepEndDate : [NSDate date]; self.sleepToggleSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"SleepEnabled"]; // Watch for when the app leaves the foreground [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil]; } - (void)applicationWillResignActive { // If the timer is still waiting, fire it so the notifications are setup correctly before the app enters the background. if (self.userOptionInteractionTimer.isValid) [self.userOptionInteractionTimer fire]; // Store the user's selections in NSUserDefaults [[NSUserDefaults standardUserDefaults] setObject:self.notificationIgnoreStartTime.date forKey:@"SleepStartDate"]; [[NSUserDefaults standardUserDefaults] setObject:self.notificationIgnoreEndTime.date forKey:@"SleepEndDate"]; [[NSUserDefaults standardUserDefaults] setBool:self.sleepToggleSwitch.on forKey:@"SleepEnabled"]; } 

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

  6. Не забудьте подключить делегат IBActions для всех ваших просмотров даты и всех ваших IBActions, а также делегатов и источников данных для вашего выбора. Также не забудьте настроить параметры делегата и источника данных, чтобы отображалось представление выбора.

  7. Это оно!

Вышеупомянутая конструкция гарантирует, что уведомления будут уволены в правильное время независимо от того, находится ли приложение на переднем плане, фон или завершено. (Однако, если приложение находится на переднем плане при получении уведомления, пользователь не получит уведомление. Вместо этого application:didReceiveLocalNotification: на appDelegate будет вызываться).

Очевидно, что приведенный выше код не является «готовым к выполнению», но вы должны иметь возможность заполнить пробелы.

UISwitch устанавливает атрибут в plist или NSUserDefaults который можно проверить везде, возможно, активировать и дезактивировать Picker (userInteractionEnabled и т. Д.).

Также соединение UISwitch с UISwitch IBAction для ValueChanged позволяет всегда переключать статус.

Дальнейшее использование DidSelectRowAtIndexPath: UIPickerView просто для обновления времени (также сохранит их в NSUserDefaults или NSUserDefaults если они вам понадобятся в нескольких местах.
Или вы используете атрибуты как атрибуты класса (статические) ^^

Для автоматизированной проверки я бы просто использовал NSTimer который запускается с NSTimer с 60 секундами в AppDelegate и AppDelegate событие, которое проверяет себя, если оно может продолжать или возвращаться, или проверить уже здесь, если вы хотите его запустить (можете расширить, чтобы убедиться, что вы любите события не в любой точке мира, а в 00 секунд).
Образец для проверки, можете ли вы стрелять или нет, может выглядеть примерно так для государства

startSilentTimePicker: 22:30
stopSilentTimePicker: 7:15 утра
activitySwitch: on

 // filtered date by only time NSDateComponents *startComps = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:[startSilentTimePicker date]]; NSDateComponents *endComps = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:[stopSilentTimePicker date]]; NSDateComponents *currentComps = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:[NSDate date]]; if([[startComps date] laterDate:[currentComps date]] == [currentComps date] || [[endComps date] earlierDate:[currentComps date]] == [currentComps date]) { // set the value, that tells you beeing in silent time, set a return from the methode or invert to fire notification here } 

не тестировали его с моим кодом, но я использую нечто подобное. Если вам что-то не хватает, скажите пожалуйста и, возможно, я могу закончить;)

  • Можно ли заставить дату устройства проверять локальные уведомления?
  • спросить у пользователя разрешение показывать предупреждение при запуске локального уведомления
  • Как повторять местные уведомления каждый день в разное время
  • Получение локальных уведомлений, пока приложение находится на переднем плане Swift 3
  • Назначить сигнал предупреждения для UILocalNotification из доступных звуков в iphone
  • Постоянная UILocalNotification на экране блокировки
  • Выпуск с повторным интервалом каждые 30 минут
  • Внесите настройки вибрации и звука в локальное уведомление в приложении iOS
  • Планирование второго уведомления, если вначале игнорируется в быстром (или завершении любого действия, если уведомление игнорируется)
  • Метод didRangeBeacons не вызывается при отображении Off
  • Как установить будильник в iOS?
  • UILocalNotification не работает вообще
  • Interesting Posts

    как я могу интегрировать более 5 push-сертификатов с Parse?

    Когда я использую представление UIImagePNGR или представление UIImageJPEGR для преобразования UIImage в NSdata, размер изображения слишком сильно увеличивается

    HOWTO отслеживает автоматическое обновление подписки в iOS In-App Purchase?

    Не удалось выполнить команду из-за сигнала: Ошибка сегментации: 11 произошло с Eureka 1.5.0

    Возвращает NSNotFound для NSUInteger?

    Добавить на главный экран – нет Светоотражающий блеск на иконке

    iOS Изменить цвет UiButton не работает

    Как установить размер UIBarButton в iOS 11 для соответствия размеру в iOS 10

    Swift UIDatePicker для ввода текстового поля – как заставить UIDatePicker исчезнуть?

    Пути исключения в текстовом контейнере UILabel

    Как установить UIImage из номинального состояния и текста заголовка в выбранном состоянии в UIButton

    Измените область (масштабирование) для mapView Swift

    Как получить доступ к вложенному JSON в коллекции значений Диспетчера тегов Google в iOS Swift

    Доступен OpenCL на iOS

    NSMergeByPropertyObjectTrumpMergePolicy vs. NSMergeByPropertyStoreTrumpMergePolicy

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.