web-dev-qa-db-fra.com

Ajouter une notification locale dans ios10 - Swift 3

Edit: Donc, mettre l'application en arrière-plan a fait l'affaire.

Original:

J'ai donc essayé d'ajouter une notification au nouvel UNUserNotificationCenter, mais je ne semble pas l'avoir.

Mon contrôleur de vue a une action:

@IBAction func sendPressed(_ sender: AnyObject) {
    let content = UNMutableNotificationContent()

    content.title = "Hello"
    content.body = "What up?"
    content.sound = UNNotificationSound.default()

    // Deliver the notification in five seconds.
    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
    let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)

    // Schedule the notification.
    let center = UNUserNotificationCenter.current()
    center.add(request) { (error) in
        print(error)
    }
    print("should have been added")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let center = UNUserNotificationCenter.current()
    center.requestAuthorization([.alert, .sound]) { (granted, error) in
    }
}

Et j'ai aussi un Notification Content Extension dans le projet, mais ça ne semble pas être déclenché du tout, des idées qui me manquent? J'essaie l'exemple de la documentation utilisateur, mais cela ne me dit pas grand-chose ou je l'ai raté.

Ici: https://developer.Apple.com/reference/usernotifications/unmutablenotificationcontent

Aussi: https://developer.Apple.com/reference/usernotificationsuihttps://developer.Apple.com/reference/usernotifications

25
Bjarte

Vous devez vous inscrire pour Notification ... J'ai essayé et cela fonctionne. 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization([.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
        return true
    }

Edit: Vous n'avez pas besoin de mettre votre application en arrière-plan pour présenter une notification à partir de iOS 10.

Utilisez le rappel ci-dessous pour configurer la notification à présenter au premier plan.

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

Ici est un exemple de projet.

29
LC 웃

Avec implémentation Objective-C:

J'ai écrit un projet de démonstration ici: iOS10AdaptationTips .

  1. importer UserNotifications

    ///Notification become independent from Foundation
    @import UserNotifications;
    
  2. demander une autorisation pour la notification locale

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request authorization succeeded!");
                                  [self showAlert];
                              }
                          }];
    

    Demander une autorisation:  enter image description here

  3. calendrier localNotification

  4. mettre à jour le numéro de badge d'icône d'application

        //        //Deliver the notification at 08:30 everyday
        //        NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
        //        dateComponents.hour = 8;
        //        dateComponents.minute = 30;
        //        UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:dateComponents repeats:YES];
    
        UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
        content.title = [NSString localizedUserNotificationStringForKey:@"Elon said:" arguments:nil];
        content.body = [NSString localizedUserNotificationStringForKey:@"Hello Tom!Get up, let's play with Jerry!"
                                                             arguments:nil];
        content.sound = [UNNotificationSound defaultSound];
    
        /// 4. update application icon badge number
        content.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);
        // Deliver the notification in five seconds.
        UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger
                                                      triggerWithTimeInterval:5.f repeats:NO];
        UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
                                                                              content:content trigger:trigger];
        /// 3. schedule localNotification
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
            if (!error) {
                NSLog(@"add NotificationRequest succeeded!");
            }
        }];
    

alors cela va ressembler à ceci:

En arrière-plan :  enter image description here Écran verrouillé:
 enter image description here

Si Répéter par défaut, n'en affichez qu'un  enter image description here au lieu d'afficher plusieurs sur l'écran de verrouillage sous iOS9: http://i67.tinypic.com/98t75s.jpg et supporte également 3D Touch automatiquement http://a67.tinypic.com/dorw3b.jpg

J'écris une démo ici: iOS10AdaptationTips .

17
ElonChan

Voici quelques étapes:

  1. Assurez-vous que vous avez le permission. Sinon, utilisez UNUserNotificationCenter.current (). RequestAuthorization pour l'obtenir. Ou suivez les instructions réponse si vous souhaitez afficher la demande plusieurs fois.

  2. Si vous souhaitez afficher la notification foreground, vous devez affecter UNUserNotificationCenterDelegate quelque part.

  3. Montre moi le code

    @IBAction func sendPressed(_ sender: AnyObject) {
        let content = UNMutableNotificationContent()
        content.title = "Hello"
        content.body = "What up?"
        content.sound = UNNotificationSound.default()
    
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
        let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)
    
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error) in
            print(error)
        }
    }
    
    override func viewDidLoad(_ animated: Bool) {
        super.viewDidLoad(animated)
    
        // Assign the delegate
        UNUserNotificationCenter.current().delegate = self
    
        // Ask the permission
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization([.alert, .sound]) { (granted, error) in
            if granted {
                // do something
            }
        }
    }
    // Remember to add UNUserNotificationCenterDelegate to your view controller
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("Got the msg...")
        completionHandler([.badge, .sound, .alert])
    }
    
1
Allen Wang

J'ai résolu mon problème comme suit (Firebase, Swift 3):  

Trouvez cette méthode sur votre AppDelegate:

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

Trouver cette ligne:

completionHandler()

Ensemble final:

completionHandler([.alert,.sound,.badge])

les notifications ne se déclenchent pas si vous ne passez pas vos options de présentation à la méthode completionHandler.

0
ibrahimyilmaz

J'ai fait une implémentation pour Swift 3 qui peut aider, vous pouvez le vérifier ici: https://stackoverflow.com/a/45381380/2296630

0
mourodrigo