Obteniendo notificaciones locales para mostrar mientras la aplicación está en primer plano Swift 3

Aparentemente esto ahora es posible con ios10:

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

Esta respuesta básicamente dice las herramientas necesarias para hacerlo:

¿Mostrar un banner de notificación de iOS stock cuando su aplicación está abierta y en primer plano?

Simplemente no estoy realmente entendiendo cómo poner todo junto.

No sé qué tan importante es esto, pero no puedo mantener el func opcional y xcode quiere que lo cambie a privado.

Estoy tratando de mostrar la insignia, y los documentos proporcionan

 static var badge: UNNotificationPresentationOptions { get } 

Poco perdido aquí.

¿Y luego supongo que si quiero excluir que cierto controlador de vista obtenga estas insignias y no estoy usando un controlador de navegación, este código que encontré funcionaría? : ventana var: UIWindow?

 if let viewControllers = window?.rootViewController?.childViewControllers { for viewController in viewControllers { if viewController.isKindOfClass(MyViewControllerClass) { print("Found it!!!") } } } 

    Hay un método delegado para mostrar la notificación cuando la aplicación está abierta en iOS 10. Tienes que implementar esto para que las notificaciones enriquecidas funcionen cuando la aplicación está abierta.

     extension ViewController: UNUserNotificationCenterDelegate { //for displaying notification when app is in foreground func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { //If you don't want to show notification when app is open, do something here else and make a return here. //Even you you don't implement this delegate method, you will not see the notification on the specified controller. So, you have to implement this delegate and make sure the below line execute. ie completionHandler. completionHandler([.alert, .badge, .sound]) } // For handling tap and user actions func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { switch response.actionIdentifier { case "action1": print("Action First Tapped") case "action2": print("Action Second Tapped") default: break } completionHandler() } } 

    Para progtwigr una notificación en iOS 10 y proporcionar una insignia

     override func viewDidLoad() { super.viewDidLoad() // set UNUserNotificationCenter delegate to self UNUserNotificationCenter.current().delegate = self scheduleNotifications() } func scheduleNotifications() { let content = UNMutableNotificationContent() let requestIdentifier = "rajanNotification" content.badge = 1 content.title = "This is a rich notification" content.subtitle = "Hello there, I am Rajan Maheshwari" content.body = "Hello body" content.categoryIdentifier = "actionCategory" content.sound = UNNotificationSound.default() // If you want to attach any image to show in local notification let url = Bundle.main.url(forResource: "notificationImage", withExtension: ".jpg") do { let attachment = try? UNNotificationAttachment(identifier: requestIdentifier, url: url!, options: nil) content.attachments = [attachment!] } let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 3.0, repeats: false) let request = UNNotificationRequest(identifier: requestIdentifier, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request) { (error:Error?) in if error != nil { print(error?.localizedDescription) } print("Notification Register Success") } } 

    Para registrarse en AppDelegate tenemos que escribir este fragmento de código en didFinishLaunchingWithOptions

      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. registerForRichNotifications() return true } 

    También he definido acciones aquí. Puede omitirlos

     func registerForRichNotifications() { UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound]) { (granted:Bool, error:Error?) in if error != nil { print(error?.localizedDescription) } if granted { print("Permission granted") } else { print("Permission not granted") } } //actions defination let action1 = UNNotificationAction(identifier: "action1", title: "Action First", options: [.foreground]) let action2 = UNNotificationAction(identifier: "action2", title: "Action Second", options: [.foreground]) let category = UNNotificationCategory(identifier: "actionCategory", actions: [action1,action2], intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([category]) } 

    Si desea que su banner de notificación se muestre en todas partes en la aplicación completa, puede escribir al delegado de UNUserNotificationDelegate en AppDelegate y hacer que UNUserNotificationCenter delegue en AppDelegate

     extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print(response.notification.request.content.userInfo) completionHandler() } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void { completionHandler([.alert, .badge, .sound]) } } 

    Mira este enlace para más detalles
    https://www.youtube.com/watch?v=Svul_gCtzck

    Muestra Github
    https://github.com/kenechilearnscode/UserNotificationsTutorial

    Aquí está la salida

    enter image description here

    enter image description here

    Swift 3 | iOS 10+

    Suponiendo que sepa cómo progtwigr una notificación local:

     func scheduleLocalNotification(forDate notificationDate: Date) { let calendar = Calendar.init(identifier: .gregorian) let requestId: String = "123" let title: String = "Notification Title" let body: String = "Notification Body" // construct notification content let content = UNMutableNotificationContent() content.title = NSString.localizedUserNotificationString(forKey: title, arguments: nil) content.body = NSString.localizedUserNotificationString(forKey: body, arguments: nil) content.sound = UNNotificationSound.default() content.badge = 1 content.userInfo = [ "key1": "value1" ] // configure trigger let calendarComponents: [Calendar.Component] = [.year, .month, .day, .hour, .minute] let dateComponents = calendar.dateComponents(calendarComponents, from: notificationDate) let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false) // create the request let request = UNNotificationRequest.init(identifier: requestId, content: content, trigger: trigger) // schedule notification UNUserNotificationCenter.current().add(request) { (error: Error?) in if let error = error { // handle error } } } 

    UNUserNotificationCenterDelegate hacer que su AppDelegate implemente el protocolo UNUserNotificationCenterDelegate y establecerlo como el delegado del centro de notificación con UNUserNotificationCenter.current().delegate = self .

     // AppDelegate.swift import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // set app delegate as notification center delegate UNUserNotificationCenter.current().delegate = self } } extension AppDelegate: UNUserNotificationCenterDelegate { // called when user interacts with notification (app not running in foreground) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // do something with the notification print(response.notification.request.content.userInfo) // the docs say you should execute this asap return completionHandler() } // called if app is running in foreground func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // show alert while app is running in foreground return completionHandler(UNNotificationPresentationOptions.alert) } } 

    Ahora sus notificaciones locales aparecerán cuando su aplicación esté en primer plano.

    Consulte los documentos UNUserNotificationCenterDelegate para referencia.

    La clave para hacer que sus notificaciones aparezcan mientras su aplicación está en primer plano también establece:

     content.setValue(true, forKey: "shouldAlwaysAlertWhileAppIsForeground") 

    en su UNNotificationRequest . En cuanto al rest, vea la excelente respuesta de Rajan Maheshwari .