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

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

До сих пор я создал двух датпикеров для того, чтобы пользователь мог указать, в какое время они хотели бы остановить интервал повтора, и какое время снова перезапустить. И я добавил 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 } 

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

  • Как зарегистрироваться для NSNotification из UILocalNotification?
  • как дать отдельный цвет для клеток, которые имеют uilocalnotification
  • Приложение потеряло контроль над локальными уведомлениями после обновления с App Store
  • Назначить сигнал предупреждения для UILocalNotification из доступных звуков в iphone
  • Обработка локальных уведомлений, когда пользователь нажимает значок вместо предупреждения
  • Установить стиль локального уведомления iOS по умолчанию для приложения
  • Приложение с локальными уведомлениями, не отображающееся в списке Центра уведомлений в Настройках
  • Пользовательский звук UILocalNotification не работает после обновления приложения
  • спросить у пользователя разрешение показывать предупреждение при запуске локального уведомления
  • Как получить локальное уведомление, когда приложение запущено в объекте c
  • Отправлять локальное уведомление, когда загрузка завершается через NSURLSession / NSURLSessionDownloadTask
  • Interesting Posts

    Изменить версию Carthage Swift

    React Native: SyntaxError: строгий режим не разрешает объявления функций в лексически вложенном выражении

    Документ «.xib» не может быть открыт. Не удалось прочитать архив

    NSMergeConflict на iOS7

    установить размеры фонового изображения IOS

    Сбой создания объекта UIFeedbackGenerator на iOS 10.0

    Используя код C ++ в iOS, создайте статическую библиотеку или смешайте с Objective C?

    UICollectionView с пользовательским UICollectionViewCell

    Как передать файл локального изображения из HTML UIWebView на iPhone?

    Ошибка анимации UIVisualEffectView

    Безопасность транспорта приложений, исключение домена

    Как добиться мазков кисти в iOS

    Получите высоту клавиатуры iOS, когда подключена аппаратная клавиатура

    изменить изображение аннотации после его создания

    Пройдет ли обновление приложения Apple-TestFlight Beta App App, чтобы сократить время на просмотр App Store?

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