Recevez une notification push lorsque l'application est en avant-plan iOS

J'utilise le service de notification push dans mon application. Lorsque l'application est en arrière-plan, je suis en mesure de voir une notification sur l'écran de notification (écran affiché lorsque nous balançons à partir du haut de l'appareil iOS). Mais si l'application est au premier plan, la méthode du délégué

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

est appelé mais la notification n'est pas affichée dans l'écran de notification.

Je souhaite afficher une notification sur l'écran de notification, que l'application soit en arrière-plan ou au premier plan. Je suis fatigué en cherchant une solution. Toute aide est grandement appréciée.

Pour afficher un message de bannière lorsque l'application est en avant-plan, utilisez la méthode suivante.

iOS 10, Swift 3 :

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

Le code ci-dessous sera le travail pour vous:

 - (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:[NSSsortingng ssortingngWithFormat:@"Your App name received this notification while it was running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; } } 

Pour n'importe qui pourrait être intéressé, j'ai fini par créer une vue personnalisée qui ressemble à la bannière de poussée du système sur le dessus, mais ajoute un button de fermeture (petit bleu X) et une option pour appuyer sur le message pour une action personnalisée. Il prend également en charge le cas où plus d'une notification est arrivée avant que l'user ait eu le time de lire / rejeter les anciennes (sans limite au nombre de celles qui peuvent s'accumuler …)

Lien vers GitHub: AGPushNote

L'utilisation est essentiellement sur-liner:

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

Et ça ressemble à ça sur iOS7 (iOS6 a un look et un feeling iOS6 …)

entrez la description de l'image ici

Si l'application s'exécute au premier plan, iOS n'affichera pas de bannière / alerte de notification. C'est par design. Mais nous pouvons y parvenir en utilisant UILocalNotification comme suit

  • Vérifier si l'application est active à la réception d'une télécommand
    notification. Si à l'état actif, triggersz une 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]; } 

Si l'application s'exécute au premier plan, iOS n'affichera pas de bannière / alerte de notification. C'est par design. Vous devez écrire du code pour gérer la situation de votre application qui reçoit une notification alors qu'elle est au premier plan. Vous devez afficher la notification de la manière la plus appropriée (par exemple, en ajoutant un numéro de badge à une icône UITabBar , en simulant une bannière de Notification Center, etc.).

Objectif c

entrez la description de l'image ici

Pour iOS 10, nous devons intégrer la méthode willPresentNotification pour afficher la bannière de notification au premier plan.

Si l'application est en mode premier plan (active)

 - (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); } 

Vous pouvez créer votre propre notification qui imite l'alerte de la bannière.

L'one-way est de créer un uiview personnalisé qui ressemble à la bannière et peut animer et répondre aux contacts. Dans cet esprit, vous pouvez créer des bannières encore meilleures avec encore plus de fonctionnalités.

Ou vous pouvez searchr une API qui le fait pour vous et les append en tant que podfiles à votre projet.

Voici un couple que j'ai utilisé:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages

Voici le code pour recevoir la notification push lorsque l'application est en état actif (premier plan ou ouvert). UNUserNotificationCenter documentation

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

Si vous devez accéder à userInfo de notification, utilisez le code: notification.request.content.userInfo

L'ajout de la ligne completionHandler à la méthode déléguée a résolu le même problème pour moi:

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

Selon la documentation Apple, Oui, vous pouvez afficher une notification lorsque l'application est en cours d'exécution entrez la description de l'image ici

Dans le délégué de votre application, utilisez le code ci-dessous

 import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var currentToken: Ssortingng? 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 -> Ssortingng in return Ssortingng(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]) } } 

Si votre application est à l'avant-plan, cela signifie que vous utilisez actuellement la même application. Donc, il n'est pas nécessaire de montrer la notification sur le dessus en général.

Mais encore si vous voulez montrer la notification dans ce cas vous devez créer votre vue alerte personnalisée ou vue personnalisée comme Toast ou autre chose pour montrer à l'user que vous avez reçu une notification.

Vous pouvez également afficher un badge en haut si vous avez ce type de fonctionnalité dans votre application.

Comme @Danial Martine a déclaré iOS ne montrera pas une bannière de notification / alerte. C'est par design. Mais si vraiment il faut le faire alors il y a un moyen. J'ai également réaliser cela par le même.

1.Téléchargez le travail d'parsing de cadre à partir de Parse FrameWork

2.Import #import <Parse/Parse.h>

3. Ajoutez le code suivant à votre méthode didReceiveRemoteNotification

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

PFPush prendra soin de gérer la notification à distance. Si l'application est en premier plan, elle affiche l'alerte, sinon elle affiche la notification en haut.