unresolved unmutablenotificationcontent notification example ios swift apple-push-notifications uilocalnotification

ios - unmutablenotificationcontent - unusernotificationcenter



Notificaciones locales y push en versiĆ³n compatible con iOS (2)

He hecho esta clase para Swift 3 que tiene una función para solicitar permiso para enviar notificaciones y también una notificación de envío. Funciona en iOS 9 y iOS 10+.

import UIKit import UserNotifications class LocalNotification: NSObject, UNUserNotificationCenterDelegate { class func registerForLocalNotification(on application:UIApplication) { if (UIApplication.instancesRespond(to: #selector(UIApplication.registerUserNotificationSettings(_:)))) { let notificationCategory:UIMutableUserNotificationCategory = UIMutableUserNotificationCategory() notificationCategory.identifier = "NOTIFICATION_CATEGORY" //registerting for the notification. application.registerUserNotificationSettings(UIUserNotificationSettings(types:[.sound, .alert, .badge], categories: nil)) } } class func dispatchlocalNotification(with title: String, body: String, userInfo: [AnyHashable: Any]? = nil, at date:Date) { if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() let content = UNMutableNotificationContent() content.title = title content.body = body content.categoryIdentifier = "Fechou" if let info = userInfo { content.userInfo = info } content.sound = UNNotificationSound.default() let comp = Calendar.current.dateComponents([.hour, .minute], from: date) let trigger = UNCalendarNotificationTrigger(dateMatching: comp, repeats: true) let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) center.add(request) } else { let notification = UILocalNotification() notification.fireDate = date notification.alertTitle = title notification.alertBody = body if let info = userInfo { notification.userInfo = info } notification.soundName = UILocalNotificationDefaultSoundName UIApplication.shared.scheduleLocalNotification(notification) } print("WILL DISPATCH LOCAL NOTIFICATION AT ", date) } }

Uso:

Puedes solicitar permiso en cualquier lugar:

LocalNotification.registerForLocalNotification(on: UIApplication.shared)

Y para despachar una notificación local:

LocalNotification.dispatchlocalNotification(with: "Notification Title for iOS10+", body: "This is the notification body, works on all versions", at: Date().addedBy(minutes: 2))

Propina:

Puede configurar la notificación para que se active en cualquier Fecha futura; en este ejemplo, estoy usando una extensión de fecha para obtener una fecha futura en minutos para el incendio de la notificación. Eso es todo:

extension Date { func addedBy(minutes:Int) -> Date { return Calendar.current.date(byAdding: .minute, value: minutes, to: self)! } }

Desarrollé local Notifications en iOS 10 . Está funcionando perfectamente. Pero ahora, ¿cómo debo codificar local notifications y push notification si el usuario está usando iOS 9 y versiones superiores? ¿Alguien puede ayudar por favor?

A continuación se muestra el código en iOS 10

import UIKit import UserNotifications @available(iOS 10.0, *) class ViewController: UIViewController,UNUserNotificationCenterDelegate { override func viewDidLoad() { super.viewDidLoad() if #available(iOS 10.0, *) { //Seeking permission of the user to display app notifications UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge], completionHandler: {didAllow,Error in }) UNUserNotificationCenter.current().delegate = self } } //To display notifications when app is running inforeground func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .sound, .badge]) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func buttonPressed(_ sender: UIButton) { if #available(iOS 10.0, *) { //Setting content of the notification let content = UNMutableNotificationContent() content.title = "hello" content.body = "notification pooped out" content.badge = 1 //Setting time for notification trigger let date = Date(timeIntervalSinceNow: 10) var dateCompenents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date) let trigger = UNCalendarNotificationTrigger(dateMatching: dateCompenents, repeats: false) //Adding Request let request = UNNotificationRequest(identifier: "timerdone", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) } } }


IOS 12 : - Notificación de grupo

configura threadIdentifier UNMutableNotificationContent para crear una notificación de grupo

crear grupo de notificación local

let content = UNMutableNotificationContent() content.title = "Group Notifications" content.body = "Body of notification" content.threadIdentifier = "group-identifire"

crear un grupo de notificación remota debe pasar thread-id en la carga útil

{ "aps" : { "alert" : { "title" : "Group Notifications", "body" : "Body of notification" } "thread-id" : "group-identifire" } }

IOS 11 : - También puede usar el siguiente código para iOS 11. No se requiere ningún tipo de cambio en la notificación local y de inserción

Creación de una solicitud de notificación

import UserNotifications if #available(iOS 10.0, *) { //iOS 10.0 and greater UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert], completionHandler: { granted, error in DispatchQueue.main.async { if granted { UIApplication.shared.registerForRemoteNotifications() } else { //Do stuff if unsuccessful... } } }) } else { //iOS 9 let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound] let setting = UIUserNotificationSettings(types: type, categories: nil) UIApplication.shared.registerUserNotificationSettings(setting) UIApplication.shared.registerForRemoteNotifications() }

Programar notificación local

if #available(iOS 10.0, *) { //iOS 10 or above version let center = UNUserNotificationCenter.current() let content = UNMutableNotificationContent() content.title = "Late wake up call" content.body = "The early bird catches the worm, but the second mouse gets the cheese." content.categoryIdentifier = "alarm" content.userInfo = ["customData": "fizzbuzz"] content.sound = UNNotificationSound.default() var dateComponents = DateComponents() dateComponents.hour = 15 dateComponents.minute = 49 let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true) let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) center.add(request) } else { // ios 9 let notification = UILocalNotification() notification.fireDate = NSDate(timeIntervalSinceNow: 5) as Date notification.alertBody = "Hey you! Yeah you! Swipe to unlock!" notification.alertAction = "be awesome!" notification.soundName = UILocalNotificationDefaultSoundName UIApplication.shared.scheduleLocalNotification(notification) }

UIApplicationDelegate

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenParts = deviceToken.map { data -> String in return String(format: "%02.2hhx", data) } let token = tokenParts.joined() print(token) } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { }

UNUserNotificationCenterDelegate

Solo disponible en ios 10 y superior.

El método se invocará en el delegado solo si la aplicación está en primer plano

Puedes presentar el banner por defecto con la ayuda del siguiente método.

@available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.badge,.alert,.sound]) }

El método se llamará al delegado cuando el usuario responda a la notificación abriendo la aplicación, descartando la notificación o eligiendo una UNNotificationAction

@available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { }