Afficher une bannière de notification iOS stock lorsque votre application est ouverte et au premier plan?

Lorsque l'application officielle iOS Messages d'Apple est ouverte et au premier plan, les nouveaux messages provenant d'autres contacts triggersnt une bannière d'alerte de notification iOS native. Voir l'image ci-dessous.

Est-ce possible dans les applications tierces sur l'App Store? Notifications locales et / ou push pour votre application pendant que votre application est ouverte et au premier plan ?

Lors du test de mon application , des notifications sont reçues, mais aucune interface user d'alerte iOS n'est affichée .

Mais ce comportement est vu dans l'application Messages officielle d'Apple:

Les messages sont ouverts et au premier plan. Affiche toujours une alerte de notification.

Le Guide de programmation des notifications locales et distantes dit:

Lorsque le operating system envoie une notification locale ou une notification à distance et que l'application cible n'est pas exécutée au premier plan , elle peut présenter la notification à l'user via une alerte , un numéro de badge d'icône ou un son.

Si l'application s'exécute au premier plan lors de la remise de la notification, le délégué de l'application reçoit une notification locale ou distante.

Donc oui, nous pouvons recevoir les données de notification au premier plan. Mais je ne vois aucun moyen de présenter l'interface user d'alerte de notification iOS natif .

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // I know we still receive the notification `userInfo` payload in the foreground. // This question is about displaying the stock iOS notification alert UI. // Yes, one *could* use a 3rd party toast alert framework. [self use3rdPartyToastAlertFrameworkFromGithub] } 

Messages utilise-t-il une API privée pour afficher l'alerte au premier plan?

Pour les besoins de cette question, ne suggérez pas d'alertes pop-up tierces "toast" sur github ou etc. Je ne suis intéressé que si cela peut être fait en utilisant l'interface iOS d' alertes locales ou Push Notification pendant que votre application est ouvert et au premier plan .

iOS 10 ajoute le protocole UNUserNotificationCenterDelegate pour gérer les notifications lorsque votre application est au premier plan.

Le protocole UNUserNotificationCenterDelegate définit des methods pour recevoir des notifications et pour gérer des actions. Lorsque votre application est au premier plan, les notifications arrivantes sont envoyées à votre object délégué au lieu d'être affichées automatiquement à l'aide des interfaces système.

Rapide:

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

Objectif c:

 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler; 

Les indicateurs UNNotificationPresentationOptions vous permettent de spécifier UNNotificationPresentationOptionAlert pour afficher une alerte à l'aide du text fourni par la notification.

C'est la key car elle vous permet d'afficher l'alerte lorsque votre application est ouverte et au premier plan , ce qui est nouveau pour iOS 10.

Exemple de code:

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

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

iOS 10, Swift 3 :

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

Pour afficher les notifications lorsque l'application est ouverte, nous devons le gérer manuellement. Donc ce que je fais ci-dessous est de gérer la notification une fois reçue.

Ajouter tout ci-dessous dans AppDelegate.m

  1. Gérer l'appel pour notifier
  2. Créer une vue, append AppIcon, Message de notification et l'afficher en tant qu'animation
  3. Ajouter Reconnaissance tactile pour supprimer si touché ou supprimer dans 5 secondes avec animation.

Faites-moi savoir si c'est une bonne solution. J'ai bien travaillé pour moi mais je ne sais pas si c'est la bonne façon.

 - (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSSsortingng *notifMessage = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]; //Define notifView as UIView in the header file [_notifView removeFromSuperview]; //If already existing _notifView = [[UIView alloc] initWithFrame:CGRectMake(0, -70, self.window.frame.size.width, 80)]; [_notifView setBackgroundColor:[UIColor blackColor]]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10,15,30,30)]; imageView.image = [UIImage imageNamed:@"AppLogo.png"]; UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 15, self.window.frame.size.width - 100 , 30)]; myLabel.font = [UIFont fontWithName:@"Helvetica" size:10.0]; myLabel.text = notifMessage; [myLabel setTextColor:[UIColor whiteColor]]; [myLabel setNumberOfLines:0]; [_notifView setAlpha:0.95]; //The Icon [_notifView addSubview:imageView]; //The Text [_notifView addSubview:myLabel]; //The View [self.window addSubview:_notifView]; UITapGestureRecognizer *tapToDismissNotif = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissNotifFromScreen)]; tapToDismissNotif.numberOfTapsRequired = 1; tapToDismissNotif.numberOfTouchesRequired = 1; [_notifView addGestureRecognizer:tapToDismissNotif]; [UIView animateWithDuration:1.0 delay:.1 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{ [_notifView setFrame:CGRectMake(0, 0, self.window.frame.size.width, 60)]; } completion:^(BOOL finished) { }]; //Remove from top view after 5 seconds [self performSelector:@selector(dismissNotifFromScreen) withObject:nil afterDelay:5.0]; return; } //If the user touches the view or to remove from view after 5 seconds - (void)dismissNotifFromScreen{ [UIView animateWithDuration:1.0 delay:.1 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{ [_notifView setFrame:CGRectMake(0, -70, self.window.frame.size.width, 60)]; } completion:^(BOOL finished) { }]; } 

