2016-12-29 1 views
2

Je suis en train de coder dans Swift 3 et j'essaye simplement d'envoyer une notification maintenant sans aucun retard ou intervalle. Cependant, la notification ne se déclenche jamais. Voici mon code ..Swift - Notification locale ne se déclenche pas

Le code ViewController

import UserNotifications 

class HomeViewController: UIViewController{ 
    var isGrantedNotificationAccess:Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     UNUserNotificationCenter.current().requestAuthorization(
      options: [.alert,.sound,.badge], 
      completionHandler: { (granted,error) in 
       self.isGrantedNotificationAccess = granted 
     }) 

     if isGrantedNotificationAccess{ 
      triggerNotification() 
     } 
    } 

    //triggerNotification func goes here 
} 

fonction triggerNotification:

func triggerNotification(){ 
     let content = UNMutableNotificationContent() 
     content.title = NSString.localizedUserNotificationString(forKey: "Notification Testing", arguments: nil) 
     content.body = NSString.localizedUserNotificationString(forKey: "This is a test", arguments: nil) 
     content.sound = UNNotificationSound.default() 
     content.badge = (UIApplication.shared.applicationIconBadgeNumber + 1) as NSNumber; 
     let trigger = UNTimeIntervalNotificationTrigger(
      timeInterval: 1.0, 
      repeats: false) 

     let request = UNNotificationRequest.init(identifier: "testTriggerNotif", content: content, trigger: trigger) 

     let center = UNUserNotificationCenter.current() 
     center.add(request) 
} 

Qu'est-ce que je fais mal?

+0

Vous pouvez consulter ce lien - http://stackoverflow.com/questions/37807302/add-local-notification-in-ios10-swift-3 – Nilesh

+0

Vos notifications sont fonctionne bien. Pour tester, augmentez l'intervalle de temps à 5 et déplacez l'application en arrière-plan (la bannière de notification s'affichera comme prévu.Le problème est que vous ne traitez pas ce que l'application doit faire, alors la notification utilisateur arrive et l'application est à l'avant-plan) –

+2

de [Affichage d'une bannière de notification iOS stock lorsque votre application est ouverte et au premier plan?] (https://stackoverflow.com/questions/30852870/displaying-a-stock-ios-notification-banner-when-your-app- is-open-and-in-the-fore) – Bill

Répondre

7

Vous étiez absent la manipulation, lorsque l'application est au premier plan, vous ne spécifiez pas comment les notifications ressembleraient ou présentés

Set ci-dessous la ligne tout en ajoutant une notification pour indiquer que vous voulez afficher la bannière alors que l'utilisateur utilise l'application (nouvelle fonctionnalité iOS 10)

content.setValue("YES", forKeyPath: "shouldAlwaysAlertWhileAppIsForeground") 

// mise à jour de triggerNotification

func triggerNotification(){ 
     let content = UNMutableNotificationContent() 
     content.title = NSString.localizedUserNotificationString(forKey: "Notification Testing", arguments: nil) 
     content.body = NSString.localizedUserNotificationString(forKey: "This is a test", arguments: nil) 
     content.sound = UNNotificationSound.default() 
     content.badge = (UIApplication.shared.applicationIconBadgeNumber + 1) as NSNumber; 
    content.setValue("YES", forKeyPath: "shouldAlwaysAlertWhileAppIsForeground") //Update is here 

     let trigger = UNTimeIntervalNotificationTrigger(
      timeInterval: 1.0, 
      repeats: false) 

     let request = UNNotificationRequest.init(identifier: "testTriggerNotif", content: content, trigger: trigger) 

     let center = UNUserNotificationCenter.current() 
     center.add(request) 
} 

Ajouter ci-dessous méthode AppDelegate

// This method will be called when app received push notifications in foreground 

     func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
      completionHandler(UNNotificationPresentationOptions.alert) 
     } 
+0

Où puis-je ajouter ceci? Dans le viewDidLoad? – Dinuka

+0

@RickGrimesLikesWalkerSoup utilise une réponse mise à jour. Ajoutez simplement la clé et la méthode ci-dessous dans Appdelegate. –

+0

Ça marche! Je vous remercie! – Dinuka

0

UNUserNotificationCenter.current(). Achèvement de requestAuthorization Le gestionnaire fonctionne de manière asynchrone (la méthode est gérée dans un thread différent). C'est pourquoi l'instruction "if isGrantedNotificationAccess .." dans votre code a été lue avant l'achèvement de completionHandler.

Il existe plusieurs façons de résoudre le problème. L'une consiste à utiliser NotificationCenter pour notifier la fin de la méthode requestAuthorization à HomeViewController (voir l'exemple ci-dessous).

import UserNotifications 

class HomeViewController: UIViewController{ 

let notification = Notification.Name("requestAuthorizationComplete") 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Register self as Observer to receive notification 
    NotificationCenter.default.addObserver(self, selector: #selector(self.triggerNotification), name: notification, object: nil) 

    UNUserNotificationCenter.current().requestAuthorization(
     options: [.alert,.sound,.badge], 
     completionHandler: { (granted,error) in 
     NotificationCenter.default.post(name: self.notification, object: nil) 
    }) 

} 

func triggerNotification(notification:NSNotification?){ 
// this function will be called once requestAuthorization is complete 
} 
+0

Pas de changement. Cependant, il ne se déclenche pas – Dinuka

+0

Je viens de corriger une notification de faute de frappe -> self.notification et cela fonctionne très bien de mon côté. S'il vous plaît essayez ceci. – cat

+0

Bizarre, le mien ne se fait toujours pas virer. Pourriez-vous également afficher la fonction triggerNotification de la vôtre? – Dinuka