unresolved notification swift swift3 uilocalnotification ios10 unusernotificationcenter

unresolved - unusernotificationcenter swift 4



Agregar notificación local en iOS 10-Swift 3 (5)

Así que he estado tratando de agregar una notificación al nuevo UNUserNotificationCenter, pero parece que no lo consigo.

Mi controlador de vista tiene una acción:

@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 } }

Y también tengo una Notification Content Extension en el proyecto, pero no parece activarse en absoluto, ¿alguna idea de lo que me falta? Estoy probando el ejemplo de la documentación del usuario, pero no me dice mucho más o me lo he perdido.

Aquí: https://developer.apple.com/reference/usernotifications/unmutablenotificationcontent

También: https://developer.apple.com/reference/usernotificationsui https://developer.apple.com/reference/usernotifications

Editar:

Así que poner la aplicación en segundo plano hizo el truco.


Aquí hay algunos pasos:

  1. Asegúrate de tener el permiso . De lo contrario, use UNUserNotificationCenter.current (). RequestAuthorization para obtener eso. O siga la answer si desea mostrar la solicitud emergente más de una vez.

  2. Si desea mostrar el primer plano de la notificación, debe asignar UNUserNotificationCenterDelegate a algún lugar.

  3. Muéstrame el código

    @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]) }


Con la implementación de Objective-C:

He escrito un proyecto de demostración aquí: iOS10AdaptationTips .

  1. importar notificaciones de usuario

    ///Notification become independent from Foundation @import UserNotifications;

  2. solicitar autorización para notificación local

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

    Solicitar autorización:

  3. programar localNotification

  4. actualizar el número de insignia del icono de la aplicación

    // //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!"); } }];

entonces aparecerá así:

En el fondo : Bloquear pantalla:

Si repetir por defecto solo muestra uno en lugar de mostrar muchos en la pantalla de bloqueo en iOS9: http://i67.tinypic.com/98t75s.jpg y también es compatible con 3D Touch automáticamente http://a67.tinypic.com/dorw3b.jpg

Escribo una demostración aquí: iOS10AdaptationTips .


He realizado una implementación para Swift 3 que puede ayudar, puede verificarlo aquí: https://.com/a/45381380/2296630


Necesitas registrarte para la Notificación ... Lo intenté y esto funciona.

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 }

Editar: No necesita poner su aplicación en segundo plano para presentar notificaciones desde iOS 10 en adelante.

Use la devolución de llamada a continuación para configurar la notificación para presentarla en primer plano.

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

Here hay un proyecto de muestra.


Resolví mi problema de la siguiente manera (Firebase, Swift 3):

Encuentre este método en su AppDelegate:

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

Encuentra esta línea:

completionHandler()

Conjunto final:

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

las notificaciones no se activan si no pasa sus opciones de presentación al método completeHandler.