web-dev-qa-db-fra.com

Obtenir une notification Push lorsque l'application est au premier plan sur iOS

J'utilise le service de notification Push dans mon application. Lorsque l'application est en arrière-plan, je peux voir la notification sur l'écran de notification (écran affiché lorsque nous glissons depuis le haut du périphérique iOS). Mais si application est au premier plan, la méthode déléguée

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

est appelé mais la notification ne s'affiche pas dans l'écran de notification.

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

166
Ab'initio

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

  • Vérifier si l'application est dans l'état actif lors de la réception d'une télécommande
    notification. S'il est actif, déclenchez une notification 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];
    }
    

Rapide:

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

Pour afficher le message de bannière lorsque l'application est au premier plan, utilisez la méthode suivante.

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.:

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

Vous devez également enregistrer votre délégué d'application en tant que délégué du centre de notifications:

import UserNotifications

// snip!

class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate

// snip!

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      // set the delegate in didFinishLaunchingWithOptions
      UNUserNotificationCenter.current().delegate = self
      ...
   }
165
chengsam

Le code ci-dessous sera un 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:[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];          
    }    
}
53
Mahesh P

Pour ceux qui sont intéressés, j'ai fini par créer une vue personnalisée qui ressemble à la bannière système en haut, mais qui ajoute un bouton de fermeture (petit X bleu) et une option permettant de toucher le message pour une action personnalisée. Il prend également en charge le cas de plusieurs notifications arrivées avant que l'utilisateur ait eu le temps de lire/de rejeter les anciennes (sans limite du nombre de piles pouvant être accumulées ...)

Lien vers GitHub: AGPushNote

L'utilisation est fondamentalement sur ligne:

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

Et cela ressemble à ceci sur iOS7 (iOS6 a une apparence et une sensation iOS6 ...)

enter image description here

38
Aviel Gross

Objectif C

enter image description here

Pour iOS 10 nous avons besoin d'intégrer la méthode willPresentNotification pour afficher la bannière de notification dans foreground.

Si application en mode avant-plan (actif)

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

Si l'application est exécutée au premier plan, iOS n'affichera pas de bannière/alerte de notification. C'est par conception. Vous devez écrire du code pour traiter de la situation dans laquelle votre application 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, ajouter un numéro de badge à une icône UITabBar, simuler une bannière du Centre de notifications, etc.).

13
Daniel Martín

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

Une solution consiste à créer un affichage personnalisé qui ressemble à la bannière et qui peut animer les contacts et y répondre. Dans cet esprit, vous pouvez créer des bannières encore meilleures avec encore plus de fonctionnalités.

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

Voici un couple que j'ai utilisé:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages

9
marshy101

Voici le code pour recevoir les notifications Push lorsque l'application est à l'état actif (au premier plan ou ouverte). documentation UNUserNotificationCenter

@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

8

Selon Apple documentation , Oui, vous pouvez afficher une notification lorsque l'application est en cours d'exécution enter image description here

7
SPatel

Xcode 10 Swift 4.2

Pour afficher la notification push lorsque votre application est au premier plan -

Étape 1: ajouter un délégué UNUserNotificationCenterDelegate dans la classe AppDelegate.

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

Étape 2: Définir le délégué UNUserNotificationCenter

let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.delegate = self

Étape 3: Cette étape permettra à votre application d'afficher une notification push, même lorsque votre application est au premier plan.

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

    }

Étape 4: Cette étape est facultatif. Vérifiez si votre application est au premier plan et si elle est au premier plan, puis affichez la notification locale.

func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler:@escaping (UIBackgroundFetchResult) -> Void) {

        let state : UIApplicationState = application.applicationState
        if (state == .inactive || state == .background) {
            // go to screen relevant to Notification content
            print("background")
        } else {
            // App is in UIApplicationStateActive (running in foreground)
            print("foreground")
            showLocalNotification()
        }
    }

Fonction de notification locale -

fileprivate func showLocalNotification() {

        //creating the notification content
        let content = UNMutableNotificationContent()

        //adding title, subtitle, body and badge
        content.title = "App Update"
        //content.subtitle = "local notification"
        content.body = "New version of app update is available."
        //content.badge = 1
        content.sound = UNNotificationSound.default()

        //getting the notification trigger
        //it will be called after 5 seconds
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)

        //getting the notification request
        let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)

        //adding the notification to notification center
        notificationCenter.add(request, withCompletionHandler: nil)
    }
3
Prashant Gaikwad

Dans votre application, utilisez le code ci-dessous.

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])
    }
}
2
Varun Naharia

L'ajout de cette ligne de complétion à 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])
} 
2
Furkan S. Dağ

Comme mentionné ci-dessus, vous devez utiliser UserNotification.framework pour y parvenir. Mais pour mes besoins, je dois quand même le montrer dans l'application et je voulais avoir le style iOS 11, alors j'ai créé une petite vue d'aide, ce serait peut-être utile pour quelqu'un.

Vue Notification Notification GitHub iOS 11 .

0
Orest Savchak