Voici le code pour recevoir la notification push lorsque l'application est au premier plan ou en phase ouverte, iOS 10 & Swift 2.3

 @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

La méthode userNotificationCenter(_:willPresent:withCompletionHandler:) n'est appelée que si vous ajoutez à la charge utile l'atsortingbut content-available:1 . La charge utile finale devrait être quelque chose comme:

 { "aps":{ "alert":"Testing.. (7)", "badge":1,"sound":"default" }, "content-available":1 } 

MODIFIER:

Les alertes de premier plan sont maintenant possibles dans iOS 10! S'il vous plaît voir cette réponse .

Pour iOS 9 et ci-dessous:

Il ne semble pas possible d'afficher l'alerte de notification stock iOS lorsque votre application est ouverte et au premier plan. Messages.app doit utiliser une API privée.

Le système n'affiche aucune alerte, n'inscrit pas l'icône de l'application ou ne joue aucun son lorsque l'application est déjà en première position. – Doc UILocalNotification

Les methods UIApplicationDelegate seront toujours appelées, permettant à votre application de répondre à la notification locale ou distante:

 application:didReceiveLocalNotification: application:didReceiveRemoteNotification: 

Toutefois, l'interface user de la bannière d'alerte de notification iOS stock ne s'affichera pas dans le file Messages.app d'Apple, qui doit utiliser une API privée.

Le mieux que vous puissiez faire est de lancer votre propre bannière d'alerte ou d'utiliser un framework existant:

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // Use a 3rd party toast alert framework to display a banner [self toastAlertFromGithub] } 

J'ai ouvert un radar pour ce comportement ici: rdar: // 22313177

 UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; content.body = body; content.userInfo = userInfo; content.sound = [UNNotificationSound defaultSound]; [content setValue:@(YES) forKeyPath:@"shouldAlwaysAlertWhileAppIsForeground"]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"Notif" content:content sortinggger:nil]; [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { DLog(@"Error:%@", error); }]; 

Je peux afficher une notification push lorsque l'application est active pour iOS 10.

  1. La notification push du server doit être silencieuse .

  2. Lorsque vous recevez une notification à distance du server, vous envoyez une notification locale et définissez la valeur de keyPath: shouldAlwaysAlertWhileAppIsForeground = True

Vous pouvez gérer la notification vous-même et afficher une alerte personnalisée. Les applications telles que Viber, Whatsapp et BisPhone utilisent cette approche.

Un exemple d'alerte personnalisée de tierce partie est CRToast .

Essayez de planifier une notification locale pendant que votre application est au premier plan et vous verrez qu'aucune alerte stock iOS n'est affichée:

 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]; } 

Swift 3 version

Ceci affiche une alerte lorsque l'application est au premier plan.

 if #available(iOS 10.0, *) { // need to setup the global notification delegate somewhere when your app starts // UNUserNotificationCenter.current().delegate = applicationDelegate // to show a message // let content = UNMutableNotificationContent() content.body = "MESSAGE" let request = UNNotificationRequest(identifier: "fred", content: content, sortinggger: nil) UNUserNotificationCenter.current().add(request) { error in // called when message has been sent debugPrint("Error: \(error)") } } 

ApplicationDelegate de UNUserNotificationCenterDelegate

 @available(iOS 10.0, *) public func userNotificationCenter(_ center : UNUserNotificationCenter, willPresent notification : UNNotification, withCompletionHandler completionHandler : @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert]) // only-always show the alert } 

Pour montrer la notification locale c'est la meilleure option. besoin de less de code pour écrire "BRYXBanner" https://cocoapods.org/pods/BRYXBanner

 let banner = Banner(title: "title", subtitle: "subtitle", image: UIImage(named: "addContact"), backgroundColor: UIColor(red:137.0/255.0, green:172.0/255.0, blue:2.0/255.0, alpha:1.000)) banner.dismissesOnTap = true banner.show(duration: 1.0)