ios swift swift3 uilocalnotification unusernotificationcenter

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



swift3 uilocalnotification (4)

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:

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

Simplemente no entiendo cómo poner todo junto.

No sé lo importante que 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 a cierto controlador de vista de obtener estas insignias y no estoy usando un controlador de navegación, ¿este código que encontré funcionaría? : var ventana: UIWindow?

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


Cuando su aplicación está abierta en primer plano, llame al método UserNotificationCenter

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


Hay un método de delegado para mostrar la notificación cuando la aplicación está abierta en iOS 10. Debe 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. i.e. 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 programar 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 registrarnos en AppDelegate tenemos que escribir este 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í. Puedes saltearlos

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 toda la aplicación, puede escribir el delegado de UNUserNotificationDelegate en AppDelegate y hacer que el UNUserNotificationCenter sea ​​el delegado actual 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


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

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

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


Swift 3 | iOS 10+

Suponiendo que sepa cómo programar 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 notificaciones 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.