Activer la notification locale en fonction de l'heure en arrière-plan

J'ai donc une application qui comprend la notification locale des intervalles de répétition et je voudrais append une fonctionnalité qui mettra en pause les notifications pendant le time de sumil.

Jusqu'à présent, j'ai créé deux datpickers pour que l'user spicify à quelle heure ils aimeraient arrêter l'intervalle de répétition et à quelle heure redémarrer automatiquement. Et j'ai ajouté un uiswitch pour activer le mode veille ou ignorer la fonction.

Maintenant, comment pourrais-je faire mon uipickerview principal – (où ils choisissent la notification ici d'ici) – pour écouter le uiswitch s'il est allumé, puis il met en pause les notifications au moment qui vient de mon premier datepicker et ré-écrit les notifications au time qui vient du deuxième datepicker?

J'ai déjà installé mon datpickers et mon uiswitch mais je n'ai aucune idée de comment l'implémenter avec mon uipickerview. Devrait-il être sous la méthode de DidSelectRow? Ou une méthode dans appdelegate (comme DidEnterBackground)?

S'il vous plaît requestr si vous avez besoin de plus d'informations ou de codes pour comprendre l'idée et m'aider. Merci.

AJOUTER:

Voici mon code que j'ai préparé pour la datepicker, cependant, je manque juste la connection pour l'append correctement à mon sélecteur.

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

J'ai aussi ce code pour comparer entre les time:

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

La publication d'une notification locale répétée entre deux dates / heures spécifiques n'est pas prise en charge par iOS. En outre, contrairement aux notifications basées sur la geolocation, l'application n'est pas avertie des notifications déclenchées lorsqu'elle n'est pas au premier plan. Nous devons donc contourner ce problème en créant de nombreuses notifications distinctes pour le moment où l'user n'est pas endormi.

Suivez ces étapes pour créer une solution de base:

  1. Connectez vos controls à IBOutlets dans l'en-tête de votre controller de vue:

    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. Créez des methods IBAction et connectez-vous pour chacun de vos controls (deux UIDatePickers, un UISwitch et un UIPickerView) dans le file d'implémentation de votre controller de vue. Chaque méthode doit appeler la méthode privée 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. Dans la méthode privée startUserOptionInteractionTimer , nous (re) démarrons un NSTimer. Nous utilisons ici une timer afin que si l'user change les dates ou permute l'interrupteur rapidement – ce qu'il est susceptible de faire – vous ne démontez pas et ne configurez pas rapidement les notifications. (La propriété userOptionInteractionTimer doit être déclarée dans la suite de l'interface du file d'implémentation).

    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. Créez une autre méthode privée pour supprimer les notifications préexistantes et configurer les nouvelles.

    La configuration des notifications dépend de la durée et de la fréquence à laquelle vous souhaitez notifier votre user. Supposons que vous souhaitiez informer votre user toutes les heures et que la fonction de veille soit activée pour l'user, vous devez configurer 14 à 18 notifications (en fonction du time de repos de l'user) pour chaque heure qui se répète chaque jour.

    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. NSSsortingng *notificationType = [self.notificationList objectAtIndex:row]; // Where notificationList is the array storing the list of notification ssortingngs 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. } } 

    Gardez à l'esprit qu'une application unique ne peut créer qu'un maximum de 64 notifications (avec des notifications répétées comptant pour un). Si vous souhaitez que les notifications se triggersnt à différents moments sur plusieurs jours ou semaines, vous devrez peut-être repenser votre design. peu.

  5. Chargez et stockez les preferences choisies de l'user dans 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"]; } 

    Notez également que si l'application est sur le point d'entrer en arrière-plan (quittez le premier plan) et que la timer continue à clignoter, nous la forcerons à se triggersr afin que les notifications soient réglées avant que le système ne tue le minuteur.

  6. N'oubliez pas de connecter le délégué IBActions pour toutes vos vues de sélection de date et toutes vos IBActions, ainsi que les delegates et les sources de données pour votre vue de sélection. N'oubliez pas de configurer vos methods de délégué et de source de données pour que la vue du sélecteur soit remplie.

  7. C'est tout!

La design ci-dessus veillera à ce que les notifications soient déclenchées aux bons moments, que l'application soit au premier plan, en arrière-plan ou terminée. (Toutefois, si l'application est au premier plan lors de la réception de la notification, l'user ne recevra pas de notification, mais plutôt l' application:didReceiveLocalNotification: sur appDelegate sera appelée).

De toute évidence, le code ci-dessus n'est pas "prêt à l'exécution", mais vous devriez être capable de combler les lacunes.

UISwitch définit un atsortingbut dans un plist ou le NSUserDefaults qui peut être vérifié partout, peut-être activer et désactiver le sélecteur (userInteractionEnabled etc.).

En connectant également l' UISwitch avec une méthode IBAction pour ValueChanged afin de pouvoir toujours changer l'état.

En outre en utilisant le DidSelectRowAtIndexPath: méthode de UIPickerView juste pour mettre à jour les time (serait également les save dans un plist ou NSUserDefaults si vous en avez besoin à plusieurs endroits.
Ou vous utilisez les attributes comme attributes de class (statique) ^^

Pour vérifier automatiquement je voudrais juste utiliser un NSTimer qui circule avec 60 secondes dans AppDelegate et triggersr un événement qui se vérifie s'il peut continuer ou returnner, ou vérifier déjà ici si vous voulez le triggersr (peut s'étendre pour s'assurer que vous êtes en train de tirer) les events pas n'importe où dans la minute, mais à 00 secondes).
L'échantillon pour vérifier si vous pouvez tirer ou non pourrait ressembler à ceci pour l'état

startSilentTimePicker: 22h30
stopSilentTimePicker: 7h15
activitéSwitch: 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 } 

Je ne l'ai pas testé avec mon code, mais j'utilise quelque chose de similaire. S'il vous manque quelque chose, dites-le s'il vous plaît et peut-être que je peux compléter;)