Obtener notificación push mientras la aplicación en primer plano iOS

Estoy usando el servicio de notificación de inserción en mi aplicación. Cuando la aplicación está en segundo plano, puedo ver la notificación en la pantalla de notificación (se muestra la pantalla cuando deslizamos hacia abajo desde la parte superior del dispositivo iOS). Pero si la aplicación está en primer plano, el método delegado

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo 

se está llamando, pero la notificación no se muestra en la pantalla de notificación.

Deseo mostrar la notificación en la pantalla de notificación independientemente de si la aplicación está en segundo plano o en primer plano. Estoy cansado de buscar una solución. Cualquier ayuda es muy apreciada.

Para mostrar un mensaje de banner mientras la aplicación está en primer plano, use el siguiente método.

iOS 10, Swift 3/4 :

 // This method will be called when app received push notifications in foreground func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } 

iOS 10, Swift 2.3 :

 @available(iOS 10.0, *) func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { //Handle the notification completionHandler( [UNNotificationPresentationOptions.Alert, UNNotificationPresentationOptions.Sound, UNNotificationPresentationOptions.Badge]) } 

También debe registrar su delegado de aplicación como delegado para el centro de notificaciones:

 import UserNotifications // snip! class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate // snip! // set the delegate in didFinishLaunchingWithOptions UNUserNotificationCenter.current().delegate = self 

A continuación, el código será de utilidad para usted:

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { application.applicationIconBadgeNumber = 0; //self.textView.text = [userInfo description]; // We can determine whether an application is launched as a result of the user tapping the action // button or whether the notification was delivered to the already-running application by examining // the application state. if (application.applicationState == UIApplicationStateActive) { // Nothing to do if applicationState is Inactive, the iOS already displayed an alert view. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Did receive a Remote Notification" message:[NSString stringWithFormat:@"Your App name received this notification while it was running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; } } 

Para cualquier persona podría interesarme, terminé creando una vista personalizada que se parece al banner de inserción del sistema en la parte superior, pero agrega un botón de cerrar (X pequeña azul) y una opción para tocar el mensaje de acción personalizada. También admite el caso de que haya más de una notificación antes de que el usuario tenga tiempo para leer / descartar las anteriores (sin límite de cuántas pueden acumularse …)

Enlace a GitHub: AGPushNote

El uso es básicamente en línea:

 [AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"]; 

Y se ve así en iOS7 (iOS6 tiene un aspecto iOS6 …)

enter image description here

C objective

enter image description here

Para iOS 10 , necesitamos integrar el método willPresentNotification para mostrar el banner de notificación en foreground .

Si la aplicación está en modo de primer plano (activa)

 - (void)userNotificationCenter:(UNUserNotificationCenter* )center willPresentNotification:(UNNotification* )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { NSLog( @“Here handle push notification in foreground" ); //For notification Banner - when app in foreground completionHandler(UNNotificationPresentationOptionAlert); // Print Notification info NSLog(@"Userinfo %@",notification.request.content.userInfo); } 

Si la aplicación se ejecuta en primer plano, iOS no mostrará un banner / alerta de notificación. Eso es por diseño. Pero podemos lograrlo usando UILocalNotification siguiente manera

  • Verificar si la aplicación está en estado activo al recibir un control remoto
    notificación. Si está activo enciende una UILocalNotification.

     if (application.applicationState == UIApplicationStateActive ) { UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.userInfo = userInfo; localNotification.soundName = UILocalNotificationDefaultSoundName; localNotification.alertBody = message; localNotification.fireDate = [NSDate date]; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; } 

RÁPIDO:

 if application.applicationState == .active { var localNotification = UILocalNotification() localNotification.userInfo = userInfo localNotification.soundName = UILocalNotificationDefaultSoundName localNotification.alertBody = message localNotification.fireDate = Date() UIApplication.shared.scheduleLocalNotification(localNotification) } 

Si la aplicación se ejecuta en primer plano, iOS no mostrará un banner / alerta de notificación. Eso es por diseño. Debe escribir un código para tratar la situación de su aplicación que recibe una notificación mientras está en primer plano. Debe mostrar la notificación de la manera más adecuada (por ejemplo, agregar un número de distintivo a un icono UITabBar , simular un banner del Centro de notificaciones, etc.).

Puede crear su propia notificación que imita la alerta de pancarta.

Una forma es crear una vista personalizada que se parezca al banner y puede animar y responder a los toques. Con esto en mente, puede crear pancartas aún mejores con aún más funcionalidad.

O puede buscar una API que lo haga por usted y agregarlos como podfiles a su proyecto.

Aquí hay una pareja que he usado:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages

Aquí está el código para recibir notificaciones push cuando la aplicación está activa (en primer plano o abierta). Documentación UNUserNotificationCenter

 @available(iOS 10.0, *) func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge]) } 

Si necesita acceder a userInfo de notificación use code: notification.request.content.userInfo

De acuerdo con la documentación de apple, sí puede mostrar notificaciones mientras se ejecuta la aplicación enter image description here

En tu aplicación delegado usa el código abajo

 import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var currentToken: String? var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. application.registerForRemoteNotifications() let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in // Enable or disable features based on authorization. if granted == true { print("Allow") UIApplication.shared.registerForRemoteNotifications() } else { print("Don't Allow") } } UNUserNotificationCenter.current().delegate = self return true } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){ let tokenParts = deviceToken.map { data -> String in return String(format: "%02.2hhx", data) } let token = tokenParts.joined() currentToken = token //get device token to delegate variable } public class var shared: AppDelegate { return UIApplication.shared.delegate as! AppDelegate } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } } 

Al agregar esa línea de completionHandler para delegar el método, me solucionó el mismo problema:

 //Called when a notification is delivered to a foreground app. @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } 

Como se mencionó anteriormente, debe usar UserNotification.framework para lograr esto. Pero para mis propósitos, tengo que mostrarlo en la aplicación de todos modos y quería tener el estilo iOS 11 , así que he creado una pequeña vista de ayudante, tal vez sería útil para alguien.

GitHub iOS 11 Push Notification View .

Si su aplicación está en primer plano, significa que está utilizando la misma aplicación. Por lo tanto, no es necesario mostrar una notificación en la parte superior en general.

Pero aún así, si desea mostrar una notificación en ese caso, debe crear su Vista de alerta personalizada o Vista personalizada, como Toast u otra cosa, para mostrarle al usuario que tiene una notificación.

También puede mostrar una insignia en la parte superior si tiene ese tipo de característica en su aplicación.

Como @Danial Martine dijo que iOS no mostrará un banner / alerta de notificación. Eso es por diseño. Pero si realmente tiene que hacerlo, entonces hay una manera. También he logrado esto por el mismo.

1.Descargue el trabajo de marco de análisis de Parse FrameWork

2. Importación # importación #import

3.Añada el siguiente código a su método didReceiveRemoteNotification

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [PFPush handlePush:userInfo]; } 

PFPush se ocupará de cómo manejar la notificación remota. Si la aplicación está en primer plano, muestra la alerta; de lo contrario, muestra la notificación en la parte superior.