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
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.
Avec implémentation Objective-C:
J'ai écrit un projet de démonstration ici: iOS10AdaptationTips .
importer UserNotifications
///Notification become independent from Foundation
@import UserNotifications;
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];
}
}];
calendrier localNotification
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 : Écran verrouillé:
Si Répéter par défaut, n'en affichez qu'un 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 .
Voici quelques étapes:
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.
Si vous souhaitez afficher la notification foreground, vous devez affecter UNUserNotificationCenterDelegate quelque part.
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])
}
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.
J'ai fait une implémentation pour Swift 3 qui peut aider, vous pouvez le vérifier ici: https://stackoverflow.com/a/45381380/2296630