2017-07-18 3 views
4

Dans mon application, j'ai un aperçu d'utilisateur qui permet à l'utilisateur de choisir une heure. Actuellement dans mon code j'ai cette heure sélectionnée passée comme dateA. J'ai ensuite bouclé tous les jours qui sont sélectionnés dans un uitableview séparé, et vérifié pour voir s'ils étaient égaux au jour d'aujourd'hui (comme mardi). Si les jours étaient les mêmes, alors une notification enverrait à l'heure sélectionnée qui a été passée comme dateA. Cependant, lorsque j'essaie d'envoyer la notification, elle n'est pas envoyée.Planification Notification à déclencher à un moment précis - Swift

Voici un extrait de mon code montrant ce que j'ai essayé:

var dateA: Date? = nil//where selected time is kept 

    var weekdaysChecked = [String]()//where selected weekdays are kept 

    var alarms = [Alarm]() { 
     didSet { 
      tableView.reloadData() 
     } 
    } 


    override func viewDidLoad() { 
     UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound], completionHandler: { (didAllow, error) in 
     }) 

    } 


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "alarmCell", for: indexPath) as! DisplayAlarmCell 

     let row = indexPath.row 
     let alarm = alarms[row] 
     let date = Date() 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "EEEE"//"EE" to get short style 
     let dayInWeek = dateFormatter.string(from: date) 


     if(alarms.count == 40) { 
      self.navigationItem.rightBarButtonItem?.isEnabled = false 
      tableView.reloadData() 
     } 

     cell.alarmTitle.text = alarm.alarmLabel 
     cell.clockTitle.text = alarm.time 

     for weekdays in weekdaysChecked { 
      if(dayInWeek == weekdays){ 
       let content = UNMutableNotificationContent() 
       content.title = alarm.alarmLabel! 
       content.subtitle = alarm.time! 
       content.sound = UNNotificationSound(named: "Spaceship_Alarm.mp3") 

       let trigger = Calendar.current.dateComponents([.hour,.minute], from: dateA!) 
       let triggerNotif = UNCalendarNotificationTrigger(dateMatching: trigger, repeats: false) 

       let triggerRequest = UNNotificationRequest(identifier: "AlarmNotif", content: content, trigger: triggerNotif) 

       UNUserNotificationCenter.current().add(triggerRequest, withCompletionHandler: nil) 

       print("This is the correct day.") 
      } 
     } 
+1

@Rob merci pour vos commentaires. Il y a quelques heures, j'avais résolu cela, et je vais bientôt écrire ma solution. Fondamentalement, je n'avais pas d'identifiant unique qui empêchait l'envoi de notifications, ce que vous avez dit. –

Répondre

1

En supposant que vous voyez votre message « Ceci est le jour correct », un problème candidat est l'utilisation d'un identifiant fixe pour votre UNNotificationRequest. Comme le dit the docs, "si l'identificateur n'est pas unique, les notifications ne sont pas délivrées".

Aussi, je suggère d'ajouter un message d'erreur si l'appel requestAuthorization a échoué. À l'heure actuelle, si l'autorisation a échoué pour une raison quelconque, vous ne le saurez pas et aucune notification ne sera envoyée.


Aucun lien, cellForRowAt n'est pas le bon endroit pour être la création de notifications. Si un utilisateur ne fait pas défiler la cellule particulière, aucune notification ne sera créée. Et si l'utilisateur fait défiler une cellule hors de vue et revient à la vue, vous allez essayer de créer à nouveau la même demande de notification. Bottom line, si une cellule arrive à apparaître ou non (et si elle réapparaît plus tard) est sans rapport avec la question de savoir si les notifications doivent être créées ou non.

La création de notifications est l'endroit où vous mettez à jour le modèle (ou en réponse à une action de l'utilisateur, comme la vérification d'une case à cocher ou similaire).

0

Essayez d'ajouter tous les composants ici:

 let trigger = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from: dateA!) 

Et ajouter ces méthodes à votre AppDelegate

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) { 
    completionHandler(UNNotificationPresentationOptionBadge) 
} 

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
    completionHandler() 
} 

Aussi je voudrais vérifier si votre date sélectionnée n'est pas foiré en raison d'un fuseau horaire différent avec votre appareil.

Hope this helps

+0

Cela n'a pas fonctionné. Je crois que quand j'ai vérifié si tous les jours ont été sélectionnés, et stocké cela dans une variable appelée quotidienne (qui détenait une valeur de faux), et dit si quotidien == vrai, alors la notification serait envoyée, donc il pourrait y avoir un problème différent. –

+0

@RajatKhare Je suggère d'essayer de programmer une notification de test juste dans votre vue didLoad avec un délai de 10 secondes à partir de maintenant et voir si elle est en train de tirer. –